Shell(4):awk
一、実現機能
awkの基本的な使い方と例を理解します.
二、具体例
1.BEGINとEND
詳細:
BEGINの後にリストされた操作({}内)は、Unix awkがスキャン入力を開始する前に実行され、ENDの後にリストされた操作は、スキャン完全部の入力の後に実行されます.したがって,通常BEGINを用いて変数とプリセット(初期化)変数を表示し,ENDを用いて最終結果を出力する.
フォーマットの使用:awk -F: ‘BEGIN{ファイル処理前に実行されたコードブロック}{ファイル処理中に実行されたコードブロック}END{ファイル処理後に実行されたコードブロック}' filename
(1)endなし
(2)endを追加した後、endはすべての入力(読み取りファイルを含む)をスキャンした後に実行する必要があるため、ファイルを追加する必要がある.
(3)BEGINとENDを用いて/etc/passwd第1列を全体的に見る
(4)印刷テーブル構造
中間{}:行ごとに1回実行されます
2.フィールドの参照$(デフォルトの区切り文字はスペース)
$1は第1列、$2は第2列を表します.のnこのように推す. $0は入力レコード全体を表します.元のテキスト
印刷
3.区切り記号を指定します(デフォルトの区切り記号はスペース)
書式:
-F fs --field-separator=fs
(1)区切り記号-Fを指定し、第1列を印刷する
(2)セパレータ-Fを指定し、第1列と第3列を同時に印刷する
4.NR行数
(1)偶数行の印刷
(2)奇数行の印刷
5.NF 1行あたりのフィールド数
(1)印刷フィールド数が6より大きい行
(2)印刷列数が5より大きい総行数
6.適用例:統計apacheログシートipアクセス要求数ランキング
(1)apacheログapache_access.log
(2)各ipのアクセス量を統計する方法1
逆順序ソート
(3)各ipのアクセス量を統計する方法2
最終的には
三、参考
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
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