ํ์ดํ(|)์ ๋ฆฌ๋ค์ด๋ ์ (>, >>, <)์ ๋ฆฌ๋ ์ค ๋ช ๋ น์ด๋ฅผ ์กฐํฉํ๋ ํต์ฌ ๊ธฐ๋ฅ์ ๋๋ค. ์ถ๋ ฅ๊ณผ ์ ๋ ฅ์ ์ฐ๊ฒฐํ๊ณ ํ์ผ๋ก ์ ์ฅํ๋ ์๋ฆฌ๋ถํฐ ์ค์ ์์ ๊น์ง ์๋ฒฝํ ์ ๋ฆฌํ์ต๋๋ค.
1. ํ์ดํ์ ๋ฆฌ๋ค์ด๋ ์ ์ด ์ ์ค์ํ๊ฐ?

๋ฆฌ๋
์ค ๋ช
๋ น์ด๋ฅผ ์กฐํฉํ๋ ์๊ฐ, CLI๋ ์ง์ง ๊ฐ๋ ฅํด์ง๋ค
๋ฆฌ๋
์ค ํ๊ฒฝ์ ์กฐ๊ธ ์ฐ๋ค ๋ณด๋ฉด ๋ชจ๋ ์ด๋ฐ ์๊ฐ์ ํ๋ค.
“๋ช ๋ น์ด ํ๋๋ง์ผ๋ก๋ ๋ถ์กฑํ๋ค.
๋ช ๋ น์ด๋ฅผ ์กฐํฉํด์ผ ์ง์ง ์ฌ๋ฏธ๊ฐ ์์๋๋ค.”
์๋ฅผ ๋ค์ด ํน์ ๋ก๊ทธ๋ฅผ ์ฝ๊ณ , ๊ทธ์ค ์ค๋ฅ๋ง ๊ฑธ๋ฌ๋ด๊ณ ,
๋ง์ง๋ง 20์ค๋ง ๋ณด๊ณ , ์ํ๋ ํ๋๋ง ๋ฝ์๋ด๋ ค ํ๋ค๊ณ ํด๋ณด์.
GUI ํ๋ก๊ทธ๋จ ์์ด๋ ์๋ ํ ์ค๋ก ๋๋๋ค.
cat system.log \
| grep "ERROR" \
| tail -20 \
| cut -d' ' -f3
์ด ์์ ๋ก์ด ์กฐํฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ํต์ฌ ๊ธฐ๋ฅ์ด ๋ฐ๋ก ํ์ดํ(pipe)์ ๋ฆฌ๋ค์ด๋ ์
(redirection)์ด๋ค.
์ด ๋ ๊ธฐ๋ฅ์ ์ ํํ ์ดํดํ๋ฉด, ๋ฆฌ๋
์ค ํ๊ฒฝ์ ํ์คํ “๋ด๊ฐ ํต์ ํ๋ ๊ณต๊ฐ”์ด ๋๋ค.
์ด ๊ธ์ ๋จ์ํ ์ค๋ช
์ด ์๋๋ผ, ์๋ฆฌ → ์ค์ → ์ค์ ๋ฐฉ์ง → ๊ณ ๊ธ ๊ธฐ๋ฒ๊น์ง
‘์ต์ข
๊ฐ์ด๋’ ์์ค์ผ๋ก ์ ๋ฆฌํ ๊ธ์ด๋ค.
2. ํ์ดํ(|)๋ ๋ฌด์์ธ๊ฐ?

์ ๋ช ๋ น์ด์ ์ถ๋ ฅ(STDOUT)์ ๋ค์ ๋ช ๋ น์ด์ ์ ๋ ฅ(STDIN)์ผ๋ก ์ ๋ฌํ๋ ๊ธฐ๋ฅ
ํ์:
command1 | command2
์ฆ, command1์ ๊ฒฐ๊ณผ๋ฅผ command2๊ฐ ๊ณ์ ์ฒ๋ฆฌํ๋ค.
3. ๋ฆฌ๋ค์ด๋ ์ ์ด๋ ๋ฌด์์ธ๊ฐ?

