I/O redirection
input/output 리디렉션 기능으로 명령의 입출력을 파일로 리디렉션하거나 여러 명령어를 강력한 명령 파이프라인으로 연결할 수 있다
명령 | |
---|---|
cat | 파일 연결 |
sort | 텍스트 줄 정렬 |
uniq | 반복되는 줄을 보고하거나 생략 |
grep | 패턴과 일치하는 줄 출력 |
wc | 각 파일의 줄 바꿈, 단어 및 바이트 수 출력 |
head | 파일의 첫 부분 출력 |
tail | 파일의 마지막 부분 출력 |
tee | 표준 입력에서 읽고 표준 출력 및 파일에 쓰기 |
표준 출력을 화면이 아닌 다른 파일로 리디렉션하려면 > 리디렉션 연산자 뒤에 파일이름을 사용한다
[me@linuxbox ~]$ ls -l /usr/bin > ls-output.txt
[me@linuxbox ~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 167878 2018-02-01 15:07 ls-output.txt
[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt
[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt
[me@linuxbox ~]$ ls -l /usr/bin >> ls-output.txt
[me@linuxbox ~]$ ls -l ls-output.txt
-rw-rw-r-- 1 me me 503634 2018-02-01 15:45 ls-output.txt
표준 에러를 리디렉션하기 위해선 해당 file descriptor(fd)를 참조해야 한다.
프로그램은 번호가 있는 여러 file streams에 출력을 생성한다.
file stream 중 처음 세 개를 표준 입력, 출력, 오류라고 하며, 셸은 각각 fd(file descriptor) 0, 1, 2라고 한다.
셸은 fd 번호를 사용하여 파일을 리디렉션하는 표기법을 제공한다.
표준 오류는 fd 2 이므로, 이를 사용해 표준 오류를 리디렉션한다. < 연산자 바로 앞에 2를 배치하여 표준 오류를 txt 파일로 리디렉션한다.
[me@linuxbox ~]$ ls -l /bin/usr 2> ls-error.txt
전통적인 방법
[me@linuxbox ~]$ ls -l /bin/usr > ls-output.txt 2>&1
유의 !!리디렉션 순서가 중요!!
표준 오류 리디렉션은 항상 표준 출력을 리디렉션한 후 수행해야 한다
최신 방법
[me@linuxbox ~]$ ls -l /bin/usr &> ls-output.txt
[me@linuxbox ~]$ ls -l /bin/usr &>> ls-output.txt
&> 단일 표기법을 사용하여 표준 출력/표준 오류를 모두 ls-output.txt 로 리디렉션한다.
&>> 로 표준 출력과 표준 오류 스트림을 단일 파일에 추가한다.
명령을 출력하지 않고 싶을 때 (특히 오류 및 상태 메세지)
시스템에서 출력을 "/dev/null"이라는 특수 파일로 리디렉션하는 방법으로 제공
이 파일은 bit bucket 시스템 장치로, 입력만 받고 아무 작업도 수행하지 않음[me@linuxbox ~]$ ls -l /bin/usr 2> /dev/null
# 주로 짧은 텍스트 파일을 표시.
[me@linuxbox ~]$ cat ls-output.txt
# 파일을 하나로 합칠 수 있다
# 와일드카드는 항상 정렬된 순서로 확장하므로 001,002,...009 순서로 정렬된다
[me@linuxbox ~]$ cat movie.mpeg.0* > movie.mpeg
# 표준 입력을 읽는다 (ex. 키보드)
# 입력 종료: Ctrl-d (EOF에 도달했다고 cat에게 알림)
[me@linuxbox ~]$ cat
# 표준 입력을 텍스트 파일로 리디렉션 > 입력을 받아서 텍스트 파일에 작성
[me@linuxbox ~]$ cat > lazy_dog.txt
# 표준 입력 리디렉션
# < 연산자를 사용해서 키보드의 표준 입력 소스를 lazy_dog.txt 파일로 변경
# 결과는 단일 파일명 인수를 전달하는 것과 동일
[me@linuxbox ~]$ cat < lazy_dog.txt
데이터를 읽고 표준 출력으로 보내는 명령의 기능
파이프연산사 '|'를 사용하여 한 명령의 표준 출력을 다른 명령의 표준 입력으로 파이프한다
데이터에 복잡한 연산을 수행하는 데 자주 사용
command1 | command2
[me@linuxbox ~]$ ls -l /usr/bin | less
>
와|
의 차이점
리디렉션 연산자>
: 명령과 파일을 연결. 파일을 만들거나 덮어씌울 수 있음
파이프라인 연산자|
: 한 명령의 출력을 두 번째 명령의 입력과 연결
여러 command들을 파이프라인에 함께 넣을 때 사용되는 명령
filter가 input을 받아 어떤 식으로든 받고, 출력해낸다.
# /bin과 /usr/bin에 있는 모든 실행 프로그램의 목록을 합쳐서 정렬된 순서대로 배치하고 결과 목록 출력
# ls의 출력 = 각 디렉토리에 대해 하나씩 두 개의 정렬된 목록으로 구성. => sort로 데이터를 하나의 정렬된 목록으로 생성
[me@linuxbox ~]$ ls /bin /usr/bin | sort | less
반복되는 줄을 보고하거나 생략
종종 sort와 함께 사용
표준 입력 또는 단일 파일 이름 인수에서 정렬된 ㅔㄷ이터 목록을 받음
기본적으로 목록에서 중복된 항목 제거
사용 목적: 목록에 중복된 프로그램이 없는지 확인하기 위해 사용
# uniq를 사용해서 sort 명령의 출력에서 중복 항목을 제거.
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | less
# 제거 대신 중복 목록을 보려면 -d 옵션을 추가
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq -d | less
파일에 포함된 line, word, byte 수를 표시
[me@linuxbox ~]$ wc ls-output.txt
7902 64566 503634 ls-output.txt
# 정렬된 목록에 있는 item의 수를 확인
# -l 옵션: 출력을 report line으로만 제한
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | wc -l
2728
패턴과 일치하는 line 출력
grep pattern [file...]
file에서 pattern을 발견하면, 해당 패턴이 포함된 line 출력
패턴은 정규표현식(regular expressions) 사용
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | grep zip
bunzip2
bzip2
gunzip
gzip
unzip
zip
zipcloak
zipgrep
zipinfo
zipnote
zipsplit
옵션
head : 파일의 처음 부분 출력
tail : 파일의 마지막 부분 출력
-n 옵션을 사용해 처음/마지막 n 줄을 조정
[me@linuxbox ~]$ head -n 5 ls-output.txt
total 343496
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
-rwxr-xr-x 1 root root 8240 2007-12-09 13:39 411toppm
-rwxr-xr-x 1 root root 111276 2007-11-26 14:27 a2p
-rwxr-xr-x 1 root root 25368 2006-10-06 20:16 a52dec
[me@linuxbox ~]$ tail -n 5 ls-output.txt
-rwxr-xr-x 1 root root 5234 2007-06-27 10:56 znew
-rwxr-xr-x 1 root root 691 2005-09-10 04:21 zonetab2pot.py
-rw-r--r-- 1 root root 930 2007-11-01 12:23 zonetab2pot.pyc
-rw-r--r-- 1 root root 930 2007-11-01 12:23 zonetab2pot.pyo
lrwxrwxrwx 1 root root 6 2016-01-31 05:22 zsoelim -> soelim
실시간으로 파일을 볼 수 있는 옵션이 있다
로그 파일이 작성되는 동안 진행 상황을 볼 때 유용
/var/log의 messages 파일(또는 messages가 없는 경우 /var/log/syslog 파일)을 살펴본다.
일부 리눅스 배포판에서는 /var/log/messages 파일에 보안 정보가 포함될 수 있으므로 수퍼유저 권한 필요.
-f 옵션 : 모니터링하며 새로운 줄이 추가되면 즉시 디스플레이에 표시
Ctrl-c : 종료
표준 입력에서 읽어 표준 출력과 파일로 출력
파이프에 tee라는 피팅을 만드는 명령 제공
표준 입력을 읽고, 이를 표준 출력(데이터가 파이프라인을 따라 계속 내려갈 수 있도록 허용)과 하나 이상의 파일에 복사한다
*** 처리의 중간 단계에서 파이프라인 내용을 캡처하는 데 유용
[me@linuxbox ~]$ ls /usr/bin | tee ls.txt | grep zip
bunzip2
bzip2
gunzip
gzip
unzip
zip
zipcloak
zipgrep
zipinfo
zipnote
zipsplit