[Linux] stdin, stdout, stderr, Redirection, pipe, awk

kafkaaaa·2023년 9월 20일
0

Linux

목록 보기
1/4
post-thumbnail

표준 입력/출력/에러 (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

profile
일모도원

0개의 댓글