Shell(4):awk

11430 ワード

一、実現機能
awkの基本的な使い方と例を理解します.
二、具体例
1.BEGINとEND
詳細:
BEGINの後にリストされた操作({}内)は、Unix awkがスキャン入力を開始する前に実行され、ENDの後にリストされた操作は、スキャン完全部の入力の後に実行されます.したがって,通常BEGINを用いて変数とプリセット(初期化)変数を表示し,ENDを用いて最終結果を出力する.
フォーマットの使用:awk -F:  ‘BEGIN{ファイル処理前に実行されたコードブロック}{ファイル処理中に実行されたコードブロック}END{ファイル処理後に実行されたコードブロック}'  filename
(1)endなし
[root@hadoop shellexercise]# awk 'BEGIN{array[1]="hello boy";array[2]="hello world";for(key in array) print key,array[key]}'       
1 hello boy
2 hello world

(2)endを追加した後、endはすべての入力(読み取りファイルを含む)をスキャンした後に実行する必要があるため、ファイルを追加する必要がある.
[root@hadoop shellexercise]# awk 'BEGIN{array[1]="hello boy";array[2]="hello world";}END {for(key in array) print key,array[key]}' /etc/hosts
1 hello boy
2 hello world

(3)BEGINとENDを用いて/etc/passwd第1列を全体的に見る
[root@hadoop shellexercise]# awk -F: 'BEGIN {print "     "} {print $1} END {print "      "}' /etc/passwd
     
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
...
      

(4)印刷テーブル構造
中間{}:行ごとに1回実行されます
[root@hadoop shellexercise]# head -2 /etc/passwd  |awk -F: 'BEGIN {print "*************"} {print "*   "$1"    *"}{print "*   "$2"    *"}{print "*    "$3"   *"}{print "*    "$4"    *"}{print "*    "$5"    *"}{print "*    "$6"    *"}{print "*    "$7"    *"} END  {print "*************"}'

*************
*   root    *
*   x    *
*    0   *
*    0    *
*    root    *
*    /root    *
*    /bin/bash    *
*   bin    *
*   x    *
*    1   *
*    1    *
*    bin    *
*    /bin    *
*    /sbin/nologin    *
**************

2.フィールドの参照$(デフォルトの区切り文字はスペース)
$1は第1列、$2は第2列を表します.のnこのように推す. $0は入力レコード全体を表します.元のテキスト
[root@hadoop shellexercise]# cat apache_access.log                 
10.0.0.41 22 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.43 43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.42 23 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.46 1 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.42 4 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.47 5 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.41 7 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.47 8 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.41 12 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.46 12 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

印刷
[root@hadoop shellexercise]# awk '{print $1}' apache_access.log 
10.0.0.41
10.0.0.43
10.0.0.42
10.0.0.46
10.0.0.42
10.0.0.47
10.0.0.41
10.0.0.47
10.0.0.41
10.0.0.46
[root@hadoop shellexercise]# awk '{print $0}' apache_access.log  
10.0.0.41 22 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.43 43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.42 23 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.46 1 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.42 4 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.47 5 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.41 7 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.47 8 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.41 12 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.46 12 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

3.区切り記号を指定します(デフォルトの区切り記号はスペース)
書式:
-F fs                   --field-separator=fs
(1)区切り記号-Fを指定し、第1列を印刷する
[root@hadoop shellexercise]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
......

(2)セパレータ-Fを指定し、第1列と第3列を同時に印刷する
[root@hadoop shellexercise]# awk -F: '{print $1"\thaha\t" $3}' /etc/passwd
root    haha    0
bin     haha    1
daemon  haha    2
adm     haha    3
lp      haha    4
sync    haha    5
shutdown        haha    6
halt    haha    7
mail    haha    8
......

