4. Redirection & Pipeline

froajnzd·2024년 11월 6일
0

the linux command line

목록 보기
4/6
post-thumbnail

리디렉션 (Redirection)

I/O redirection

input/output 리디렉션 기능으로 명령의 입출력을 파일로 리디렉션하거나 여러 명령어를 강력한 명령 파이프라인으로 연결할 수 있다

명령
cat파일 연결
sort텍스트 줄 정렬
uniq반복되는 줄을 보고하거나 생략
grep패턴과 일치하는 줄 출력
wc각 파일의 줄 바꿈, 단어 및 바이트 수 출력
head파일의 첫 부분 출력
tail파일의 마지막 부분 출력
tee표준 입력에서 읽고 표준 출력 및 파일에 쓰기

Standard Input, Output, and Error (표준입출력 및 오류)

표준 출력(Standard Output) 리디렉션

표준 출력을 화면이 아닌 다른 파일로 리디렉션하려면 > 리디렉션 연산자 뒤에 파일이름을 사용한다

[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
  • '>'를 쓰면 처음부터 파일을 덮어쓴다.
  • '>>'를 쓰면 리디렉션된 출력을 파일에 추가한다.

표준 오류(Standard Error) 리디렉션

표준 에러를 리디렉션하기 위해선 해당 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
  1. 표준 출력을 ls-output.txt 파일로 리디렉션
  2. 2>&1 표기로 fd 2 (표준 오류)를 fd 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

더 많은 예제

표준 입력(Standard Input) 리디렉션

  • cat : 하나 이상의 파일을 읽고 표준 출력으로 복사
# 주로 짧은 텍스트 파일을 표시. 
[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

Pipeline (파이프라인)

데이터를 읽고 표준 출력으로 보내는 명령의 기능
파이프연산사 '|'를 사용하여 한 명령의 표준 출력을 다른 명령의 표준 입력으로 파이프한다
데이터에 복잡한 연산을 수행하는 데 자주 사용

command1 | command2

[me@linuxbox ~]$ ls -l /usr/bin | less

>|의 차이점
리디렉션 연산자 > : 명령과 파일을 연결. 파일을 만들거나 덮어씌울 수 있음
파이프라인 연산자 | : 한 명령의 출력을 두 번째 명령의 입력과 연결

Filter (필터)

여러 command들을 파이프라인에 함께 넣을 때 사용되는 명령

filter가 input을 받아 어떤 식으로든 받고, 출력해낸다.

# /bin과 /usr/bin에 있는 모든 실행 프로그램의 목록을 합쳐서 정렬된 순서대로 배치하고 결과 목록 출력
# ls의 출력 = 각 디렉토리에 대해 하나씩 두 개의 정렬된 목록으로 구성. => sort로 데이터를 하나의 정렬된 목록으로 생성
[me@linuxbox ~]$ ls /bin /usr/bin | sort | less

uniq

반복되는 줄을 보고하거나 생략

종종 sort와 함께 사용
표준 입력 또는 단일 파일 이름 인수에서 정렬된 ㅔㄷ이터 목록을 받음
기본적으로 목록에서 중복된 항목 제거

사용 목적: 목록에 중복된 프로그램이 없는지 확인하기 위해 사용

# uniq를 사용해서 sort 명령의 출력에서 중복 항목을 제거.
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq | less

# 제거 대신 중복 목록을 보려면 -d 옵션을 추가
[me@linuxbox ~]$ ls /bin /usr/bin | sort | uniq -d | less

wc (word count)

파일에 포함된 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

grep

패턴과 일치하는 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

옵션

  • i : 대소문자를 무시한다
  • v : 패턴과 일치하지 않는 line만 출력한다

head/tail

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

표준 입력에서 읽어 표준 출력과 파일로 출력

파이프에 tee라는 피팅을 만드는 명령 제공

표준 입력을 읽고, 이를 표준 출력(데이터가 파이프라인을 따라 계속 내려갈 수 있도록 허용)과 하나 이상의 파일에 복사한다

*** 처리의 중간 단계에서 파이프라인 내용을 캡처하는 데 유용

[me@linuxbox ~]$ ls /usr/bin | tee ls.txt | grep zip
bunzip2
bzip2
gunzip
gzip
unzip
zip
zipcloak
zipgrep
zipinfo
zipnote
zipsplit
profile
Hi I'm 열쯔엉

0개의 댓글