Researcher to Developer

LINUX - Standard Stream, Redirection, Pipe (grep 명령어) 본문

코딩/Basic

LINUX - Standard Stream, Redirection, Pipe (grep 명령어)

Probe29 2020. 12. 27. 14:59

#Stardard Stream 표준 입출력

- LINUX 환경에서는 Command로 실행되는 프로세스는 3가지 스트림을 가지고 있다.

 

1. Standard Input Stream 표준 입력 스트림 : stdin

해당 command에 입력으로 주어지는 옵션이나 인자, 파일 등을 해당 프로세스에 넣어준다.

 

2. Standard Output Stream 표준 출력 스트림 : stdout

프로세스 실행 결과를 출력할 내용을 화면에 보여주는 것이 Default

 

3. Standard Error Stream 오류 출력 스트림 : stderr

프로세스를 실행하다보면 도중에 에러 메세지가 나올 수 있는데

그 내용을 화면에 출력하는 것이 Default

 

* 모든 스트림은 일반적인 plain text로 console(terminal)에 출력하도록 되어 있다.

 


 

#Dedirection 리다이렉션

표준 스트림 출력을 터미널이 아닌 다른 곳으로 바꿀 수 있다.

> , < 문자 기호를 사용한다. (A > B : A에서 B로) 

주로 명령어 표준 출력을 화면이 아닌 파일에서 출력할 때 사용하며

반대로 파일에서 터미널로 바꿀 수도 있다.

 

AWS 환경에서 예제를 통해 알아보자

 

 

 

1. ls > files.txt

ls 는 파일리스트를 출력해주는데

ls > files.txt 라고 입력하면

ls 로 출력되는 표준 출력 스트림의 방향을 files.txt로 바꿔준다는 말이다.

결과적으로 files.txt 파일에 ls로 출력되는 결과가 저장된다.

 

* ls -al > files.txt (기본적으로 files.txt 파일이 없다면 새로 생성하게 된다.)

 

 

2. head < files.txt

files.txt 라는 파일의 내용의 처음부터 10라인까지 head라는 파일에 출력해주는 명령으로 넣어진다.

결과적으로 files.txt의 앞 10라인이 출력된다.

 

이와 반대로 tail은 마지막 10라인을 출력한다.

 

 

3. head < files.txt > files2.txt

a. 먼저 files.txt의 파일 내용이 head로 들어가서 files.txt의 앞 10라인을 출력한다.

b. head의 출력 스트림은 다시 files2.txt로 들어간다.

c. head는 files.txt 내용을 출력하지 않고, 해당 출력 내용이 다시 files2.txt에 저아된다.

결과적으로 files.txt의 앞 10라인이 files2.txt에 저장된다.

만약 files2.txt 파일이 있었다면 기존에 있던 내용은 지워지고 새로운 내용이 저장된다. 즉 덮어써진다.

 

 

4. ls >> files.txt

기존 파일에 내용 추가는 >> 또는 << 를 사용한다.

결과적으로 기존에 있는 files.txt의 내용은 그대로 둔 채로 파일 내용 끝에 ls 출력 결과를 추가해준다.

 


 

* UNIX 철학

프로세스를 단순하게, 핵심에 집중하게 하고 사용자가 원하는 기능을 사용할 수 있게 한다.

 

 

 

#Pipe 파이프

두 프로세스 사이에서 한 프로세스의 출력 스트림을

다른 프로세스의 입력 스트림으로 사용할 때 사용된다.

 

AWS 환경에서 예제를 통해 알아보자

 

 

기본개념

| (shift + \) 로 사용한다.

ls 는 모든 파일리스트들의 표준 출력 스트림인데
ls 로 자기가 원하는 파일을 찾기 어려울 때
grep은 입력으로 들어오는 데이터 중에서 특정한 키워드와 관련된 데이터를 찾는 명령이다.

ex. is | gerp issue

 

ls | grep files.txt

a. ls 명령을 통한 출력 내용이 grep 명령의 입력 스트림으로 들어간다.

b. grep files.txt는 grep 명령의 입력 스트림을 검색해서 files.txt가 들어있는 입력 내용만 출력해준다.

결과적으로 ls 명령으로 해당 디렉토리/파일 중에 files.txt 파일이 있는지를 출력해준다.

 

 

 

grep

grep은 검색 명령어

grep [-option] [pattern] [file or directory name]
[option]

-i : 영문의 대소문자를 구별하지 않는다.

-v : pattern을 포함하지 않는 라인을 출력한다.
-n : 검색 결과의 각 행의 선두에 행 번호를 넣는다.(first line is 1)
-l : 파일명만 출력한다.
-c : 패턴과 일치하는 라인의 개수만 출력한다.
-r : 하위 디렉토리까지 검색한다.

 

grep python files.txt

files.txt 라는 파일에서 python 라는 문구가 들어간 모든 행을 출력

 

grep -n python files.txt

files.txt 라는 파일에서 python 라는 문구가 들어간 모든 행을 라인까지 출력

 

grep -r python fordername

fordername 라는 폴더 내의 모든 파일 중 python 라는 문구가 들어간 모든 행을 출력

 

grep -i python files.txt

files.txt 라는 파일에서 python 라는 문구를 대소문자 구분없이 검색해서 출력

 

grep -E "go|java|python"files.txt

files.txt 라는 파일에서 go또는 java 또는 python 이 있는 모든 행을 출력