[Linux] 파이프(pipe)에 대한 이해
개요
안녕하세요 피터입니다.
오늘은 리눅스의 파이프(pipe)에 대해서 설명드리겠습니다.
파이프는 재지향(redirection)과 더불어 리눅스의 명령어들을 훨씬 강력하게 무장시켜주는 역할을 하는 핵심 기능입니다.
마치 그 자체로는 특별한 맛이 나지 않지만 단맛이나 짠맛 같은 다른 맛을 훨씬 강하게 만들어주는 조미료와 같다고 할까요?
재지향은 아래 글에서 자세히 보실 수 있습니다.
[Linux] 재지향(Redirection)에 대한 이해
여러개의 명령어를 실행할 때 이전 명령어의 결과를 다음 명령어의 입력값으로 사용하고 싶을 때가 있습니다.
명령어의 입력 - 실행 - 결과 의 과정을 파이프 안에 흐르는 액체로 비유한다면
첫 번째 명령어 파이프의 결과를 화면으로 출력하는 대신 다른 명령어 파이프로 흘러가도록 연결한다고 생각하시면 됩니다.
4가지 shape 가 흐르는 명령어 파이프가 있다고 가정했을 때,
아래처럼 특정 shape 를 필터링 하는 명령어 파이프에 | 를 통해서 연결하면 화면에 출력되는 최종 결과는 필터링 파이프를 통과한 결과가 되는 거죠.
사용법
cat /etc/passwd | grep mail
/etc/passwd 파일에는 현재 시스템의 계정정보들이 들어있습니다.
cat 명령어에 의해 각 계정 정보가 라인별로 출력이 되는데요.
그 중에서 mail 이라는 문자열이 들어간 라인만 필터링해서 출력하고 싶을 때
파이프( | )를 사용하여 cat 명령어의 결과를 grep 명령어로 전달할 수 있습니다.
쉘 프롬프트(Shell prompt)에서 한번에 사용 가능한 파이프의 개수는 제한이 없습니다.
이전 명령어의 출력값을 필터링하거나 가공할 때 주로 사용하기 때문에 awk, cut, grep, more 등의 명령어들을 조합해서 많이 사용합니다.
예제
ex) test1.txt 파일에서 abc 라는 글자가 포함된 라인만 출력
[root@peterdev test]# cat test1.txt
abc
def
qwe
poi
abc
abcdef
abcd
[root@peterdev test]# cat test1.txt | grep abc
abc
abc
abcdef
abcd
[root@peterdev test]#
ex) 현재 디렉토리에서 c 라는 글자가 들어간 파일만 출력
[root@peterdev peter]# ls
language.bash language.delphi language.javascript
language.c language.english language.korean
language.cpp language.java language.python
[root@peterdev peter]# ls | grep c
language.c
language.cpp
language.javascript
ex) 현재 디렉토리에서 c 라는 글자가 들어간 파일 중 java 가 들어간 파일을 제외하고 출력
[root@peterdev peter]# ls | grep c | grep -v java
language.c
language.cpp
[root@peterdev peter]#
ex) /etc 디렉토리의 파일 목록을 한 화면씩 나누어서 출력
[root@peterdev peter]# ls -l /etc | more
total 1352
-rw-r--r-- 1 root root 16 Jan 5 21:14 adjtime
-rw-r--r-- 1 root root 1518 Jun 7 2013 aliases
-rw-r--r-- 1 root root 12288 Jan 5 21:16 aliases.db
drwxr-xr-x 2 root root 4096 Apr 17 02:00 alternatives
-rw------- 1 root root 541 Aug 3 2017 anacrontab
-rw-r--r-- 1 root root 55 Mar 1 2017 asound.conf
drwxr-xr-x 2 root root 4096 Jan 5 21:12 bash_completion.d
-rw-r--r-- 1 root root 2853 Nov 5 2016 bashrc
drwxr-xr-x 2 root root 4096 Mar 7 13:27 binfmt.d
-rw-r--r-- 1 root root 38 Aug 30 2017 centos-release
-rw-r--r-- 1 root root 51 Aug 30 2017 centos-release-upstream
drwxr-xr-x 2 root root 4096 Aug 4 2017 chkconfig.d
-rw-r--r-- 1 root root 1108 Jan 31 2017 chrony.conf
-rw-r----- 1 root chrony 481 Jan 31 2017 chrony.keys
drwxr-xr-x 2 root root 4096 Jan 5 21:11 cron.d
drwxr-xr-x 2 root root 4096 Jan 5 21:12 cron.daily
-rw------- 1 root root 0 Aug 3 2017 cron.deny
drwxr-xr-x 2 root root 4096 Jan 5 21:11 cron.hourly
drwxr-xr-x 2 root root 4096 Jun 9 2014 cron.monthly
-rw-r--r-- 1 root root 451 Jun 9 2014 crontab
drwxr-xr-x 2 root root 4096 Jun 9 2014 cron.weekly
-rw------- 1 root root 0 Jan 5 21:10 crypttab
-rw-r--r-- 1 root root 1620 Nov 5 2016 csh.cshrc
-rw-r--r-- 1 root root 841 Jun 7 2013 csh.login
drwxr-xr-x 4 root root 4096 Jan 5 21:11 dbus-1
drwxr-xr-x 2 root root 4096 May 10 07:32 default
drwxr-xr-x 2 root root 4096 Apr 17 02:00 depmod.d
drwxr-x--- 4 root root 4096 Mar 13 10:23 dhcp
-rw-r--r-- 1 root root 5090 Nov 4 2016 DIR_COLORS
-rw-r--r-- 1 root root 5725 Nov 4 2016 DIR_COLORS.256color
-rw-r--r-- 1 root root 4669 Nov 4 2016 DIR_COLORS.lightbgcolor
-rw-r--r-- 1 root root 1285 Jan 5 12:47 dracut.conf
drwxr-xr-x 2 root root 4096 Jan 5 12:47 dracut.conf.d
-rw-r--r-- 1 root root 112 Mar 16 2017 e2fsck.conf
-rw-r--r-- 1 root root 0 Nov 5 2016 environment
-rw-r--r-- 1 root root 1317 Nov 5 2016 ethertypes
--More--
ex) 실행 중인 프로세스 목록에서 bash 프로세스 목록을 출력
[root@peterdev peter]# ps -ef | grep bash
root 929 472 0 Apr18 tty1 00:00:00 -bash
root 17937 17935 0 00:23 pts/0 00:00:00 -bash
root 18009 17937 0 00:57 pts/0 00:00:00 grep --color=auto bash
[root@peterdev peter]#
-Peter의 우아한 프로그래밍
여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.