๊ฐœ๋ฐœ๋…ธํŠธ/Linux

[Linux] ํŒŒ์ดํ”„(|) & ๋ฆฌ๋‹ค์ด๋ ‰์…˜(>, >>, <) ๊ฐ€์ด๐Ÿ”ง

๋กœ๋กœ๋ฝœ 2025. 12. 29. 07:30

ํŒŒ์ดํ”„(|)์™€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜(>, >>, <)์€ ๋ฆฌ๋ˆ…์Šค ๋ช…๋ น์–ด๋ฅผ ์กฐํ•ฉํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ถœ๋ ฅ๊ณผ ์ž…๋ ฅ์„ ์—ฐ๊ฒฐํ•˜๊ณ  ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ์›๋ฆฌ๋ถ€ํ„ฐ ์‹ค์ „ ์˜ˆ์ œ๊นŒ์ง€ ์™„๋ฒฝํžˆ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

1. ํŒŒ์ดํ”„์™€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์ด ์™œ ์ค‘์š”ํ•œ๊ฐ€?

๋ฆฌ๋ˆ…์Šค ํŒŒ์ดํ”„์™€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์˜ ์ค‘์š”์„ฑ์„ ์‹œ๊ฐ์ ์œผ๋กœ ์„ค๋ช…ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ
Pipe & Redirection

๋ฆฌ๋ˆ…์Šค ๋ช…๋ น์–ด๋ฅผ ์กฐํ•ฉํ•˜๋Š” ์ˆœ๊ฐ„, CLI๋Š” ์ง„์งœ ๊ฐ•๋ ฅํ•ด์ง„๋‹ค
๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์„ ์กฐ๊ธˆ ์“ฐ๋‹ค ๋ณด๋ฉด ๋ชจ๋‘ ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ•œ๋‹ค.

“๋ช…๋ น์–ด ํ•˜๋‚˜๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋‹ค.
๋ช…๋ น์–ด๋ฅผ ์กฐํ•ฉํ•ด์•ผ ์ง„์งœ ์žฌ๋ฏธ๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.”

์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ๋กœ๊ทธ๋ฅผ ์ฝ๊ณ , ๊ทธ์ค‘ ์˜ค๋ฅ˜๋งŒ ๊ฑธ๋Ÿฌ๋‚ด๊ณ ,
๋งˆ์ง€๋ง‰ 20์ค„๋งŒ ๋ณด๊ณ , ์›ํ•˜๋Š” ํ•„๋“œ๋งŒ ๋ฝ‘์•„๋‚ด๋ ค ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž.

GUI ํ”„๋กœ๊ทธ๋žจ ์—†์ด๋„ ์•„๋ž˜ ํ•œ ์ค„๋กœ ๋๋‚œ๋‹ค.

cat system.log \
  | grep "ERROR" \
  | tail -20 \
  | cut -d' ' -f3
 

์ด ์ž์œ ๋กœ์šด ์กฐํ•ฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ ํŒŒ์ดํ”„(pipe)์™€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜(redirection)์ด๋‹ค.
์ด ๋‘ ๊ธฐ๋Šฅ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋ฉด, ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์€ ํ™•์‹คํžˆ “๋‚ด๊ฐ€ ํ†ต์ œํ•˜๋Š” ๊ณต๊ฐ„”์ด ๋œ๋‹ค.

์ด ๊ธ€์€ ๋‹จ์ˆœํ•œ ์„ค๋ช…์ด ์•„๋‹ˆ๋ผ, ์›๋ฆฌ → ์‹ค์ „ → ์‹ค์ˆ˜ ๋ฐฉ์ง€ → ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•๊นŒ์ง€
‘์ตœ์ข… ๊ฐ€์ด๋“œ’ ์ˆ˜์ค€์œผ๋กœ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.


2. ํŒŒ์ดํ”„(|)๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋ฆฌ๋ˆ…์Šค ํŒŒ์ดํ”„์˜ STDOUT์—์„œ STDIN์œผ๋กœ ํ๋ฅด๋Š” ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…
Pipe ๊ฐœ๋… ์„ค๋ช…

์•ž ๋ช…๋ น์–ด์˜ ์ถœ๋ ฅ(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)"์„ ์ „๋‹ฌํ•œ๋‹ค

ํ”„๋กœ์„ธ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์ŠคํŠธ๋ฆผ์„ ๊ฐ–๋Š”๋‹ค.

linux standard streams diagram
๋ฆฌ๋ˆ…์Šค ํ”„๋กœ์„ธ์Šค์˜ STDIN/STDOUT/STDERR ๊ด€๊ณ„ ๊ตฌ์กฐ


์ŠคํŠธ๋ฆผ ๋ฒˆํ˜ธ ์˜๋ฏธ
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. ํŒŒ์ดํ”„ + ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ

linux pipe redirection stdout stderr ํ๋ฆ„๋„
ํŒŒ์ดํ”„ + ๋ฆฌ๋‹ค์ด๋ ‰์…˜(STDOUT/STDERR) ์ฒ˜๋ฆฌ ๊ตฌ์กฐ

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. ํŒŒ์ดํ”„ & ๋ฆฌ๋‹ค์ด๋ ‰์…˜ ์›๋ฆฌ 

linux pipe redirection ์›๋ฆฌ๋ฅผ ๊ฐœ๊ตฌ๋ฆฌ ์บ๋ฆญํ„ฐ๊ฐ€ ์„ค๋ช…ํ•˜๋Š” 4์ปท ์›นํˆฐ
ํŒŒ์ดํ”„์™€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์˜ ๋™์ž‘ ์›๋ฆฌ

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 ๋“ฑ ์‹ค๋ฌดํ˜• ํŒ

ํŒŒ์ดํ”„์™€ ๋ฆฌ๋‹ค์ด๋ ‰์…˜์„ ์ดํ•ดํ•˜๋Š” ์ˆœ๊ฐ„,
๋ฆฌ๋ˆ…์Šค ๋ช…๋ น์–ด ํ™œ์šฉ ์ˆ˜์ค€์€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋‹จ๊ณ„๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.

“๋ช…๋ น์–ด๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ช…๋ น์–ด๋ฅผ ์กฐํ•ฉํ•˜๋Š” ๊ฒƒ์ด ์ง„์งœ ์‹ค๋ ฅ์ด๋‹ค.”