Linux 파이프를 사용하여 명령줄 유틸리티가 협업하는 방식을 구성합니다. 독립 실행형 명령 모음을 활용하고 단일 팀으로 전환하여 복잡한 프로세스를 단순화하고 생산성을 높이십시오. 우리는 방법을 보여줍니다.
목차
파이프는 어디에나 있다
파이프는 Linux 및 Unix 계열 운영 체제에 있는 가장 유용한 명령줄 기능 중 하나입니다. 파이프는 셀 수 없이 많이 사용됩니다. 우리뿐만 아니라 모든 웹 사이트에서 Linux 명령줄 기사를 보면 파이프가 더 자주 등장한다는 것을 알 수 있습니다. How-To Geek의 Linux 기사 중 일부를 검토했으며 모든 기사에서 파이프가 어떤 식으로든 사용되었습니다.
Linux 파이프를 사용하면 기본적으로 지원되지 않는 작업을 수행할 수 있습니다. 껍데기. 그러나 Linux 설계 철학은 자신의 기능을 수행하는 많은 작은 유틸리티를 갖는 것이기 때문에 전용 기능 아주 잘, 그리고 불필요한 기능(“한 일만 하고 잘 하라”) 없이 명령 문자열을 파이프와 연결하여 한 명령의 출력이 다른 명령의 입력이 되도록 할 수 있습니다. 입력한 각 명령은 고유한 재능을 팀에 제공하고 곧 승리하는 분대를 구성했음을 알게 됩니다.
간단한 예
다양한 유형의 파일로 가득 찬 디렉토리가 있다고 가정합니다. 해당 디렉토리에 특정 유형의 파일이 몇 개 있는지 알고 싶습니다. 이 작업을 수행하는 다른 방법이 있지만 이 연습의 목적은 파이프를 소개하는 것이므로 파이프를 사용하여 수행하겠습니다.
ls를 사용하여 파일 목록을 쉽게 얻을 수 있습니다.
ls
관심 있는 파일 유형을 구분하기 위해 grep을 사용합니다. 파일 이름이나 파일 확장자에 “page”라는 단어가 있는 파일을 찾고 싶습니다.
쉘 특수 문자 “|”를 사용합니다. ls의 출력을 grep으로 파이프합니다.
ls | grep "page"
grep은 다음 행을 인쇄합니다. 검색 패턴과 일치. 따라서 이것은 “.page” 파일만 포함하는 목록을 제공합니다.
이 사소한 예에서도 파이프의 기능을 보여줍니다. ls의 출력이 터미널 창으로 보내지지 않았습니다. grep 명령이 사용할 데이터로 grep에 전송되었습니다. 우리가 보는 출력은 이 체인의 마지막 명령인 grep에서 나옵니다.
우리의 사슬을 확장
파이프된 명령 체인을 확장해 보겠습니다. 우리는 할 수 있습니다 “.page” 파일 계산 wc 명령을 추가하여. wc와 함께 -l(줄 수) 옵션을 사용합니다. ls 에 -l(긴 형식) 옵션도 추가했습니다. 우리는 이것을 곧 사용할 것입니다.
ls - | grep "page" | wc -l
grep은 더 이상 체인의 마지막 명령이 아니므로 출력이 표시되지 않습니다. grep의 출력은 wc 명령에 입력됩니다. 터미널 창에 표시되는 출력은 wc의 것입니다. wc는 디렉토리에 69개의 “.page” 파일이 있다고 보고합니다.
다시 확장해 보겠습니다. 명령줄에서 wc 명령을 제거하고 awk로 교체합니다. -l(긴 형식) 옵션이 있는 ls의 출력에는 9개의 열이 있습니다. 우리는 awk를 사용하여 열 인쇄 다섯, 세, 아홉. 파일의 크기, 소유자 및 이름입니다.
ls -l | grep "page" | awk '{print $5 " " $3 " " $9}'
일치하는 각 파일에 대해 해당 열의 목록을 얻습니다.
이제 정렬 명령을 통해 해당 출력을 전달할 것입니다. -n(숫자) 옵션을 사용하여 첫 번째 열이 다음과 같아야 함을 정렬에 알립니다. 숫자로 취급.
ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n
이제 출력이 파일 크기 순서로 정렬되며 3개의 열을 사용자 정의하여 선택합니다.
다른 명령 추가
tail 명령을 추가하여 마무리하겠습니다. 우리는 그것을 나열하도록 말할 것입니다 출력의 마지막 5줄 오직.
ls -l | grep "page" | awk '{print $5 " " $3 " " $9}' | sort -n | tail -5
이것은 우리 명령이 “이 디렉토리에서 가장 큰 5개의 “.page” 파일을 크기순으로 표시합니다.”와 같은 것으로 해석된다는 것을 의미합니다. 물론 이를 수행하는 명령은 없지만 파이프를 사용하여 자체적으로 만들었습니다. 모든 타이핑을 저장하기 위해 이것을 별칭이나 쉘 함수로 추가하거나 다른 긴 명령을 추가할 수 있습니다.
출력은 다음과 같습니다.
정렬 명령에 -r(역방향) 옵션을 추가하고 꼬리 대신 머리를 사용하여 줄을 선택하여 크기 순서를 바꿀 수 있습니다. 출력 상단에서.
이번에는 5개의 가장 큰 “.page” 파일이 가장 큰 것에서 가장 작은 것 순으로 나열됩니다.
최근 사례
다음은 최근 How-To 괴짜 기사의 두 가지 흥미로운 예입니다.
xargscommand와 같은 일부 명령은 다음과 같이 설계되었습니다. 그들에게 입력 파이프를 갖기 위해. 다음은 화장실 수를 계산하는 방법입니다. 단어, 문자 및 라인 여러 파일에서 ls를 xargs로 파이핑한 다음 파일 이름 목록을 wc에 명령줄 매개변수로 전달된 것처럼 공급합니다.
ls *.page | xargs wc
단어, 문자, 행의 총 개수는 터미널 창 하단에 나열됩니다.
다음은 각 유형의 개수와 함께 현재 디렉토리에 있는 고유한 파일 확장자의 정렬된 목록을 가져오는 방법입니다.
ls | rev | cut -d'.' -f1 | rev | sort | uniq -c
많은 일이 일어나고 있습니다.
ls: 디렉토리에 있는 파일을 나열합니다.
신부님: 텍스트를 뒤집습니다. 파일 이름에서.
자르다: 끈을 자른다 지정된 구분 기호 “.”가 처음 나타날 때. 이 이후의 텍스트는 삭제됩니다.
rev: 파일 이름 확장명인 나머지 텍스트를 반대로 합니다.
sort: 목록을 알파벳순으로 정렬합니다.
uniq: 각각의 수를 셉니다. 목록의 고유 항목.
출력은 파일 확장자 목록을 각 고유 유형의 개수와 함께 알파벳순으로 정렬하여 표시합니다.
명명된 파이프
명명된 파이프라는 또 다른 유형의 파이프를 사용할 수 있습니다. 이전 예의 파이프는 명령줄을 처리할 때 쉘에 의해 즉석에서 생성됩니다. 파이프가 생성되고 사용된 다음 폐기됩니다. 그들은 일시적이며 자신의 흔적을 남기지 않습니다. 그것들을 사용하는 명령이 실행되는 동안에만 존재합니다.
명명된 파이프는 파일 시스템에서 영구 객체로 나타나므로 ls를 사용하여 볼 수 있습니다. 그 당시 읽지 않은 데이터는 삭제되지만 컴퓨터를 재부팅해도 살아남기 때문에 영구적입니다.
Named Pipe는 서로 다른 프로세스가 데이터를 주고받을 수 있도록 한 번에 많이 사용되었지만 오랫동안 그렇게 사용되는 것을 보지 못했습니다. 의심의 여지 없이 아직도 그것들을 큰 효과로 사용하는 사람들이 있지만, 나는 최근에 그런 사람을 만난 적이 없습니다. 그러나 완전성을 위해 또는 단순히 귀하의 호기심을 만족시키기 위해 다음과 같이 사용할 수 있습니다.
명명된 파이프는 mkfifo 명령으로 생성됩니다. 이 명령 명명된 파이프를 생성합니다. 현재 디렉토리에서 “geek-pipe”라고 합니다.
mkfifo geek-pipe
ls 명령을 -l(긴 형식) 옵션과 함께 사용하면 명명된 파이프의 세부 정보를 볼 수 있습니다.
ls -l geek-pipe
목록의 첫 번째 문자는 파이프를 의미하는 “p”입니다. “d”이면 파일 시스템 개체가 디렉토리임을 의미하고 대시 “-“는 일반 파일임을 의미합니다.
명명된 파이프 사용
파이프를 사용합시다. 이전 예제에서 사용한 이름 없는 파이프는 보내는 명령에서 받는 명령으로 즉시 데이터를 전달했습니다. 명명된 파이프를 통해 전송된 데이터는 읽을 때까지 파이프에 남아 있습니다. 데이터는 실제로 메모리에 보관되므로 명명된 파이프의 크기는 데이터가 있든 없든 ls 목록에서 변경되지 않습니다.
이 예제에서는 두 개의 터미널 창을 사용할 것입니다. 레이블을 사용하겠습니다.
# Terminal-1
하나의 터미널 창에서
# Terminal-2
다른 하나에서, 그래서 당신은 그들 사이를 구별할 수 있습니다. 해시 “#”은 쉘에 뒤에 오는 것이 주석임을 알리고 무시합니다.
이전 예제 전체를 가져와서 명명된 파이프로 리디렉션해 보겠습니다. 따라서 하나의 명령에서 명명되지 않은 파이프와 명명된 파이프를 모두 사용하고 있습니다.
ls | rev | cut -d'.' -f1 | rev | sort | uniq -c > geek-pipe
명명된 파이프의 내용을 cat으로 리디렉션하여 cat이 두 번째 터미널 창에 해당 내용을 표시하도록 합니다. 출력은 다음과 같습니다.
그리고 첫 번째 터미널 창에서 명령 프롬프트로 돌아간 것을 볼 수 있습니다.
방금 일어난 일입니다.
일부 출력을 명명된 파이프로 리디렉션했습니다.
첫 번째 터미널 창이 명령 프롬프트로 돌아가지 않았습니다.
데이터는 두 번째 터미널의 파이프에서 읽을 때까지 파이프에 남아 있었습니다.
첫 번째 터미널 창에서 명령 프롬프트로 돌아갔습니다.
명령 끝에 &를 추가하여 첫 번째 터미널 창에서 백그라운드 작업으로 명령을 실행할 수 있다고 생각할 수 있습니다. 그리고 당신이 옳았을 것입니다. 이 경우 즉시 명령 프롬프트로 돌아갔을 것입니다.
백그라운드 처리를 사용하지 않는 이유는 명명된 파이프가 차단 프로세스임을 강조하기 위함이었습니다. 명명된 파이프에 무언가를 넣으면 파이프의 한쪽 끝만 열립니다. 읽기 프로그램이 데이터를 추출할 때까지 다른 쪽 끝은 열리지 않습니다. 커널은 파이프의 다른 쪽 끝에서 데이터를 읽을 때까지 첫 번째 터미널 창에서 프로세스를 일시 중단합니다.
파이프의 힘
오늘날 명명된 파이프는 참신한 행위입니다.
반면에 평범한 오래된 Linux 파이프는 터미널 창 도구 키트에서 사용할 수 있는 가장 유용한 도구 중 하나입니다. Linux 명령줄이 활성화되기 시작하고 하나의 응집력 있는 성능을 생성하기 위해 명령 모음을 오케스트레이션할 수 있을 때 완전히 새로운 전원이 켜집니다.
이별 힌트: 한 번에 하나의 명령을 추가하고 해당 부분이 작동하도록 하고 다음 명령을 파이핑하여 파이프된 명령을 작성하는 것이 가장 좋습니다.