명령을 함께 결합하는 좋은 예는 무엇입니까?

명령을 함께 결합하는 좋은 예는 무엇입니까?

누군가가 명령줄에서 파이프 개념을 배우도록 돕고 있다면 어떤 예를 사용하시겠습니까? 실제 예시는 다음과 같습니다.

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 버전에 따라 일부 프로그램이 약간 다르게 작동할 수 있습니다(예: psPID가 $3 열에 출력될 수 있음). 뭔가 잘못되었거나 다른 경우 공급업체의 설명서(또는 페이지 man)를 읽어보세요. 또한, 긴 파이프는 위험할 수 있으니 주의하세요. 특히나 kill같은 명령을 사용할 때는 어떤 가정도 하지 마세요 rm. 예를 들어 "conky"(또는 "Aconkyous")라는 이름의 다른 사용자가 있는 경우 내 명령은 해당 사용자의 실행 중인 프로세스도 모두 종료할 수 있습니다.

특히 긴 파이프의 경우 조심하세요. 가정하고 나중에 후회하는 것보다 여기에서 했던 것처럼 대화식으로 구축하는 것이 항상 더 좋습니다.

답변2

내가 가장 좋아하는 것은 이것입니다:

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

전달된 특정 YouTube URL에서 비디오를 다운로드하여 $1지정된 파일로 출력합니다 $2. 이 파일이 -qSTDOUT으로 조용히 출력되고 -o -, ffmpeg로 파이프되어 입력으로 사용되는 방식에 유의하세요 -i -.

특히 Linux 초보자의 경우 이는 명령줄이 유용하고 GUI 도구를 사용하는 것보다 작업을 더 쉽게 만드는 이유에 대한 실제적인 예가 될 수 있습니다. YouTube에서 비디오를 다운로드하고 해당 사운드를 mp3로 변환하는 데 시간이 얼마나 걸릴지 잘 모르겠습니다. 위의 줄은 몇 초 안에 이 작업을 수행할 수 있습니다.

답변3

일반적인 사용(읽기: 내가 주로 사용하는 방법)은 어떤 이유로든 다양한 처리 작업을 수행하기 위해 여러 도구를 통해 일부 데이터를 실행해야 하는 경우입니다.

그래서 나는 말하고 싶다이것파이프를 사용하면 여러 빌딩 블록(다른 UNIX 도구)을 함께 조립하는 접착제 역할을 합니다. Ulrich가 말했듯이, sort그리고 uniq는 일반적인 스탠자입니다.

청중에 따라 파이프 사용을 강조하고 싶다면 다음과 같이 시작할 수 있습니다. "이 강의 계획서에는 논문과 유인물이 포함된 몇 가지 흥미로운 PDF에 대한 링크가 있지만 그 중 일부는 중복되어 있습니다. " 어떻게든 자동화할까요?" "

그런 다음 링크 목록 을 가져오는 방법 , lynx --dump --listonly하는 방법을필터링를grep링크끝나는Be Gentle on the server로 보여줄 수 있습니다..pdfcolrmsedlynxsortuniqwget -i ---wait

유감스럽게도 이것은 복잡한 예입니다. 반면에 파이프를 연결하고 셸에서 모든 파이프를 동시에 실행하도록 하면 파이프의 강력한 기능을 보여주는 데 도움이 될 수 있습니다.

답변4

이게 제일 먼저 떠오르네요...

mysqldump데이터, 스키마, 선택적 프로시저 및 기능을 표준 출력으로 보내는 콘솔 애플리케이션입니다. 일반적으로 백업을 위해 파일로 리디렉션됩니다.

mysqldump <options> > mydb.dump

그러면 압축되지 않은 SQL 스크립트가 제공됩니다. 공간을 절약하려면 bzip2를 사용하여 압축할 수 있습니다.

bzip2 mydb.dump

또는 한 단계로 두 가지를 모두 수행할 수도 있습니다.

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

위의 예에서 stdout from은 mysqldumpbzip2로 파이프된 다음 bzip2의 출력이 파일로 리디렉션됩니다.

관련 정보