지극히 개인적인 공부 노트/리눅스(Linux)

[Linux] 여러 명령어를 한 번에 수행하기(feat. File Redirection, grep, Pipe)

AS J 2021. 8. 9. 00:15

리눅스는 CLI(Command Line Interface)로 작동되며, 매 줄마다 명령어를 입력해야 한다.

개발자나 리눅스 사용자 입장에서는 사소한 명령까지 하나씩 쓰고, 엔터를 누르는 과정은 번거롭게 느껴질 수 있다. 또, 한 줄의 명령으로 조금 더 섬세하고, 효율적인 결과를 얻고 싶을 수 있다.

이런 과정을 조금이나마 더 편리하게 만드는 기능으로 리눅스의 file redirection과 pipe가 있다. 이들은 1개 이상의 명령 또는 더 섬세한 명령을 특정 형식에 맞추어서 입력하면 한 줄만에 여러 명령을 수행할 수 있게 하는 기능이다.

이 글에서는 이 기능이 무엇이고, 어떻게 사용할 수 있는지 간단하게 적어봤다.

 

File Redirection

파일 리다이렉션(File Redirection)은 표준 스트림의 흐름을 바꾸어, 일반적인 표준 입력 및 출력, 오류를 사용하지 않고, 특정 문자(>, <)를 통해 다른 경로의 파일로 재지정하는 기능. 우선, 표준 스트림은 표준 입력, 표준 출력, 표준 오류 등 3가지가 있으며 아래와 같이 정리할 수 있다.

표준 스트림(Standard Stream): 표준 입력 - stdin, 표준 출력 - stdout, 오류 내용 출력 - stderr

각 표준 스트림은 아래와 같은 숫자 형식을 가지며, 표준 입출력의 경우에는 그 아래 예시와 같이 숫자를 생략하고 기호(>, <)의 방향으로도 표현과 명령이 가능하다. 표준 오류 출력의 경우는 숫자 2를 함께 적음으로써 정확한 전달이 가능(2번 경우)하다.

작성 형식: 표준 입력 → 0>, 표준 출력 → 1>, 표준 오류 → 2>

1. 표준 입출력을 File Redirection하는 경우

cat < hello1.txt > hello2.txt

위 예시의 경우, hello1.txt 파일의 내용이 cat에 전달. cat에 전달된 내용이 다시 hello2.txt로 전달. 즉, hello1.txt의 내용이 hello2.txt에 이어서 작성되고 저장된다. 단순하게 hello1.txt

2. 표준 오류 출력을 File Redirection하는 경우

위 경우, hi라는 디렉터리가 없기 때문에 cd hi를 입력하면 오류가 발생한다. 그렇기 때문에 test.txt 파일에  File Redirection을 시도해도 오류가 발생한다. 하지만 표준 오류 출력 형식(2>)을 사용하면 해당 오류 문구가 test.txt 파일에 올바르게 전달되어 입력되는 것을 확인할 수 있다.

 

grep [옵션] 패턴 [파일명]

우선, grep은 리눅스에서 문자열을 검색할 때 가장 많이 사용되는 명령어. 이 명령어는 리눅스의 pipe 기능을 사용할 때 함께 자주 쓰이는 명령어이기 때문에 상기시키는 용도로 다시 이 글에도 적어봤다.

파일명 대신 *를 입력하면 모든 파일에서 검색하고, 패턴은 정규 표현식을 이용한 문자열 패턴을 의미한다.

옵션
-i : 대소문자 구분 없이 검색
-v : 패턴과 일치하지 않는 행을 출력
-c : 패턴과 일치하는 행의 개수 출력
-w : 패턴과 단어 단위로 매칭되어야 출력

 

Pipe

둘 이상의 명령어를 묶어서 출력의 결과를 다른 명령으로 전환할 수 있는 기능. 명령어의 표준 출력을 또 다른 명령어의 표준 입력으로 연결하며, | 기호를 통해 명령어와 명령어를 연결한다.

ls | grep .py  # 현재 디렉터리의 목록 중 .py가 들어가는 파일이나 디렉터리의 목록 출력

 

아래 예시와 같이 File Redirection과 Pipe 기능을 동시에 사용할 수도 있다.

ls | grep .py > test.txt  # .py가 들어간 파일이나 디렉터리 목록을 test.txt에 이어서 작성

 

잠깐!

이렇게 보면 File Redirection과 Pipe가 같은 기능이라고 느껴질 수도 있다. 하지만 둘은 엄연하게 보면 다른 기능이다.

우선, File Redirection은 파일을 표준 스트림으로 사용하고, Pipe는 각 프로세스가 다른 프로세스를 표준 입력 스트림으로 사용한다는 점이 다르다. 즉, File Redirection은 파일의 표준 스트림을 다른 파일의 입력으로, Pipe는 프로세스의 결과를 다른 파일의 입력으로 사용한다는 것이다.

예를 들어, hello라는 문자열이 저장된 hello.txt 파일이 있다고 해보자. 이 파일의 내용을 test.txt 파일에도 작성하고 싶을 때 아래와 같이 각 기능을 사용하여 작성할 수 있다.

hello.txt > test.txt  # File Redirection
cat hello.txt | grep [a-z] > test.txt  # Pipe를 이용한 결과를 다시 File Redirection

첫 줄은 File Redirection을 통해 hello.txt의 표준 출력이 바로 test.txt의 표준 입력으로 사용되었고, 두 번째 줄은 Pipe를 이용한 cat의 명령 프로세스 결과가 File Redirection을 통해 test.txt의 표준 입력으로 사용되었다.

이런 예시를 통해 각 기능이 정확히 어떤 원리로 구현되는 것인지 알면서, 각 상황에 알맞게 효율적으로 사용할 줄 알아야 한다고 생각했다.