컴퓨터 사이언스

리눅스 리다이렉션과 파이프

woohap 2024. 11. 13. 01:10

리다이렉션

리다이렉션은 명령의 입력이나 출력을 파일이나 다른 장치로 보내거나 받을 수 있게 해주는 것

출력 리다이렉션(>)

// 명령어의 표준 출력을 파일로 보낸다. 파일이 이미 존재하는 경우 내용을 덮어쓴다.
ls > 파일목록.txt

출력 추가 리다이렉션(>>)

// 명령어의 표준 출력을 파일 끝에 추가한다. 파일이 없으면 새로 추가
echo "새로운 내용" >> 로그.txt

입력 리다이렉션(<)

// 파일의 내용을 명령어의 표준 입력으로 사용한다.
sort < 데이터.txt

표준 오류 리다이렉션(2>)

// 명령어의 표준 오류 출력을 파일로 보낸다.
gcc hello.c 2> 오류.log

컴파일 중 발생한 오류 메시지를 오류.log에 저장

표준 출력과 표준 오류를 모두 리다이렉션 (&> 또는 파일 2>&1)

명령어 &> 전체출력.log == 명령어 > 전체출력.log 2>&1

표준 출력과 표준 오류를 모두 전체출력.log 파일로 보낸다.

파일 디스크립터를 이용한 리다이렉션

0 - 표준 입력(stdin)
1 - 표준 출력 (stdout)
2 - 표준 오류 (stderr)
명령어 1> 출력.log 2> 오류.log 

표준 출력은 출력.log에 표준 오류는 오류.log에 저장한다.

파이프

한 명령어의 표준 출력을 다음 명령어의 표준 입력으로 연결하여 데이터를 전달하는 기능 
| 기호를 사용하여 파이프를 사용
// ls - 디렉토리 파일 목록 조회
// grep - 지정한 문자열이나 정규표현식을 포함한 행을 출력하는 명령어
// 현재 디렉토리 파일 목록을 grep 명령어의 입력으로 주어, 디렉토리만 필터링
ls -l | grep "^d"

파이프 활용 예시

// ps - 실행 중인 프로세스 목록 출력
// sort - 알파벳 순서로 정렬
// 실행 중인 프로그램 중 "apache"를 포함하는 프로세스를 정렬하여 표시 
// ps의 결과 -> grep의 입력 -> grep의 결과 -> sort의 입력 
ps aux | grep "apache" | sort 
// 시스템 로그에서 "error"를 포함하는 라인을 페이지 단위로 확인 
cat /var/log/syslog | grep "error" | less

리다이렉션과 파이프의 결합

// 데이터.txt애서 "검색어" 키워드가 포함된 라인만 필터링하고 
// 정렬하고 중복제거한 후 결과를 결과.txt에 저장
// uniq - 중복된 라인 제거, 연속된 동일한 라인만 중복으로 인식 
grep "검색어" 데이터.txt | sort | uniq > 결과.txt

Heredoc, Herestring

// 여기문자(Heredoc, <<)
// Heredoc, << 는 여러 줄의 입력을 명령어의 표준 입력으로 전달할 떄 사용 
// 메시지.txt 파일에 지정된 여러 줄의 내용을 저장한다.
cat << EOF > 메시지.txt
안녕하세요,
여기는 여러 줄의 텍스트를 입력할 수 있습니다.
감사합니다.
EOF
// 여기 스트링(Herestring, <<<)
// 한 줄의 문자열을 명령어의 표준 입력으로 전달할 때 사용
// "hello world"에서 "hello"를 찾는다. 
grep "hello" <<< "hello world"

/dev/null로 출력 버리기

/dev/null은 아무 내용도 저장하지 않는 특수 파일로, 출력이나 오류를 무시하고 싶을 때 사용

// /dev/null으로 표준출력과 표준 오류를 전달, 즉, 표시도지 않도록 처리 
명령어 > /dev/null 2>&1

리다이렉션과 파이프 차이점

[리다이렉션]
명령어의 표준 입출력을 파일이나 다른 스트림으로 변경

[파이프]
한 명령어의 출력을 다른 명령어의 입력으로 연결하여 데이터를 전달