본문 바로가기
CS/Shell scripts

Linux 명령어 'awk' 로 원하는 부분만 출력하기 - 1

by Warehaus 2021. 6. 24.

AWK

AWK(오크;Aho Weinberger Kernighan)는 유닉스에서 처음 개발된 일반 스크립트 언어이다. AWK의 기본 기능은 텍스트 형태로 되어있는 입력 데이터를 행과 단어 별로 처리해 출력하는 것이다. AWK라는 이름은 이 스크립트 언어를 만든 앨프리드 에이호, 피터 와인버거, 브라이언 커니핸 세 명의 성의 앞글자를 따서 붙여졌다.
출처 : 위키피디아 ( https://ko.wikipedia.org/wiki/AWK )

업무를 하다보면 정말 자주쓰는 명령어인데 .. 계속해서 잘못쓰고, 또 찾아보고를 반복한다.

정말 자주쓰는 경우가 process id를 출력해서 kill을 해준다거나, 특정 파일에서 원하는 부분 만 출력해서 뽑아내고 싶을때 사용한다.

아래처럼 프로세스를 조회하는 쉘 스크립트를 만들고

#!/usr/bin/bash

ps -ef  | grep root

출력을 확인해 보면 다음과 같이 나온다.

......
root         107       2  0 00:13 ?        00:00:00 [kstrp]
root         110       2  0 00:13 ?        00:00:00 [zswap-shrink]
root         111       2  0 00:13 ?        00:00:00 [kworker/u3:0]
root         116       2  0 00:13 ?        00:00:00 [charger_manager]
root         150       2  0 00:13 ?        00:00:00 [scsi_eh_2]
root         152       2  0 00:13 ?        00:00:00 [scsi_tmf_2]
root         154       2  0 00:13 ?        00:00:02 [kworker/0:1H-kblockd]
root         174       2  0 00:13 ?        00:00:00 [jbd2/sda5-8]
root         175       2  0 00:13 ?        00:00:00 [ext4-rsv-conver]
root         214       1  0 00:13 ?        00:00:01 /lib/systemd/systemd-journald
root         231       2  0 00:13 ?        00:00:00 [kworker/0:4-events]
root         236       1  0 00:13 ?        00:00:00 /lib/systemd/systemd-udevd
root         237       2  0 00:13 ?        00:00:00 [irq/18-vmwgfx]
root         238       2  0 00:13 ?        00:00:00 [ttm_swap]
root         249       2  0 00:13 ?        00:00:00 [loop0]
root         251       2  0 00:13 ?        00:00:00 [loop2]
root         263       2  0 00:13 ?        00:00:00 [loop3]
root         264       2  0 00:13 ?        00:00:00 [loop4]
root         267       2  0 00:13 ?        00:00:00 [loop5]
root         268       2  0 00:13 ?        00:00:00 [loop6]
root         275       2  0 00:13 ?        00:00:00 [loop7]
root         276       2  0 00:13 ?        00:00:00 [loop8]
root         277       2  0 00:13 ?        00:00:00 [loop9]
root         284       2  0 00:13 ?        00:00:00 [iprt-VBoxWQueue]
root         501       1  0 00:13 ?        00:00:00 /usr/lib/accountsservice/accounts-daemon
root         502       1  0 00:13 ?        00:00:00 /usr/sbin/acpid
root         510       1  0 00:13 ?        00:00:00 /usr/sbin/cron -f
root         513       1  0 00:13 ?        00:00:00 /usr/sbin/NetworkManager --no-daemon
root         523       1  0 00:13 ?        00:00:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root         527       1  0 00:13 ?        00:00:01 /usr/lib/policykit-1/polkitd --no-debug
root         539       1  0 00:13 ?        00:00:04 /usr/lib/snapd/snapd
root         540       1  0 00:13 ?        00:00:00 /usr/libexec/switcheroo-control
root         543       1  0 00:13 ?        00:00:00 /lib/systemd/systemd-logind
root         547       1  0 00:13 ?        00:00:00 /usr/lib/udisks2/udisksd
root         552       1  0 00:13 ?        00:00:00 /sbin/wpa_supplicant -u -s -O /run/wpa_supplicant
avahi        564     505  0 00:13 ?        00:00:00 avahi-daemon: chroot helper
root         597       1  0 00:13 ?        00:00:00 /usr/sbin/cupsd -l
root         604       1  0 00:13 ?        00:00:00 /usr/sbin/cups-browsed
root         606       1  0 00:13 ?        00:00:00 /usr/sbin/ModemManager --filter-policy=strict
root         618       1  0 00:14 ?        00:00:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
root         864       1  0 00:14 ?        00:00:00 /usr/sbin/gdm3
root         874       1  0 00:14 ?        00:00:00 /usr/sbin/VBoxService --pidfile /var/run/vboxadd-service.sh
root         996       1  0 00:14 ?        00:00:00 /usr/lib/upower/upowerd
root        1250       2  0 00:14 ?        00:00:00 [loop10]
root        1385     864  0 00:15 ?        00:00:00 gdm-session-worker [pam/gdm-password]
root        2450       2  0 00:24 ?        00:00:00 [kworker/u2:0-events_power_efficient]

여기서 프로세스를 Kill 하기 위해서 pid만 알아야 할 때가 있는데, 나는 주로 이런 경우에 awk 를 사용한다.

#!/usr/bin/bash

# ps -ef | grep root 까지는 root가 실행한 ps 명령의 결과를 보여준다.
# 그 뒤 pipe를 통해 결과를 awk로 전달하고, awk는 quotation (') 내에서
# 두번 째 항목 '$2' 을 'print' 해 준다.
# ps -ef 에서 2 번째 항목은 pid 였으니, pid만 출력이 된다.

ps -ef | grep root | awk '{print $2}'

/////////////// 출력 /////////////////
.....
93
94
96
97
98
107
110
111
116
150
152
154
174
175
214
231
236
237
238
249
251
263
264
267
268
275
276
277
284
501
502
510
513
523
527
539
540
543
547
552
564
597
604
606
618
864
874
996
1250
1385
2450

awk 사용사례는 정말 무궁무진하다. 생각이 나는대로 계속 정리해서 참고해 볼 예정이다.