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 사용사례는 정말 무궁무진하다. 생각이 나는대로 계속 정리해서 참고해 볼 예정이다.
'CS > Shell scripts' 카테고리의 다른 글
[Bash] Bash 스크립트에서 argument로 Option 을 처리 하는 방법 (0) | 2021.07.08 |
---|---|
[Bash] 쉘 스크립트 출력 시 개행이 안되는 경우 해결방법 (0) | 2021.06.24 |
[csh] c shell 에서 덧셈 구현 방법 (0) | 2021.06.16 |
Bash script 에서 사칙연산 구현하기 (0) | 2021.06.14 |
Bash script for loop 반복문 사용하기 (0) | 2021.06.14 |