OS

[Linux Command Line] Pipe, 파이프, 파이프라인

ride-dev 2024. 1. 2. 17:11

명령어의 인자를 입력하지 않고, 파일을 표준 입력으로 전달할 수 있습니다.

이러한 방식으로 여러 명령어를 동시에 조합할 수 있습니다.

Pipes 파이프

piping(파이핑)은 | 문자를 사용하여 파이프라인을 만드는 것을 의미합니다.

두 명령어를 연결하기 위해 | 를 이용하면,

한 명령어의 표준 출력을 두번째 명령어의 표준 입력으로 이어줄 수 있습니다.

(파이프를 이용하면, 명령어 하나의 출력을 저장하여 다른 명령어로 전달할 수 있습니다)

command1 | command2

 

 

ls | less 모든 출력을 파이프를 통해 less로 연결하기

ls -l /usr/bin | less

less로 연결하는 것은, 명령어의 결과가 너무 길고 복잡해서 읽기 어려울 때 유용합니다.

결과의 줄 수를 확인할 수도 있습니다.

> vs | 리다이렉션과 파이핑

둘 다 표준 스트림을 이용하고 상호작용하는 것은 동일합니다.

리다이렉션은

 > 등을 이용해 표준 출력을 특정 파일로 출력하게 됩니다.

파이핑은

두 명령어를 연결합니다.

두 명령어를 연결해서 앞에 있는 명령어의 출력을 뒤에 있는 명령어의 입력으로 전달합니다.

이 과정에는 파일이 필요하지 않습니다.

앞에 있는 명령어나, 뒤에 있는 명령어의 결과에 대해 파일이 필요할 수는 있습니다.

파이프 자체에는 > 를 이용해 표준 출력을 파일로 출력하는 리다이렉션과는 다르게 파일이 개입하지 않습니다.

 

파이핑은 명령어 간의 통신을 위해 사용되고,

리다이렉션은 명령어의 입출력을 파일로 전송하거나 파일로부터 읽기 위해 사용합니다.

파이프와 리다이렉션을 혼용할 수 있습니다.

tr

tr은 문자를 번역하거나 지우는 명령어로, 표준 입력을 번역하거나 줄이거나 지워서 표준 출력으로 사용하는 데 씁니다.

표준 입력으로 문자를 입력하고,  그 문자에 대응되는 문자를 번역하여 입력합니다.

예컨대 문장의 소문자들을 전부 대문자로 바꾸거나 $기호를 S로 바꿀 수 있습니다.

(정규 표현식을 사용할 수 있습니다)

-d 옵션을 통해 매개변수로 넣은 문자를 삭제할 수 있습니다.

아래는 표준스트림과 사용하는 예시입니다.

여러 파이프를 동시에 사용하기

왼쪽 -> 오른쪽 명령어로 진행됩니다.

세세히 분해해보자면,

cat headTail.txt의 결과로

위와 같은 내용이 출력되는데,

파이프를 통해 위 내용을 위쪽부터 10번째 줄까지 출력되게 합니다.

마지막으로 위 내용의 아래쪽 줄부터 한 줄을 출력합니다.

 

작업 디렉토리에 존재하는 파일을, 파일크기 순으로 3줄만 내림차순 정렬합니다.

ls -lh | sort -rhk 5 | head -3

ls: 작업 디렉토리에 존재하는 파일 정보를 출력합니다.

-l: 세부정보를 출력하는 옵션

-h: 단위를 보기 쉽게하는 옵션

sort: 입력으로 주어진 정보를 정렬합니다.

-r: 내림차순으로 출력하는 옵션

-h: (문자열이 아닌)파일 크기에 따라 정렬하는 옵션

-k n: n번째 열을 기준으로 정렬하는 옵션

head: 입력으로 주어진 정보를 위쪽부터 출력합니다.

-n: head에 대한 매개변수로, 몇 줄을 출력할 것인지 지정합니다.

tee

tee는 표준 입력을 복사해서, 파일과 표준 출력으로 보내는 T자형 파이프입니다.

tee를 사용하지 않으면, 하나의 명령어에서 나온 표준 출력은 두 곳(파일로 리다이렉션, 명령어의 표준 입력으로 리다이렉션)으로 갈 수 없습니다(T가 아닌 1형입니다.)

두 파이프 사이에 tee를 두면, 표준 출력을 파일에 저장하고, 다음 명령어로 넘겨줄 수 있습니다.

command1 | tee file.txt | commmand2

내용이 다른 이유는,

1. 표준 출력을 복사하고

2. 표준출력1을 파일로 저장,

3. 표준출력2를 정렬해서 출력했기 때문입니다.

 

tee를 사용하면 파이프라인 중간에서 흐름을 깨지 않고 파일을 저장할 수 있습니다.

728x90