함께 명령을 파이핑하는 좋은 예는 무엇입니까? 같습니다. cat whatever.txt | less 나는 그것이 최선의 예가

명령 행에서 파이프의 개념을 배우도록 누군가를 돕는 경우 어떤 예를 사용 하시겠습니까? 실제로 나온 예는 다음과 같습니다.

cat whatever.txt | less

나는 그것이 최선의 예가 아니라고 느낍니다. 즉 한 걸음 만 있기 때문입니다. 좋은 것이지만 기본적으로 사용하는 것은 |무엇입니까?

이상적으로 제시 할 예제는 독립적으로 실행되고 파이프로 표시 될 수있는 출력 자체가있는 프로그램을 사용합니다.



답변

실제 시나리오를 기반으로 다소 복잡한 예를 안내합니다.

문제

conky데스크탑 에서 명령 이 응답하지 않고 수동으로 종료하고 싶다고 가정 해 봅시다 . 나는 약간의 유닉스를 알고 있으므로 내가해야 할 일은 명령을 실행하는 것임을 알고 kill <PID>있습니다. PID를 검색하기 위해, 나는 사용 ps하거나 top또는 내 유닉스 분포 내게 주신 어떤 도구입니다. 그러나 하나의 명령으로 어떻게 이것을 할 수 있습니까?

대답

$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill

면책 조항 :이 명령은 특정 경우에만 작동합니다. 터미널에 복사하거나 붙여 넣지 말고 사용을 시작하십시오. 오히려 그것을 구축하는 방법을 배우 십시오 .

작동 원리

1- ps aux

이 명령은 실행중인 프로세스 목록과 이에 대한 일부 정보를 출력합니다. 흥미로운 정보는 두 번째 열에 각 프로세스의 PID를 출력한다는 것입니다. 내 상자의 명령 출력에서 ​​추출한 내용은 다음과 같습니다.

$ ps aux
 rahmu     1925  0.0  0.1 129328  6112 ?        S    11:55   0:06 tint2
 rahmu     1931  0.0  0.3 154992 12108 ?        S    11:55   0:00 volumeicon
 rahmu     1933  0.1  0.2 134716  9460 ?        S    11:55   0:24 parcellite
 rahmu     1940  0.0  0.0  30416  3008 ?        S    11:55   0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
 rahmu     1941  0.0  0.2 160336  8928 ?        Ss   11:55   0:00 xfce4-power-manager
 rahmu     1943  0.0  0.0  32792  1964 ?        S    11:55   0:00 /usr/lib/xfconf/xfconfd
 rahmu     1945  0.0  0.0  17584  1292 ?        S    11:55   0:00 /usr/lib/gamin/gam_server
 rahmu     1946  0.0  0.5 203016 19552 ?        S    11:55   0:00 python /usr/bin/system-config-printer-applet
 rahmu     1947  0.0  0.3 171840 12872 ?        S    11:55   0:00 nm-applet --sm-disable
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:38 conky -q

2- grep conky

하나의 프로세스에만 관심이 있으므로 grep프로그램에 해당하는 항목을 찾는 데 사용 합니다 conky.

$ ps aux | grep conky
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:39 conky -q
 rahmu     3233  0.0  0.0   7592   840 pts/1    S+   16:55   0:00 grep conky

삼- grep -v grep

2 단계에서 볼 수 있듯이이 명령 psgrep conky프로세스를 목록으로 출력합니다 (결국 실행중인 프로세스 임). 필터링하기 위해 실행할 수 있습니다 grep -v grep. 이 옵션 -v은 패턴을 포함하는 grep라인을 제외한 모든 라인을 일치 시키도록 지시 합니다 .

$ ps aux | grep conky | grep -v grep
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:39 conky -q

NB : 한 번의 grep통화로 2 단계와 3 단계를 수행하는 방법을 알고 싶습니다 .

4- awk '{print $2}'

이제 목표 프로세스를 분리했습니다. PID를 검색하고 싶습니다. 즉, 출력의 두 번째 단어를 검색하고 싶습니다. 운 좋게도, 대부분의 (모두?) 현대식 유니 세서는 awk테이블 형식의 데이터로 놀라운 스크립트 언어 인 일부 버전을 제공 할 것 입니다. 우리의 임무는 다음과 같이 쉬워진다 print $2.

$ ps aux | grep conky | grep -v grep | awk '{print $2}'
 1948

5- xargs kill

PID가 있습니다. 필요한 것은에 전달하는 것 kill입니다. 이를 위해을 사용 xargs합니다.

xargs kill입력으로부터 판독한다 (파이프에서 우리의 경우), 폼 명령 이루어진 kill <items>( <items>는 어떤 입력으로부터 판독되는)를 생성하고 명령을 실행한다. 우리의 경우에는 실행 kill 1948됩니다. 임무 완수.

마지막 단어

사용중인 유닉스 버전에 따라 특정 프로그램이 약간 다르게 동작 할 수 있습니다 (예 : ps$ 3 열에 PID를 출력 할 수 있음). 무언가 잘못되었거나 다르게 보이면 공급 업체의 설명서 (또는 더 나은 man페이지)를 읽으십시오 . 긴 파이프는 위험 할 수 있으므로주의하십시오. 같은 명령을 사용할 때 특히 어떤 가정을하지 마십시오 killrm. 예를 들어, ‘conky'(또는 ‘Aconkyous’)라는 다른 사용자가 있으면 내 명령으로 실행중인 모든 프로세스도 종료 될 수 있습니다!

내가 말하는 것은 특히 긴 파이프에주의하십시오. 가정을하고 나중에 미안하다고 생각하는 것보다 여기에서 한 것처럼 대화식으로 작성하는 것이 좋습니다.


