누군가가 명령줄에서 파이프 개념을 배우도록 돕고 있다면 어떤 예를 사용하시겠습니까? 실제 예시는 다음과 같습니다.
cat whatever.txt | less
단계가 하나뿐이기 때문에 이것이 가장 좋은 예가 아닌 것 같습니다. 좋지만 기본적인 용도는 무엇입니까 |
?
이상적으로, 제가 보여줄 예제에서는 출력 자체가 있는 프로그램을 사용하며, 독립적으로 실행된 다음 함께 파이프될 수 있습니다.
답변1
실제 시나리오를 기반으로 좀 더 복잡한 예를 살펴보겠습니다.
질문
conky
데스크탑에서 명령이 응답하지 않고 수동으로 종료하고 싶다고 가정해 보겠습니다 . 저는 Unix에 대해 조금 알고 있으므로 명령을 실행하는 것이 무엇인지 알고 있습니다 kill <PID>
. PID를 검색하려면 Unix 배포판에서 제공하는 도구를 사용할 수 있습니다 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
참고: 한 번의 통화로 2단계와 3단계를 수행하는 방법을 알고 싶습니다 grep
.
4-awk '{print $2}'
이제 대상 프로세스를 격리했습니다. PID를 검색하고 싶습니다. 즉, 출력의 두 번째 단어를 검색하고 싶습니다. 운 좋게도 대부분의 최신 unice는 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
. 임무 완료.
마지막 말
사용 중인 UNIX 버전에 따라 일부 프로그램이 약간 다르게 작동할 수 있습니다(예: ps
PID가 $3 열에 출력될 수 있음). 뭔가 잘못되었거나 다른 경우 공급업체의 설명서(또는 페이지 man
)를 읽어보세요. 또한, 긴 파이프는 위험할 수 있으니 주의하세요. 특히나 kill
같은 명령을 사용할 때는 어떤 가정도 하지 마세요 rm
. 예를 들어 "conky"(또는 "Aconkyous")라는 이름의 다른 사용자가 있는 경우 내 명령은 해당 사용자의 실행 중인 프로세스도 모두 종료할 수 있습니다.
특히 긴 파이프의 경우 조심하세요. 가정하고 나중에 후회하는 것보다 여기에서 했던 것처럼 대화식으로 구축하는 것이 항상 더 좋습니다.
답변2
내가 가장 좋아하는 것은 이것입니다:
youtube-dl $1 -q -o - | ffmpeg -i - $2
전달된 특정 YouTube URL에서 비디오를 다운로드하여 $1
지정된 파일로 출력합니다 $2
. 이 파일이 -q
STDOUT으로 조용히 출력되고 -o -
, ffmpeg로 파이프되어 입력으로 사용되는 방식에 유의하세요 -i -
.
특히 Linux 초보자의 경우 이는 명령줄이 유용하고 GUI 도구를 사용하는 것보다 작업을 더 쉽게 만드는 이유에 대한 실제적인 예가 될 수 있습니다. YouTube에서 비디오를 다운로드하고 해당 사운드를 mp3로 변환하는 데 시간이 얼마나 걸릴지 잘 모르겠습니다. 위의 줄은 몇 초 안에 이 작업을 수행할 수 있습니다.
답변3
일반적인 사용(읽기: 내가 주로 사용하는 방법)은 어떤 이유로든 다양한 처리 작업을 수행하기 위해 여러 도구를 통해 일부 데이터를 실행해야 하는 경우입니다.
그래서 나는 말하고 싶다이것파이프를 사용하면 여러 빌딩 블록(다른 UNIX 도구)을 함께 조립하는 접착제 역할을 합니다. Ulrich가 말했듯이, sort
그리고 uniq
는 일반적인 스탠자입니다.
청중에 따라 파이프 사용을 강조하고 싶다면 다음과 같이 시작할 수 있습니다. "이 강의 계획서에는 논문과 유인물이 포함된 몇 가지 흥미로운 PDF에 대한 링크가 있지만 그 중 일부는 중복되어 있습니다. " 어떻게든 자동화할까요?" "
그런 다음 링크 목록 을 가져오는 방법 , lynx --dump --listonly
하는 방법을필터링를grep
링크끝나는Be Gentle on the server로 보여줄 수 있습니다..pdf
colrm
sed
lynx
sort
uniq
wget -i -
--wait
유감스럽게도 이것은 복잡한 예입니다. 반면에 파이프를 연결하고 셸에서 모든 파이프를 동시에 실행하도록 하면 파이프의 강력한 기능을 보여주는 데 도움이 될 수 있습니다.
답변4
이게 제일 먼저 떠오르네요...
mysqldump
데이터, 스키마, 선택적 프로시저 및 기능을 표준 출력으로 보내는 콘솔 애플리케이션입니다. 일반적으로 백업을 위해 파일로 리디렉션됩니다.
mysqldump <options> > mydb.dump
그러면 압축되지 않은 SQL 스크립트가 제공됩니다. 공간을 절약하려면 bzip2를 사용하여 압축할 수 있습니다.
bzip2 mydb.dump
또는 한 단계로 두 가지를 모두 수행할 수도 있습니다.
mysqldump <options> | bzip2 > mydb.dump.bz2
위의 예에서 stdout from은 mysqldump
bzip2로 파이프된 다음 bzip2의 출력이 파일로 리디렉션됩니다.