24. Use Input Output Redirection
개요
이 문서는 sort와 grep 같은 유틸리티를 사용하여 Linux에서 입력과 출력을 리다이렉션하는 방법을 설명합니다. 대부분의 Linux 프로그램은 표준 입력(키보드/파일)에서 읽고 표준 출력(터미널)에 쓰지만, 리다이렉션 연산자를 사용하면 이러한 기본 동작을 변경할 수 있습니다.
파일 내용 정렬
sort 유틸리티는 파일을 읽고, 내용을 처리한 후 기본적으로 정렬된 출력을 터미널에 표시합니다.
출력 리다이렉션
> 연산자를 사용하면 명령어 출력을 파일에 저장합니다:
sort file.txt > sorted_file.txt
중요: 이는 기존 파일을 덮어씁니다. 대신 추가하려면 >>를 사용합니다:
date >> file.txt
1 접두사로 표준 출력을 명시적으로 참조할 수도 있습니다:
date 1> file.txt
세 가지 데이터 스트림
Linux 명령어는 세 가지 기본 데이터 스트림을 사용합니다:
- STDIN: 기본 입력 소스
- STDOUT: 일반 출력 대상
- STDERR: 오 류 메시지 및 경고 대상
특정 스트림을 리다이렉션할 때 STDOUT에는 1, STDERR에는 2 접두사를 사용합니다.
오류 메시지 리다이렉션
2>를 사용하여 오류를 파일로 보냅니다:
grep -r '^The' /etc/ 2>errors.txt
/dev/null로 리다이렉션하여 오류를 무시합니다:
grep -r '^The' /etc/ 2>/dev/null
출력 스트림 결합
2>&1을 사용하여 STDERR와 STDOUT을 하나의 파일로 병합합니다:
grep -r '^The' /etc/ >all_output.txt 2>&1
중요: 배치 순서가 중요합니다 — 2>&1은 출력 파일 지정 다음에 위치해야 합니다.
입력 리다이렉션
<를 사용하여 키보드 입력을 기대하는 명령어에 파일 내용을 제공합니다:
sendemail [email protected] < emailcontent.txt
히어 문서 및 히어 문자열
** 히어 문서(here document)**는 구분자를 사용하여 여러 입력 줄을 전달합니다:
sort <<EOF
6
3
2
EOF
**히어 문자열(here string)**은 단일 줄 입력을 제공합니다:
bc <<< 1+2+3+4
명령어 파이프 연결
파이프(|)는 명령어를 연결하여 한 명령어의 출력을 다른 명령어의 입력으로 전달합니다. 예시:
grep -v '^#' /etc/login.defs | sort | column -t
이는 주석을 제거하고, 출력을 정렬하고, 열로 형식을 지정합니다. 파이핑이 강력한 워크플로우를 가능하게 하는 방법을 보여줍니다.
sed 명령어
sed (Stream EDitor)는 텍스트 스트림이나 파일에서 텍스트를 변환, 삭제, 추출하는 비대화형 편집 도구입니다. 입력을 한 줄씩 읽으면서 지정한 패턴에 따라 처리합니다.
기본 문법
sed [옵션] '명령어' 파일명
주요 예시
텍스트 치환 (s)
# 첫 번째 일치 항목만 치환
sed 's/hello/world/' file.txt
# 줄의 모든 일치 항목 치환 (g 플래그)
sed 's/hello/world/g' file.txt
# 파일을 직접 수정 (-i 옵션)
sed -i 's/hello/world/g' file.txt
# 특정 줄 범위(500~2000)에서만 치환 — 범위는 s 앞에 붙임
sed -i '500,2000s/enabled/disabled/g' /home/bob/values.conf
특정 줄 삭제 (d)
# 3번째 줄 삭제
sed '3d' file.txt
# 주석 줄(#으로 시작) 삭제
sed '/^#/d' file.txt
# 빈 줄 삭제
sed '/^$/d' file.txt
파이프와 함께 사용
# grep 결과에서 연속된 공백을 하나로 줄이기
grep 'error' log.txt | sed 's/ */ /g'
# /etc/login.defs에서 주석·빈 줄 제거 후 정렬
grep -v '^#' /etc/login.defs | sed '/^$/d' | sort
sed는 파이프(|)와 함께 사용하면 강력한 텍스트 처리 파이프라인을 구성할 수 있습니다. -i 옵션 없이는 원본 파일을 수정하지 않고 출력만 변경합니다.