ํ๋ก๊ทธ๋จ์ ์ ๋ ฅ·์ถ๋ ฅ์ ํ์ผ/๋๋ฐ์ด์ค๋ก ์ฐ๊ฒฐํ๊ฑฐ๋ ์ฌ๋ฐฐ์นํ๋ ๊ธฐ๋ฅ
| ๊ธฐํธ | ์๋ฏธ |
| > | ์ถ๋ ฅ(๋ฎ์ด์ฐ๊ธฐ) |
| >> | ์ถ๋ ฅ(์ถ๊ฐ) |
| < | ์ ๋ ฅ |
| 2> | ์๋ฌ ์ถ๋ ฅ |
์ด ๊ธฐ๋ณธ ๋ค ๊ฐ์ง๋ง ์ดํดํด๋ ๋ฆฌ๋ ์ค ํ์ฉ๋๊ฐ ํฌ๊ฒ ์ฌ๋ผ๊ฐ๋ค.
4. ํ์ดํ(|) ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
1) grep๊ณผ ํจ๊ป ์ฌ์ฉ (๊ฐ์ฅ ํํ ์กฐํฉ)
dmesg | grep error
2) sort์ ํจ๊ป ์ฌ์ฉ
ls -l | sort -k5 -n
3) ์ฌ๋ฌ ํ์ดํ ์ฐ๊ฒฐ
ps aux | grep nginx | awk '{print $2}' | xargs kill
์ด ์กฐํฉ์ ์ค๋ฌด์์ ๋งค์ฐ ์์ฃผ ์ฌ์ฉ๋๋ค.
4) tail๋ก ๋ง์ง๋ง 50์ค๋ง ๋ณด๊ธฐ
journalctl -xe | tail -50
5. ํ์ดํ๋ "ํ์ค ์ถ๋ ฅ(STDOUT)"์ ์ ๋ฌํ๋ค
ํ๋ก์ธ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ ์ธ ๊ฐ์ง ์คํธ๋ฆผ์ ๊ฐ๋๋ค.

| ์คํธ๋ฆผ | ๋ฒํธ | ์๋ฏธ |
| STDIN | 0 | ์ ๋ ฅ |
| STDOUT | 1 | ์ถ๋ ฅ |
| STDERR | 2 | ์๋ฌ ์ถ๋ ฅ |
ํ์ดํ๋ STDOUT(1)๋ง ๋ค์ ๋ช ๋ น์ผ๋ก ๋๊ธด๋ค.
๋ฐ๋ผ์ ์๋ ๋ช ๋ น์ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ์ง ์๋๋ค.
command 2>/dev/null | grep something
์ด ๊ฐ๋ ์ ์๋ ๋ฆฌ๋ค์ด๋ ์ ๊ฐ๋ ๊ณผ ์ฐ๊ฒฐ๋๋ค.
6. ๋ฆฌ๋ค์ด๋ ์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
1) ์ถ๋ ฅ → ํ์ผ (๋ฎ์ด์ฐ๊ธฐ)
ls > out.txt
out.txt๊ฐ ๊ธฐ์กด์ ์์ผ๋ฉด ๋ฎ์ด์ด๋ค.
2) ์ถ๋ ฅ → ํ์ผ (์ถ๊ฐ)
echo "log entry" >> log.txt
append(์ถ๊ฐ) ํํ.
3) ํ์ผ → ์ ๋ ฅ(STDIN)
sort < names.txt
= cat names.txt | sort ์ ๋์ผ.
4) ์๋ฌ ์ถ๋ ฅ๋ง ์ ์ฅ
gcc test.c 2> error.log
5) STDOUT + STDERR ๋ชจ๋ ์ ์ฅ
./app &> full.log
7. ํ์ดํ + ๋ฆฌ๋ค์ด๋ ์ ์ ํจ๊ป ์ฌ์ฉํ๊ธฐ

