tee vs sed
Linux에서 tee
와 sed
사용법 (k8s.conf 예제 중심)
1. 개념
tee
- 표준 입력을 파일로 쓰는 명령어
-a
옵션이 있으면 → 기존 내용 뒤에 추가(append)-a
옵션이 없으면 → 기존 내용 덮어쓰기(overwrite)
sed
- 파일 내용을 읽어 특정 줄을 검색/수정/삭제하는 스트림 편집기
- 주로 기존 값 수정에 사용
2. 예제: /etc/sysctl.d/k8s.conf
2.1 기존 파일 내용
$ cat /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 0
3. tee
예제
3.1 내용 추가 (append)
cat << EOF | sudo tee -a /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
결과
net.ipv4.ip_forward = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
3.2 기존 내용 덮어쓰기 (overwrite)
cat << EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
결과
net.ipv4.ip_forward = 1
기존 모든 내용이 사라지고 새로운 내용만 남음
4. sed
예제
4.1 특정 값 수정
sudo sed -i 's/^net\.ipv4\.ip_forward.*/net.ipv4.ip_forward = 1/' /etc/sysctl.d/k8s.conf
- 의미:
net.ipv4.ip_forward
로 시작하는 줄을 찾아서= 1
로 변경 - 기존 값이
0
이든2
든 관계없이1
로 바뀜
4.2 특정 값만 추가 (존재하지 않을 경우)
grep -q '^net.bridge.bridge-nf-call-iptables' /etc/sysctl.d/k8s.conf || echo 'net.bridge.bridge-nf-call-iptables = 1' | sudo tee -a /etc/sysctl.d/k8s.conf
- 의미: 해당 설정이 없으면(
grep -q
로 확인), 맨 아래에 추가
4.3 여러 항목 한 번에 수정
sudo sed -i -e 's/^net\.bridge\.bridge-nf-call-ip6tables.*/net.bridge.bridge-nf-call-ip6tables = 1/' -e 's/^net\.bridge\.bridge-nf-call-iptables.*/net.bridge.bridge-nf-call-iptables = 1/' /etc/sysctl.d/k8s.conf
- 여러 줄을 한 번에 변경 가능
5. tee
vs sed
비교 표
목적 | 추천 명령어 | 예시 |
---|---|---|
파일 전체 새로 작성 | tee | tee /etc/sysctl.d/k8s.conf |
기존 내용 뒤에 추가 | tee -a | tee -a /etc/sysctl.d/k8s.conf |
특정 줄 값 수정 | sed | sed -i 's/^key.*/key = value/' file |
존재 여부 확인 후 추가 | grep +tee -a | `grep -q ‘^key’ file |
6. K8s 설정 예시
Kubernetes 설치 시 자주 추가하는 설정:
cat << EOF | sudo tee -a /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
7. 참고
tee
는 파일 작성/추가에 유리sed
는 기존 내용 수정에 유리- 설정 파일 작업 시 백업 권장:
sudo cp /etc/sysctl.d/k8s.conf /etc/sysctl.d/k8s.conf.bak