표준 입력/출력/에러 (stdin, stdout, stderr)
이 3가지를 표준 I/O 스트림 이라고 하며
운영체제에서 기본적으로 제공하는 추상화된 입출력장치를 의미한다.
스트림(stream) : 바이트의 흐름 / 데이터의 이동 통로
📌stdin
- standard input (표준 입력)
- 프로그램에 대한 입력을 나타내는 stream
- 일반적으로 키보드에 해당
- File Descriptor 0
📌stdout
- standard output (표준 출력)
- 출력을 위한 스트림으로 일반적으로 현재 shell을 실행한 console이나 terminal
- File Descriptor 1
📌stderr
- standard error (표준 오류)
- 디버깅 정보나 에러를 출력하는데 사용
- File Descriptor 2
- ※ stderr로 받는 문자열은 grep이 되지 않음 (stderr는 Unbuffered로 출력만 하기 때문)
- 예를 들어
echo foo
를 실행했을 때,
echo 명령어는 command line의 argument인 foo
를 받는다. (stdin이 받는 것이 아님)
그러고 나서 출력값을 stdout
으로 넘긴다.
💡 echo 명령어란?
📌Redirection
스트림의 방향을 재지정한다
>
- 명령어의 출력 방향을 파일로
- 🚨 덮어 쓰기
- [명령어] > [파일]
echo foo > temp.txt
의미는
temp.txt 파일이 (기존에 없었다면) 생성되고 foo라는 내용이 저장됨.
만약 기존에 temp.txt 파일이 있었다면 덮어쓰기가 되니 주의
-
>>
- 추가 (덧붙이기)
- [명령어] >> [파일]
echo foo >> temp.txt
- '>' 와 같지만 기존에 존재하는 파일의 뒤에 이어서 붙일 때 사용.
-
<
- 입력 redirection
- [명령어] < [파일]
tail < foo.txt > bar.txt
의미는
- foo.txt의 마지막 10줄의 내용을 bar.txt에 출력하라.
📌 tail 명령어란?
📌pipe |
-
파일X, 프로세스 <-> 프로세스 간에 데이터 전달 통로
-
어떤 프로그램의 출력 결과를 다른 프로그램의 입력 값으로 쓰는 등
-
파이프를 이용하여 많은 프로그램들을 연결할 수 있는 매우 강력한 기능임
-
buffer를 사용함
-
command 1 | command 2
: command1의 output이 commmand2의 input으로 전달됨
-
ex) ps -ef | grep bash
ps -ef
: -e(실행중인 모든 process), -f(자세한 정보)
| grep bash
: ps -ef의 결과 中 bash를 포함한 결과만 추출
wc
- word count
wc [옵션: -c/l/L/w] [파일명]
- -c : byte 수 출력
- -l : line 수 출력
- -L : 가장 긴 행의 문자 개수 출력
- -w : 단어 개수 출력
- 옵션을 지정하지 않으면 line수, 단어 개수, 바이트 순으로 출력됨
head / tail
- 파일의 앞부분 / 뒷부분 출력
head -5 abc.txt
: abc.txt의 앞 5줄 출력
tail -3 abc.txt
: abc.txt의 뒤 3줄 출력
- 줄 수를 생략하면 default값은 10줄
tail -f [파일명]
- -f 옵션을 붙이면 tail 명령이 종료하지 않고
해당 파일의 변화를 실시간으로 확인할 수 있음
(로그 파일, 모니터링 용도로 자주 쓰인다고 하네요)
grep
- Global Regular Expression Print
grep [옵션] [문자열 or 정규표현식] [파일명]
- 파일 내용에서 특정 문자열을 찾을 때 사용
grep "hello" a.txt
: a.txt 파일에서 hello 포함된 부분 출력
grep "hello" *
: 현재 dir의 모든 파일에서 hello 포함된 부분 출력
grep [정규표현식] a.txt
grep "a*" a.txt
: a.txt 파일에서 a로 시작하는 문자열 찾기
grep [a-c] a.txt
: a.txt 파일에서 {a,b,c}로 시작하는 문자열 찾기
- grep의 옵션은 굉장히 많다. 참고 -> 📌grep 명령어 옵션
- 문자열이나 정규표현식을 쓸 때 쌍따옴표와 일반 따옴표의 차이는
쌍따옴표는 ₩, $, \ 등의 특수한 기호가 포함될때 사용해야 한다는 것 뿐이다.
📌AWK
- AWK는 영문 약어가 아니고 만든 사람의 앞글자를 따왔다고 한다..
- AWK는 Unix 스크립트 언어로 텍스트가 저장되어 있는 파일을 원하는대로 필터링이나 연산한 결과를 행과 열 형태로 출력해준다.
- DB에서 처럼 필드(Field)와 레코드(Record)를 사용한다.
- AWK는 관련 내용이 너무 길어서 일단 정리를 너무 잘하신 분들의 링크를 걸어두겠다.
Ref
https://www.lesstif.com/lpt/stdin-stdout-stderr-113346293.html
https://github.com/kennyyu/bootcamp-unix/wiki/stdin,-stdout,-stderr,-and-pipes
https://devmoony.tistory.com/115