4.NR行数
(1)偶数行の印刷
[root@hadoop shellexercise]# awk -F: 'NR%2==0 {print NR,$0}' /etc/passwd
2 bin:x:1:1:bin:/bin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
8 halt:x:7:0:halt:/sbin:/sbin/halt
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
12 games:x:12:100:games:/usr/games:/sbin/nologin
14 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
16 dbus:x:81:81:System message bus:/:/sbin/nologin
18 vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
20 rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
22 abrt:x:173:173::/etc/abrt:/sbin/nologin
24 nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
26 gdm:x:42:42::/var/lib/gdm:/sbin/nologin
28 apache:x:48:48:Apache:/var/www:/sbin/nologin
30 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
32 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
34 ibeifeng:x:501:501::/home/ibeifeng:/bin/bash
36 beifeng:x:502:503::/home/beifeng:/bin/bash
38 deploy:x:504:505::/home/deploy:/bin/bash
40 elastic:x:505:506::/home/elastic:/bin/bash

(2)奇数行の印刷
[root@hadoop shellexercise]# awk -F: 'NR%2==1 {print NR,$0}' /etc/passwd 
1 root:x:0:0:root:/root:/bin/bash
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
11 operator:x:11:0:operator:/root:/sbin/nologin
13 gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
15 nobody:x:99:99:Nobody:/:/sbin/nologin
17 usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
19 rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
21 avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
23 rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
25 haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
27 ntp:x:38:38::/etc/ntp:/sbin/nologin
29 saslauth:x:498:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
31 pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
33 tcpdump:x:72:72::/:/sbin/nologin
35 mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
37 guoqing:x:503:504::/home/guoqing:/bin/bash
39 jenkins:x:496:493:Jenkins Automation Server:/var/lib/jenkins:/bin/false

5.NF 1行あたりのフィールド数
(1)印刷フィールド数が6より大きい行
[root@hadoop shellexercise]# awk -F: 'NF>6 {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
saslauth:x:498:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
ibeifeng:x:501:501::/home/ibeifeng:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
beifeng:x:502:503::/home/beifeng:/bin/bash
guoqing:x:503:504::/home/guoqing:/bin/bash
deploy:x:504:505::/home/deploy:/bin/bash
jenkins:x:496:493:Jenkins Automation Server:/var/lib/jenkins:/bin/false
elastic:x:505:506::/home/elastic:/bin/bash

(2)印刷列数が5より大きい総行数
[root@hadoop shellexercise]# awk -F: 'BEGIN {a=0} { if (NF>5) a=a+1} END {print a}' /etc/passwd
40

6.適用例:統計apacheログシートipアクセス要求数ランキング
(1)apacheログapache_access.log
[root@hadoop shellexercise]# cat apache_access.log 
10.0.0.41 22 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.43 43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.42 23 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.46 1 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.42 4 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.47 5 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.41 7 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.47 8 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.41 12 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10.0.0.46 12 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

(2)各ipのアクセス量を統計する方法1
[root@hadoop shellexercise]# awk  '{++S[$1]} END{for(k in S) print k,S[k]}' apache_access.log    
10.0.0.46 2
10.0.0.47 2
10.0.0.41 3
10.0.0.42 2
10.0.0.43 1

逆順序ソート
[root@hadoop shellexercise]# awk  '{++S[$1]} END{for(k in S) print k,S[k]}' apache_access.log | sort -k2nr
10.0.0.41 3
10.0.0.42 2
10.0.0.46 2
10.0.0.47 2
10.0.0.43 1

(3)各ipのアクセス量を統計する方法2
[root@hadoop shellexercise]# awk '{print $1}' apache_access.log | sort| uniq -c 
      3 10.0.0.41
      2 10.0.0.42
      1 10.0.0.43
      2 10.0.0.46
      2 10.0.0.47

最終的には
[root@hadoop shellexercise]# awk '{print $1}' apache_access.log | sort| uniq -c |sort -k1nr    
      3 10.0.0.41
      2 10.0.0.42
      2 10.0.0.46
      2 10.0.0.47
      1 10.0.0.43

三、参考
1.Linux awkにおけるBEGINとENDの使い方https://blog.csdn.net/HeatDeath/article/details/81632958 2.awk配列命令経典生産実戦応用開拓https://blog.51cto.com/oldboy/1184177 3.linux netstat出力のネットワーク接続状態情報の詳細https://blog.51cto.com/oldboy/1184139