명령 행에서 파이프의 개념을 배우도록 누군가를 돕는 경우 어떤 예를 사용 하시겠습니까? 실제로 나온 예는 다음과 같습니다.
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 단계에서 볼 수 있듯이이 명령 ps
은 grep 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
페이지)를 읽으십시오 . 긴 파이프는 위험 할 수 있으므로주의하십시오. 같은 명령을 사용할 때 특히 어떤 가정을하지 마십시오 kill
나 rm
. 예를 들어, ‘conky'(또는 ‘Aconkyous’)라는 다른 사용자가 있으면 내 명령으로 실행중인 모든 프로세스도 종료 될 수 있습니다!
내가 말하는 것은 특히 긴 파이프에주의하십시오. 가정을하고 나중에 미안하다고 생각하는 것보다 여기에서 한 것처럼 대화식으로 작성하는 것이 좋습니다.
답변
내가 가장 좋아하는 것은 다음과 같습니다.
youtube-dl $1 -q -o - | ffmpeg -i - $2
전달 된 지정된 youtube URL에서 동영상을 다운로드하여 님이 제공 $1
한 파일로 출력합니다 $2
. 파일이 -q
STDOUT으로 자동 출력 -o -
되고 ffmpeg로 파이프 된 후 파일 로 입력으로 사용되는 방법에 유의하십시오 -i -
.
특히 리눅스 초보자에게는 이것이 명령 줄이 유용하고 GUI 도구를 사용하는 것보다 작업을 더 쉽게 할 수있는 실용적인 예일 수 있습니다. YouTube에서 비디오를 다운로드하고 사운드를 mp3로 변환하는 데 시간이 얼마나 걸리는지 잘 모르겠습니다. 위의 줄은 몇 초 안에 그렇게 할 수 있습니다.
답변
일반적인 용도 (읽기 : 대부분의 시간을 사용하는 방식)는 어떤 이유로 여러 가지 작업을 수행하기 위해 여러 도구를 통해 일부 데이터를 실행해야 할 때입니다.
따라서 파이프를 사용하는 것은 여러 빌딩 블록 (다른 UNIX 도구)을 함께 모으기위한 접착제 라고 할 수 있습니다. 마찬가지로 울리히는 말했다, sort
그리고 uniq
공통의 절입니다.
관객에 따라 파이프의 사용법을 강조하고 싶다면, 예를 들어 다음과 같이 시작할 수 있습니다. 어떻게 든 이것을 자동화합니까? “
그럼 당신은 어떻게 보여줄 수 lynx --dump --listonly
방법, 링크의 목록을 가져옵니다 grep
끝나는 링크를 필터링 할 수있는 .pdf
방법 colrm
또는 sed
숫자의 제거 얻을 수있는 lynx
방법 각각의 URL, 왼쪽 씁니다 sort
과 uniq
마지막 방법 중복 제거 및 얻을 수 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/'
그것…
- sites.txt를 읽습니다.
- 각각에 “호스트”를 실행합니다.
- “GOOGLE”이 포함 된 행을 제거합니다. mx 레코드입니다.
- 두 개의 IP 중 하나가있는 회선을 가져옵니다.
- 목록의 각 사이트에서 http 상태 코드를 가져옵니다.
- 4xx 또는 5xx를 반환하는 사이트를 제거합니다.
- 해당 사이트를 반환 한 사이트에서 “200”을 제거합니다.
- “HTTP”를 “http”로 대체합니다. 순수한 이유는 없습니다.
이것은 단일 Python 스크립트로 훨씬 더 잘 수행 할 수 있었을 것입니다.
답변
이것은 나를 위해 떠 올린 첫 번째 것입니다 …
mysqldump
데이터, 스키마 및 선택적으로 프로 시저 및 함수를 stdout으로 보내는 콘솔 응용 프로그램입니다. 일반적으로 백업을 위해 파일로 리디렉션됩니다.
mysqldump <options> > mydb.dump
압축되지 않은 SQL 스크립트가 제공됩니다. 공간을 절약하기 위해 bzip2로 압축 할 수 있습니다.
bzip2 mydb.dump
또는 한 번에 두 가지를 모두 수행 할 수 있습니다.
mysqldump <options> | bzip2 > mydb.dump.bz2
위의이 예에서 stdout from mysqldump
은 bzip2로 파이프되고 출력은 파일로 경로 재 지정됩니다.