1) STDOUT๋ง ์ ๋ฌํ๊ณ STDERR๋ ๋ฒ๋ฆฌ๋ ์กฐํฉ
command 2>/dev/null | grep result
2) STDOUT + STDERR ์ ๋ฌ
command 2>&1 | grep result
ํต์ฌ ๊ฐ๋
2>&1 → 2๋ฒ(์๋ฌ)์ 1๋ฒ(์ถ๋ ฅ)์ ํฉ์น๋ค
8. ์ค์ ์์ : ํ์ดํ & ๋ฆฌ๋ค์ด๋ ์ ์ง์ง ํ์ฉ
1) ์๋น์ค ์ํ์์ ํน์ ๋ฌธ์์ด๋ง ์ถ์ถ
systemctl status sshd | grep Active
2) ๊ฐ์ฅ ํฐ ํ์ผ 20๊ฐ ๋ณด๊ธฐ
du -ah . | sort -hr | head -20
3) ํฌํธ 80์ ์ฌ์ฉ ์ค์ธ PID ์ฐพ๊ธฐ
ss -tulnp | grep :80 | awk '{print $6}' | cut -d',' -f2
4) nginx ๋ก๊ทธ์์ ์๋ต 500๋ง ๋ณด๊ธฐ
cat access.log | grep " 500 " | tail -50
5) ๋ก๊ทธ ๋ฐฑ์
cat app.log > backup.log
6) ํ์ผ ์ค๋ณต ์ ๊ฑฐ
sort names.txt | uniq
7) ์ปค๋ ๋ก๊ทธ์์ “timeout” ๋ฌธ์์ด๋ง ๋ณด๊ธฐ
dmesg | grep -i timeout
8) ํ๊ฒฝ๋ณ์ ๋ฐฑ์
printenv > env_backup.txt
9) ์๋ฌ๋ง ๋ณ๋ ๋ก๊ทธ ์ ์ฅ
make 2> error.log
10) ์ ์ฒด ์ถ๋ ฅ ์ ์ฅ
make &> make_all.log
11) OpenWrt ํ๋ก์ธ์ค ์ด๋ฆ ํ์ธ
ps w | grep netifd | awk '{print $1}'
12) ๋์คํฌ ์ฌ์ฉ๋ ์์ 10๊ฐ
du -sh * | sort -rh | head
13) CPU ์ฌ์ฉ๋ฅ ๋์ ํ๋ก์ธ์ค ์ฐพ๊ธฐ
top -b -n 1 | grep -E "CPU|python|nginx"
14) ํฌํธ ์ค์บ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ๋ก ์ ์ฅ
nmap 127.0.0.1 > scan.txt
15) ping ์๋ต ์๊ฐ๋ง ๋ณด๊ธฐ
ping google.com | grep 'time='
16) ํ์ผ๋ฅผ ์ํ๋ฒณ ์์๋ก ์ ๋ ฌํ์ฌ ์ถ๋ ฅ
sort < list.txt
17) tail๊ณผ grep ์กฐํฉ (๋ก๊ทธ ์ค์๊ฐ ๋ถ์)
tail -f syslog | grep wlan0
18) JSON ์ถ๋ ฅ์์ ํน์ ํค ์ถ์ถ
curl -s http://api/test | grep temperature
19) ํ์ผ์์ ์ซ์๋ง ์ถ์ถ
cat file.txt | tr -cd '0-9\n'
20) ์ ธ ํจ์์ ๊ฒฐํฉ
logerr() {
"$@" 2>&1 | grep -i error
}
9. ํ์ดํ & ๋ฆฌ๋ค์ด๋ ์ ์๋ฆฌ

