파이프라인과 리디렉션은 초보 리눅서에게 반드시 넘어야 하는 관문입니다.
전통적으로 유닉스는 프로그램을 작은 조각으로 나누고 이 조각을 붙여서 일을 처리하는 방식을 택하였으며
리눅스도 유닉스의 철학을 그대로 이어 받았습니다.
이 조각을 붙이는 방법이 바로 [b:103u1mm9]파이프라인(pipe line)[/b:103u1mm9]과 [b:103u1mm9]리디렉션(redirection)[/b:103u1mm9]입니다.
파이프라인은 "|" 으로 리디렉션은 ">", "<" 으로 표현되며 사용법은 다음과 같습니다.
예를 들어 codec 파일이 커서 2개로 분할 압축하였다고 가정하겠습니다.
[list:103u1mm9][b:103u1mm9]codec.tar.gzaa
codec.tar.gzab[/b:103u1mm9][/list:u:103u1mm9]
위 분할 압축을 풀 경우 다음과 같은 명령어를 사용합니다.
[list:103u1mm9][b:103u1mm9]$ cat codec.tar.gz* | tar xzvf -[/b:103u1mm9][/list:u:103u1mm9]
처음 이것을 보고 이해가 간다면 리눅스 초보가 아닐 겁니다.
아래 글을 차근차근 읽어보시고 콘솔상에서 직접 따라해 보시면
위 명령어가 무슨 뜻인지 이해가 가실 겁니다.
우선 첨부한 예제파일을 다운로드 받고 터미널을 엽니다.
[list:103u1mm9]hello [color=#FFFFFF:103u1mm9]_[/color:103u1mm9]=> 실행파일
hello.txt [color=#FFFFFF:103u1mm9][/color:103u1mm9]=> 문서파일[/list:u:103u1mm9]
두개의 파일이 보일 겁니다.
둘다 [b:103u1mm9]"안녕하세요! 전 우분투입니다."[/b:103u1mm9]를 표시하고 있습니다.
[list:103u1mm9][b:103u1mm9]$ cat hello.txt
안녕하세요! 전 우분투입니다.
$ ./hello
안녕하세요! 전 우분투입니다.[/b:103u1mm9][/list:u:103u1mm9]
cat는 파일을 보여주는 역할을 합니다.(정확한 표현은 아님)
자 hello.txt와 똑같은 파일을 만들어 보겠습니다.
[list:103u1mm9][b:103u1mm9]$ cat > hello1.txt
안녕하세요! 전 우분투입니다. [color=#FFFFFF:103u1mm9][/color:103u1mm9]=>직접 입력하세요
Ctrl-D [color=#FFFFFF:103u1mm9]__________________[/color:103u1mm9]=>콘트롤키와 D키를 동시 누르기[/b:103u1mm9][/list:u:103u1mm9]
그러면 [b:103u1mm9]hello1.txt[/b:103u1mm9]가 생겼을 겁니다.
[b:103u1mm9]">"[/b:103u1mm9] 은 리디렉션(redirection)이라고 해서 출력의 방향을 정해줍니다.
즉 왼쪽에서 오른쪽으로 내용을 전달한다는 뜻입니다.
[b:103u1mm9]"<"[/b:103u1mm9] 은 오른쪽에서 왼쪽으로 출력을 바꾸어 줍니다. 보통 입력이 됩니다.
[b:103u1mm9]hello2.txt[/b:103u1mm9]를 다음과 같이 만들 수도 있습니다.
[list:103u1mm9][b:103u1mm9]$ cat hello.txt > hello2.txt[/b:103u1mm9][/list:u:103u1mm9]
hello.txt를 읽어서 hello2.txt로 내용을 전달한다는 말이므로
위 내용은 파일 카피와 같은 기능을 하게 되는 것입니다.
C 언어로 작성된 hello 프로그램은 "안녕하세요! 전 우분투입니다." 를 화면에 출력해 줍니다.
hello를 포함한 모든 터미널 프로그램에서도 리디렉션이 가능합니다.
[list:103u1mm9][b:103u1mm9]$ ./hello > hello3.txt[/b:103u1mm9][/list:u:103u1mm9]
hello가 만들어낸 화면내용이 바로 hello3.txt로 전달되어 파일이 생성됩니다.
중요한 점은 실행파일 hello가 출력한 방식이 cat로 출력한 방식과 같다는 겁니다.
즉 hello1.txt hello2.txt hello3.txt 모두 같은 내용을 담고 있습니다.
한가지 더 현재 디렉토리의 파일목록을 list.txt로 저장해 보겠습니다.
[list:103u1mm9][b:103u1mm9]$ ls > list.txt[/b:103u1mm9][/list:u:103u1mm9]
그럼 다음은 어떤 의미일까요?
[list:103u1mm9][b:103u1mm9]$ cat < hello.txt[/b:103u1mm9][/list:u:103u1mm9]
hello.txt의 내용을 cat에 전달하라는 명령이므로
이것은 cat hello.txt와 똑같은 기능을 하게 됩니다.
이제 리디렉션의 주고 받는 기능에 대해 감이 오실 겁니다.
그럼 파이프라인으로 넘어가겠습니다.
파이프라인은 근본적으로 리디렉션하고 비슷하지만 받은 데이타를 다시 가공할 수 있으며
편리한 확장 기능도 제공합니다.
[list:103u1mm9][b:103u1mm9]$ cat hello.txt | grep 레드헷
$ cat hello.txt | grep 우분투
안녕하세요! 전 우분투입니다.[/b:103u1mm9][/list:u:103u1mm9]
grep은 문자열을 찾는 프로그램으로 찾은 문자열을 출력해 줍니다.
위의 경우 [b:103u1mm9]grep 레드헷[/b:103u1mm9]은 아무 표시도 없지만 [b:103u1mm9]grep 우분투[/b:103u1mm9]의 경우 문자열을 출력해 줍니다.
즉 앞에서 받은 내용을 다시 가공해서 사용 가능하다는 뜻입니다.
일반적인 리디렉션보다 한 단계 더 진화했다고 보시면 됩니다.
파일 찾는 명령어는 [b:103u1mm9]find / -name "찾을 파일명"[/b:103u1mm9] 이지만
파이프라인을 사용할 수도 있습니다.
[list:103u1mm9][b:103u1mm9]$ find / | grep "찾을 파일명"[/b:103u1mm9][/list:u:103u1mm9]
파이프라인은 리디렉션하고 비슷한 개념이라고 생각하시면 됩니다.
이제 좀 더 고난도의 파이프라인을 사용해 보겠습니다.
분할압축하기를 파이프라인을 이용해 보겠습니다.
다음 명령은 현재 디렉토리의 모든 파일을 압축하고 이것을 두 개의 파일로 나눕니다.
[list:103u1mm9][b:103u1mm9]$ tar czvf archive.tar.gz *
$ split -b 2000 archive.tar.gz archive_split.tar.gz[/b:103u1mm9][/list:u:103u1mm9]
split은 나누라는 명령어로 -b 2000 옵션은 2000 byte씩 쪼갠다는 의미입니다.
그러면 archive_split.tar.gzaa 와 archive_split.tar.gzab 두개의 파일이 생성됩니다.
이것을 한 줄로 표현하면 다음과 같습니다.
[list:103u1mm9][b:103u1mm9]$ tar czvf temp * ; split -b 2000 temp archive_split.tar.gz ; rm temp[/b:103u1mm9][/list:u:103u1mm9]
tar는 임시파일인 temp로 압축을 하고 이것을 split이 쪼갠다음 필요 없어진 temp를 지우는 겁니다.
파이프라인을 사용한다면 더욱 단순화할 수 있습니다.
[list:103u1mm9][b:103u1mm9]$ tar czvf - * | split -b 2000 - archive_split.tar.gz[/b:103u1mm9][/list:u:103u1mm9]
즉 [b:103u1mm9]- (빼기기호)[/b:103u1mm9] 가 임시파일 역할을 하고 사용 후에는 자동적으로 사라지게 됩니다.
주의할 것은 빼기기호 앞뒤로 공간이 반드시 있어야 합니다.
자 그럼 다음 압축풀기의 뜻을 이해하실 수 있을 겁니다.
[list:103u1mm9][b:103u1mm9]$ cat archive_split.tar.gz* | tar xvzf -[/b:103u1mm9][/list:u:103u1mm9]
cat가 archive_split.tar.gzaa 와 archive_split.tar.gzab를 차레대로 tar에 넘기면 tar는 이것을 풀어주는 겁니다.
마치 쪼개지지 않은 파일을 풀듯이 말입니다.
작은 기능을 하나하나 연결하면 못하는 일이 없다면 믿으시겠습니까?
리눅스는 가능합니다.
내용은 2가지인데 말만 많아졌네요 !
파이프라인과 리디렉션의 이해에 조금이나마 도움이 되셨으면 하는 바램입니다.
[b:103u1mm9]"난 재미로 리눅스를 시작했다." - Linus Torvalds[/b:103u1mm9]