답변

내가 가장 좋아하는 것은 다음과 같습니다.

youtube-dl $1 -q -o - | ffmpeg -i - $2

전달 된 지정된 youtube URL에서 동영상을 다운로드하여 님이 제공 $1한 파일로 출력합니다 $2. 파일이 -qSTDOUT으로 자동 출력 -o -되고 ffmpeg로 파이프 된 후 파일 로 입력으로 사용되는 방법에 유의하십시오 -i -.

특히 리눅스 초보자에게는 이것이 명령 줄이 유용하고 GUI 도구를 사용하는 것보다 작업을 더 쉽게 할 수있는 실용적인 예일 수 있습니다. YouTube에서 비디오를 다운로드하고 사운드를 mp3로 변환하는 데 시간이 얼마나 걸리는지 잘 모르겠습니다. 위의 줄은 몇 초 안에 그렇게 할 수 있습니다.


답변

일반적인 용도 (읽기 : 대부분의 시간을 사용하는 방식)는 어떤 이유로 여러 가지 작업을 수행하기 위해 여러 도구를 통해 일부 데이터를 실행해야 할 때입니다.

따라서 파이프를 사용하는 것은 여러 빌딩 블록 (다른 UNIX 도구)을 함께 모으기위한 접착제 라고 수 있습니다. 마찬가지로 울리히는 말했다, sort그리고 uniq공통의 절입니다.

관객에 따라 파이프의 사용법을 강조하고 싶다면, 예를 들어 다음과 같이 시작할 수 있습니다. 어떻게 든 이것을 자동화합니까? “

그럼 당신은 어떻게 보여줄 수 lynx --dump --listonly방법, 링크의 목록을 가져옵니다 grep끝나는 링크를 필터링 할 수있는 .pdf방법 colrm또는 sed숫자의 제거 얻을 수있는 lynx방법 각각의 URL, 왼쪽 씁니다 sortuniq마지막 방법 중복 제거 및 얻을 수 wget -i -를 검색하는 데 사용할 수 있습니다 파일 ( --wait물론 서버에서 부드럽게 사용 ).

나는 이것이 복잡한 예라고 두려워한다. 반면에 파이프 만 배관하면 쉘이 동시에 작동 할 때 파이프의 힘을 보여주는 데 도움이 될 수 있습니다.


답변

나는 좋은 것에 대해 정확히 알지 못하지만 파이핑 스루 grep는 가장 일반적인 용도 중 하나 여야합니다 wc -l. (예, grep알려진 -c스위치 가 거의 없습니다 .)

입력을 정렬해야 | sort | uniq하기 때문에 다른 일반적인 스탠자는입니다 uniq.


답변

이 예제에는 필요하지 않지만 다음을 수행하십시오.

$ ps aux | grep -v grep | grep conky

… 그렙 순서를 반대로 바꾸면 채색이 유지되지만 효율성은 떨어집니다. 아마도 큰 목록에서는 색상이 중요하지 않습니다.

또한이 웹 페이지는 다음을 제안합니다.

https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep

Johnsyweb가 2 월 21 일 12시 10 분 31 초에
> 일반적인 요령은 다음과 같습니다.
> ps aux | grep '[t] erminal'
> 이것은 grep '[t] erminal'이 아닌 터미널을 포함하는 라인과 일치합니다!
> 또한 많은 유닉스 맛에서 작동합니다.

… 단일 문자 (예 : 프로세스 ‘X’)를 찾으려면 작동하지 않습니다.


답변

나는 약 1 년 반 전에 내가 만든 oneliner의 혼란을 마침내 공유하게된다 …

while read in; do host "$in"; done < sites.txt | grep -iv "GOOGLE" | grep -E '1\.2\.3\.4|5\.6\.7\.8' | sed -e 's/has\ address\ 216.70.91.72//' | sed -e 's/has\ address\ 94.23.33.92//' | while read sites; do curl -sL -w "%{http_code} %{url_effective}\\n" "$sites" -o /dev/null; done | grep -ivE '4.*|5.*' | sed -e 's/200//' | sed -e 's/HTTP/http/'

그것…

  1. sites.txt를 읽습니다.
  2. 각각에 “호스트”를 실행합니다.
  3. “GOOGLE”이 포함 된 행을 제거합니다. mx 레코드입니다.
  4. 두 개의 IP 중 하나가있는 회선을 가져옵니다.
  5. 목록의 각 사이트에서 http 상태 코드를 가져옵니다.
  6. 4xx 또는 5xx를 반환하는 사이트를 제거합니다.
  7. 해당 사이트를 반환 한 사이트에서 “200”을 제거합니다.
  8. “HTTP”를 “http”로 대체합니다. 순수한 이유는 없습니다.

이것은 단일 Python 스크립트로 훨씬 더 잘 수행 할 수 있었을 것입니다.


답변

이것은 나를 위해 떠 올린 첫 번째 것입니다 …

mysqldump데이터, 스키마 및 선택적으로 프로 시저 및 함수를 stdout으로 보내는 콘솔 응용 프로그램입니다. 일반적으로 백업을 위해 파일로 리디렉션됩니다.

mysqldump <options> > mydb.dump

압축되지 않은 SQL 스크립트가 제공됩니다. 공간을 절약하기 위해 bzip2로 압축 할 수 있습니다.

bzip2 mydb.dump

또는 한 번에 두 가지를 모두 수행 할 수 있습니다.

mysqldump <options> | bzip2 > mydb.dump.bz2

위의이 예에서 stdout from mysqldump은 bzip2로 파이프되고 출력은 파일로 경로 재 지정됩니다.