본문 바로가기

스터디/리눅스 커맨드라인

[리눅스] 6. 리다이렉션

 

 

  • I/O 리다이렉션 (입출력 방향 지정)의 명령어들을 알아볼 것이다.
  • 명령은 리다이렉션을 토해 파일로부터 입력받을 수 있고, 또한 파일로 출력할 수 있다.
  • 강력한 파이프라인을 만들기 위해서 필요한 명령어들을 연결할 수 있다.

 

1. 표준 입출력과 표준 오류

: 많은 프로그램들은 일종의 출력을 만들어낸다. 출력은 두 가지 형식을 포함한다.

  • 첫 번째는 프로그램의 결과이다. -> 프로그램이 출력하도록 설계한 데이터를 말한다.
  • 두 번째는 프로그램이 어떻게 돌아가고 있는지를 말해주는 상태 및 오류 메시지 형식이다. 

위를 토대로 ls 와 같은 프로그램은 사실 표준 출력 (stdout)이라고 불리는 특수한 파일에 이 명령어에 대한 결과를 보내고

표준 오류 (stderr)라는 또 다른 파일에 그 상태 메시지를 전송한다.

게다가 많은 프로그램들이 표준 입력 (stdin)이라고 부르는 곳에서 입력 내용을 가져오고 그것은 기본적으로 키보드에 연결되어 있다.

 

 

1) 표준 출력 재지정

: I/O 리다이렉션은 출력방향을 재정의할 수 있다. 화면에 출력하는 대신 다른 파일에 출력되도록 지정하기 위해서는

파일명 앞에 > 리다이렉션 연산자를 사용한다.

  • ls -l /usr/bin > ls-output.txt : /usr/bin 디렉토리에 있는 긴 목록을 불러와서 ls-output.txt 파일로 보냈다는 의미.
  • less ls-output.txt : less 명령어로 텍스트 파일의 내용을 볼 수 있다.

/usr/bin

 

but) 만약에 존재하지 않는 /bin/usr이란 디렉토리를 입력했을 때.

  • ls -l /bin/usr > ls-output.txt

/bin/usr

 

파일 크기가 0인 것을 확인할 수 있다. -> 리다이렉션 연산자 (>)로 출력 방향을 지정할 때, 목적 파일 (ls-output.txt) 은 항상 처음부터 다시 작성되기 때문.

ls 명령어가 아무런 결과를 만들지 못했고 단지 오류 메시지만을 만들었기 때문에, 리다이렉션 명령은 파일을 처음부터 다시 쓴 뒤 오류 때문에 중단되어 잘림 현상이 생겼다.

 

리다이렉션 연산자만을 사용해서 파일 이어 쓰기

: >> 연산자를 사용하면 파일에 이어 쓰기가 가능해진다. 만약 존재하지 않는 파일이면 > 연산자를 사용한 것처럼 파일이 생성된다. 

  • ls -l /usr/bin >> ls-output.txt : 파일 크기가 두 배가 된다.

 

2) 표준 오류 재지정

명령어 결과를 모두 한 파일에 저장하고 싶은 경우, 동시에 표준 출력과 표준 오류를 재지정해야한다.

 

예전 방식

  • ls -l /bin/usr > ls-output.txt 2>&1 : 예전 버전에서 사용하는 명령어 방식 (현재는 잘 사용하지 않고 있는 방식이다.)

최신 방식

  • ls -l /bin/usr &> ls-output.txt

 

원치 않는 출력 제거

: 명령어의 출력 결과를 원치 않고 버리고 싶을 때, 2> 연산자를 사용한다.

  • ls -l /bin/usr 2> /dev/null

/dev/null (비트 버킷) : 오래된 유닉스 개념으로 시스템 장치로 입력을 받고 아무것도 수행하지 않는다.

 

 

3) 표준 입력 재지정

(1) cat - 파일 붙이기

: 하나 이상의 파일을 읽어 들여서 표준 출력으로 그 내용을 복사한다.

  • cat [file ...] : cat ls-output.txt를 입력하면 파일의 내용을 표시한다.

cat ls-output.txt

 

less 파일명으로 입력하면 출력내용을 페이지 단위로 표준 출력을 표시하지만, cat 파일명으로 입력하면 출력내용을 바로 아래에 출력한다.

또한, 'cat movie.mpeg.0* > movie.mpeg' 로 입혁하면 나뉜 여러 파일을 하나의 파일로 만들 수 있다.

'cat > lazy_dog.txt' 를 입력하면 명령어 다음에 파일에 쓰고 싶은 텍스트를 입력하고, 끝에 CTRL-D를 입력하면 내용이 파일에 작성된다.

 

 

2. 파이프라인

  • 표준 입력으로 부터 데이터를 읽고, 표준 출력으로 데이터를 전송하는 명령어의 능력이다.
  • 파이프 연산자 | (수직바) 기호를 사용해서 명령어의 표준 출력을 또 다른 명령어의 표준 입력과 연결시킬 수 있다.
    • command1 | command2

 

1) 필터

(1) sort : 두 개의 내용을 하나의 목록으로 만들어 정렬하는 명령어.

  • ls /bin /usr/bin | sort | less : /bin 디렉토리와 /usr/bin 디렉토리를 하나의 목록으로 만들어서 less 명령어를 통해 ls 결과를 보여준다.

 

(2) uniq 명령어 : 중복줄 제거 및 표시

  • ls /bin /usr/bin | sort | uniq | less : 정렬된 데이터를 입력받아 중복된 내용을 제거해준다. 중복된 내용을 보고싶다면 'uniq -d'

 

(3) wc 명령어 : 라인, 단어 개수 및 파일 크기 출력

  • wc ls-output.txt (wc 명령어 파일명) : (라인 수) (단어 개수) (파일 크기) 순으로 출력.

wc ls-output.txt

 

(4) grep : 패턴과 일치하는 라인 출력

  • grep pattern [file ... ]

zip 라는 글자가 포함된 모든 프로그램을 찾는 명령어이다.

  • -i 옵션 : 검색할 때 대소문자 구분하지 않고 검색.
  • -v 옵션 : 패턴과 일치하지 않는 라인만 출력하도록 검색.

 

(5) head / tail : 파일의 처음/끝 부분 출력

  • 기본적으로 10줄만 출력
  • -n 옵션을 통해서 길이를 조절할 수 있다.

 

(6) tee : 표준 입력에서 데이터를 읽고, 표준 출력과 파일에 출력

  • ls /usr/bin | tee ls.txt | grep zip : grep 필터를 통해 zip가 포함된 프로그램을 ls.txt에 저장하고 적용된 결과를 출력한다.