1) ํ๋ก์ธ์ค ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ปค๋์ด ์ฒ๋ฆฌํ๋ค
ํ์ดํ๋ ๋ค์๊ณผ ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.
command1 (write) → pipe → (read) command2
๋ชจ๋ ๋ฐ์ดํฐ๋ ์ปค๋ ๋ด๋ถ pipe buffer๋ฅผ ํตํด ์ ๋ฌ๋๋ค.
2) ๋ฆฌ๋ค์ด๋ ์ ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฌ๋ฐฐ์นํ๋ค
์:
ls > out.txt
์ ์๋ฏธ:
- STDOUT(1)์ out.txt๋ก ๋ฐ๊พผ๋ค
- ls๋ ์ฌ์ ํ STDOUT์ผ๋ก ์ถ๋ ฅํ๋ค๊ณ ์๊ฐ
- ํ์ง๋ง ์ปค๋์ ๊ทธ STDOUT์ ํ์ผ๋ก ๋ณด๋ด๋๋ก ์ค์ ๋จ
3) ๋ณต์กํ ํ์ค ์คํธ๋ฆผ ์กฐ์
์:
2>&1
์ ์๋ฏธ:
- STDERR(2)์ STDOUT(1)์ผ๋ก ๋ณด๋ธ๋ค
- ์ดํ STDOUT์ ํ์ดํ๋ ํ์ผ๋ก ์ ๋ฌ๋จ
10. FAQ
Q1. ํ์ดํ(|)๋ STDOUT๋ง ์ ๋ฌํ๋์?
๋ค. STDERR๋ ์ ๋ฌ๋์ง ์์.
Q2. ๊ทธ๋์ grep์ด ์๋ฌ ๋ฌธ์์ด์ ๋ชป ์ก๋ ๊ฑด๊ฐ์?
๋ง์. STDERR๋ฅผ ํฉ์ณ์ผ ํ๋ค.
command 2>&1 | grep error
Q3. tee๋ ๋ฌด์์ธ๊ฐ์?
ํ์ดํ ์ถ๋ ฅ๋ ๋ณด๊ณ ํ์ผ์๋ ์ ์ฅํ๋ ๋ช ๋ น์ด.
Q4. < ์ cat ํ์ผ | command ์ ์ฐจ์ด๋?
๋์ผํ๊ฒ ๋์ํ์ง๋ง <๊ฐ ๋ ํจ์จ์ ์.
Q5. >>๋ก ๋ก๊ทธ๊ฐ ์ปค์ ธ๋ ๋๋์?
์ฅ๊ธฐ ๋ก๊ทธ์๋ rotation ํ์.
Q6. ์ ์คํฌ๋ฆฝํธ์์ ํ์ดํ ์ค๋ฅ๊ฐ ๋ฌด์๋๋ ์ด์ ๋?
set -o pipefail์ ์ฌ์ฉํด์ผ ํ๋ค.
Q7. STDERR๋ง ํ์ดํ๋ก ๋๊ธธ ์ ์๋์?
๊ฐ๋ฅํจ:
command 2>&1 >/dev/null | next
Q8. ํ์ดํ๋ ๋ช ๊ฐ๊น์ง ์ฐ๊ฒฐํ ์ ์๋์?
์ ํ ์์.
Q9. zsh์ bash ์ฐจ์ด๋?
๋์ ๋ฐฉ์ ๋์ผํ์ง๋ง ์ผ๋ถ ์ธ๋ถ ๊ธฐ๋ฅ ๋ค๋ฆ.
Q10. ๋ฐฑ๊ทธ๋ผ์ด๋์ ํจ๊ป ์ธ ์ ์๋์?
๊ฐ๋ฅํ์ง๋ง ์กฐ์์ด ์ด๋ ค์.
11. ํ์ดํ์ ๋ฆฌ๋ค์ด๋ ์ ์ ๋ฆฌ๋ ์ค ์กฐํฉ์ ํต์ฌ์ด๋ค
์ด์ ์ฐ๋ฆฌ๋ ๋ค์์ ๋ชจ๋ ์ดํดํ๋ค.
- ํ์ดํ๋ ๋ช ๋ น์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ธฐ์
- ๋ฆฌ๋ค์ด๋ ์ ์ ์ ์ถ๋ ฅ์ ์ ์ดํ๋ ๊ธฐ์
- STDIN/STDOUT/STDERR ๊ตฌ์กฐ
- FD ์ฌ๋ฐฐ์น ์๋ฆฌ
- ์ค์ ์์ 20๊ฐ
- pipefail·UUOC ๋ฑ ์ค๋ฌดํ ํ
ํ์ดํ์ ๋ฆฌ๋ค์ด๋ ์
์ ์ดํดํ๋ ์๊ฐ,
๋ฆฌ๋
์ค ๋ช
๋ น์ด ํ์ฉ ์์ค์ ์์ ํ ์๋ก์ด ๋จ๊ณ๋ก ์ฌ๋ผ๊ฐ๋ค.
“๋ช ๋ น์ด๋ฅผ ์๋ ๊ฒ์ด ์๋๋ผ, ๋ช ๋ น์ด๋ฅผ ์กฐํฉํ๋ ๊ฒ์ด ์ง์ง ์ค๋ ฅ์ด๋ค.”