리눅스에서는 '|'라는 문자와 '<', 그리고 '>'와 같이 명령어를 쓰는 경우가 많아요. 전자는 파이프, 후자는 리다이렉션이라고 이야기를 하는데요. 오늘은 그 중, 파이프 명령어를 알아보도록 하겠습니다. 파이프란, 어떠한 프로세스의 출력이, 그 다음 프로세스의 입력이 되는 것을 말합니다.
여기까지만 봐서는 무슨 말인지 이해가 안 갈 듯 싶네요. 예제를 몇 개 들어보겠습니다.
먼저, 현재 디렉토리에 있는 모든 파일과 디렉토리를 이름 오름차순으로 9개만 자세히 보는 명령을 작성해 봅시다. 아니, 이게 무슨 끔찍한 조합인 거 같지만, 사실 그리 어렵지 않습니다. 먼저, 무엇부터 해야 할까요? 현재 디렉토리에 있는 파일 목록 모두를 자세히 출력해야 합니다. 이것은 ls -al로 할 수 있어요.
다음에, 이 결과값을 이용해서, 이름을 사전순으로 정렬합시다. 이 때, 파이프로 연결하는데요. ls -al의 출력 결과를 sort 명령어의 입력으로 주면 됩니다. 9번째 필드가 파일, 폴더 이름인데요. sort -k 9 옵션을 주도록 합시다.
다음에, 이 결과를 가지고, 어떻게 하면 사전순으로 10개가 화면에 출력이 될까요? head -n 10 옵션을 주면 됩니다. 위에 화면 결과가 head -n 10이라는 명령어의 입력으로 전달됩니다. 여기서 위에 10개만 출력하면, .config까지만 출력이 되겠네요.
출력 결과는 다음과 같이 나옵니다.
두 번째 예제를 봅시다. 이번에는 clock2.c에서 time이라는 단어가 나오는지만 검색하고 싶습니다. 그렇게 하려면 어떤 명령어를 쓰면 좋을까요? 이것도 차근차근 가 봅시다. cat aaa.txt 명령어는 aaa.txt를 표준 출력에 씁니다. cat clock2.c를 입력하면, 커멘드 창에, clock2.c 내용이 그대로 나옵니다.
이것을 어떤 명령어의 입력으로 주면 좋을까요? time이라는 문자열을 찾는 명령어가 오면 좋겠네요. 패턴을 찾는 명령어 중에는 grep이 있는데요. grep time은 "time"이라는 패턴이 있는 줄을 찾으라는 명령입니다.
즉, 초록색 부분을 grep time이 input으로 받으면 됩니다. 그럴려면 cat clock2.c와 grep time을 파이프로 연결해 주면 됩니다. 이렇게 되면, 어떻게 출력이 될까요?
네. clock2.c에서, time이라는 키워드를 찾은 줄이 출력됩니다.
어떤 명령어의 출력이, 다른 명령어의 입력이 된다는 개념이 조금씩 올 듯 싶습니다. 그러면 clock2.c 파일에서 단어 수와 줄 수, 문자 수를 쉘에 출력하려면 어떤 명령어를 쓰면 될까요? clock2.c에 wc를 파이프로 연결하면 됩니다.
마지막 리눅스 파이프 예제를 봅시다. 텍스트 파일에 있는 내용을 정렬하고, 중복된 내용을 제거하고 싶습니다. 어떻게 할까요? 먼저 1.txt를 읽어와서 표준 출력에 출력해 봅시다.
파일 1.txt에 이런 식으로 저장을 했다고 하면, cat 1.txt를 출력하면, 요래 출력이 될 거에요. 출력한 내용을 input으로 받아봅시다. 보통, 중복된 원소를 제거하기 위해서 먼저 하는 일은 sort를 하는 것인데요. 이 출력 결과를 입력 받아서, sort를 해 봅시다. sort 명령어를 파이프로 이어주면 됩니다.
그러면 이것을 sort로 연결해 주면, 초록색 부분이 정렬이 될 거에요.
여기서, 중복을 제거하고 싶어요. 어떻게 하면 좋을까요? uniq를 연결해 주면 됩니다. uniq는 연속된 행이 중복되어 있으면 중복 없이 하나의 행으로 만들어 주는 명령어인데요. 당연하게도 sort가 되어 있어야 제대로 동작할 거에요. 아니라면, 동작 하지 않을 거에요.
연속된 행이 중복이 아니기 때문이에요. 일례로 root는 1번 중복되어 있지만, 연속되어 있지 않아요. 따라서, root 하나가 제거되지 않아요. 즉, 중복된 데이터를 제거하려면 정렬부터 해야 하는데요. sort를 먼저 해 준 것이 그러한 이유 때문입니다.
sort한 결과를 uniq 명령어의 입력으로 넘겨주면, 같은 데이터는 연속해서 등장하기 때문에 중복된 것은 제거되고 하나로 될 거에요. 예를 들어서, gamma가 2번 나왔다면, gamma가 1번만 나올 거에요.
중복 데이터가 모두 제거되었습니다. cat 1.txt의 결과를 sort가 받았습니다. 그러면 1.txt를 정렬을 할 거에요. 이 결과를 uniq가 받았습니다. 그러면, 1.txt의 내용을 정렬한 다음에 중복된 결과를 제거한 게 되어 버립니다. 파이프 명령어를 통해서, 더 강력한 명령어를 작성할 수 있는 셈입니다.
이번 시간에는, 아 이런 게 있구나. 정도만 이해하시고 해석하실 수 있을 정도로만 보시면 좋을 듯 싶습니다.
'OS > 리눅스' 카테고리의 다른 글
리눅스 fork 함수 : 프로세스를 생성한다. (2) | 2019.08.15 |
---|---|
리눅스 리다이렉션 : 입출력을 재지정 할 수 있다. (12) | 2019.08.13 |
하드 링크 vs 심볼릭 링크 : 어느 것을 가리키는가? (4) | 2019.07.30 |
리눅스 pwd 명령어 : 현재 작업 위치를 출력한다. (4) | 2019.07.26 |
절대 경로 vs 상대 경로 : 어디를 기준점으로 잡는가? (0) | 2019.07.26 |
최근댓글