다디와 괴발개발

리다이렉션과 파이프라인 본문

DevOps/Linux

리다이렉션과 파이프라인

아임다디 2022. 3. 19. 16:15

이전 게시글에서 표준 스트림에 대해서 살펴보았다. 이번에는 표준 스트림의 흐름을 바꾸는 과정인 리다이렉션과 파이프라인에 대해 살펴보자.

리다이렉션 (Redirection)

리다이렉션은 표준 스트림의 흐름을 바꿔 파일로 표준 입출력을 할 수 있도록 해준다.

핵심은 '파일'이며, 파일로 만들어버리면 리다이렉션이고, 파일로 만드는게 아니라 단순 출력은 stdout이다.

기호 > 혹은 <를 사용해서 리다이렉션을 할 수 있다.

리다이렉션 기호 방향 의미
> 표준 출력 명령의 결과를 파일로 저장 (기존 파일 덮어씀)
>> 표준 출력 (append) 명령의 결과를 기존 파일에 추가
< 표준 입력 파일의 데이터를 명령에 입력

예시로 더 쉽게 이해해보자.

ps aux 라는 명령의 출력 결과를 ps.txt 파일에 저장하고 싶을 때 어떻게 해야할까?

ps aux > ps.txt # 명령어 > 파일

그렇다면, 파일을 출력하고 싶은데 조건을 걸고싶다면?

head 명령어를 사용해서 ps.txt라는 파일을 출력해 볼 것이다. head는 파일의 처음 부터 지정한 라인까지 출력하는 명령이다. 기본값은 10줄이다. 

즉, ps.txt의 처음 10줄을 head의 입력 스트림으로 전환하여 보내게 된다면

head < ps.txt # 명령어 < 파일

 

여러 명령을 한꺼번에 입력해줄 수도 있다. 다음과 같은 명령은 어떤 결과를 낼까?

head < ps.txt > sample.txt
# 명령어1 < 들어오는 파일 > 나가는 파일

실행 순서는 왼쪽부터 순차대로 진행한다

  1. ps.txt 내용을 head 명령의 입력 스트림을 전환하여 전송한다
  2. head 명령은 ps.txt의 처음 10줄을 출력해준다
  3. head 명령의 출력 스트림 결과(2번)를 sample.txt에 저장해준다

파이프라인 (Pipeline)

파이프는 어떤 명령의 결과를 다시 어떤 명령의 입력으로 받아야 할 때 사용한다. 

즉, 앞 명령어의 결과를 뒤의 명령어의 입력으로 처리하기 위해서 사용한다.

예를 들어, 프로세스 1의 출력 스트림을 프로세스 2의 입력 스트림으로 사용하고 싶다면?

process1 | process2

ssh라는 문자열이 포함된 파일만을 확인하고 싶을때는 어떻게 명령을 입력하면 될까?

ls -l | grep ssh

출력 관련 명령어는 다음 게시글에서 좀 더 자세하게 살펴보자.

여러 명령들을 조합해서도 사용 가능하다.

cat access.log | grep Yahoo | sort | less

이 명령은 access.log 라는 파일을 출력할 것인데, Yahoo 글자가 있는 라인만 출력하고, 오름차순 정렬 후, 한 페이지씩 출력하도록 해준다.


리다이렉션과 파이프를 섞어서 사용도 물론 가능하다.

만약 위의 예시를 res.txt에 저장하고 싶다면?

cat access.log | grep Yahoo | sort > res.txt