首頁 > 軟體

Linux高階文字處理之gawk的使用

2020-06-16 17:22:15

1.取出linux中eth0的IP地址

[root@localhost ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}'
192.168.1.8

說明: "+"為正規表示式模式匹配至少重複一次。

2.統計檔案中所有行單詞出現的次數

[root@localhost ~]# awk '
>{for(i=1;i<=NF;i++)
>{count[$i]++}}
>END{for(j in count)
>{print j,count[j]}}' /etc/init.d/functions

3.統計檔案中每行的單詞出現的次數

[root@localhost ~]# awk '
>{for(i=1;i<=NF;i++)
>{count[$i]++};
>for(j in count)
>print j,count[j];
>delete count}' /etc/init.d/functions

4.統計當前系統上所有tcp連線的各種狀態數

[root@localhost ~]# ss -tan | awk '!/^State/{state[$1]++}END{for(i in state)print i,state[i]}'
ESTAB 1
LISTEN 4

5.統計制定的web存取紀錄檔中各ip的存取資源次數

[root@localhost ~]# awk '{ip[$1]++}END{for(i in ip) print i,ip[i]}' /var/log/httpd/access_log
192.168.1.101 3
192.168.1.6 297

6.Nginx紀錄檔分析

1)統計紀錄檔中存取最多的10個IP

思路:對第一列進行去重,並輸出出現的次數

方法1:

$ awk '{a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log

方法2:

$ awk '{print $1}' access.log |sort |uniq -c |sort -k1 -nr |head -n10

說明:a[$1]++ 建立陣列a,以第一列作為下標,使用運算子++作為陣列元素,元素初始值為0。處理一個IP時,下標是IP,元素加1,處理第二個IP時,下標是IP,元素加1,如果這個IP已經存在,則元素再加1,也就是這個IP出現了兩次,元素結果是2,以此類推。因此可以實現去重,統計出現次數。

2)統計紀錄檔中存取大於100次的IP

方法1:

$ awk '{a[$1]++}END{for(i in a){if(a[i]>100)print i,a[i]}}' access.log

方法2:

$ awk '{a[$1]++;if(a[$1]>100){b[$1]++}}END{for(i in b){print i,a[i]}}' access.log

說明:方法1是將結果儲存a陣列後,輸出時判斷符合要求的IP。方法2是將結果儲存a陣列時,並判斷符合要求的IP放到b陣列,最後列印b陣列的IP。

3)統計2016年4月9日一天內存取最多的10個IP

思路:先過濾出這個時間段的紀錄檔,然後去重,統計出現次數

方法1:

$ awk '$4>="[9/Apr/2016:00:00:01" && $4<="[9/Apr/2016:23:59:59" {a[$1]++}
END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log

方法2:

$ sed -n '/[9/Apr/2016:00:00:01/,/[9/Apr/2016:23:59:59/p'
access.log |sort |uniq -c |sort -k1 -nr |head -n10  #前提開始時間與結束時間紀錄檔中必須存在

4)統計當前時間前一分鐘的存取數

思路:先獲取當前時間前一分鐘對應紀錄檔格式的時間,再匹配統計

$ date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -vdate=$date '$0~date{c++}END{print c}' access.log

$ date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -vdate=$date 
'$4>="["date":00" && $4<="["date":59"{c++}END{print c}' access.log

$ grep -c $(date -d '-1 minute' +%d/%b/%Y:%H:%M) access.log

說明:date +%d/%b/%Y:%H:%M --> 09/Apr/2016:01:55

5)統計存取最多的前10個頁面($request)

$ awk '{a[$7]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log

6)統計每個URL存取內容的總大小($bodybytessent)

    $ awk '{a[$7]++;size[$7]+=$10}END{for(i in a)print a[i],size[i],i}' access.log

7)統計每個IP存取狀態碼數量($status)

    $ awk '{a[$1" "$9]++}END{for(i in a)print i,a[i]}' access.log

8)統計存取狀態碼為404的IP及出現次數

 

$ awk '{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}' access.log

7.只處理使用者ID為奇數的行,並列印使用者名稱和ID號

    # awk -F: '{if($3%2 == 0) next;print $1,$3}' /etc/passwd

8.顯示系統的普通使用者,並列印使用者及ID

# awk -F: '{if($3>=500)print $1,$3}' /etc/passwd

9.顯示系統使用者是“/bin/bash"的使用者,並列印使用者名稱

# awk -F: '{if($NF== "/bin/bash")print $1}' /etc/passwd

10.統計普通使用者的個數

# awk -F: -v sum=0 '{if($3>=500) sum++}END{print sum}' /etc/passwd

11.統計文字的總行數

# awk 'END{print NR}' /etc/passwd

12.利用awk顯示檔名

# awk 'END{print FILENAME}' /etc/fstab

13.格式化輸出統計資料

# awk -F: '{printf "username= %s UID:%dn",$1,$3}' /etc/passwd

14.只顯示ID為1000的使用者的相關資訊

# awk -F: '$3=="1000" {print $0}' /etc/passwd
mageedu:x:1000:1000:mageedu:/home/mageedu:/bin/bash

# awk -F: '$3=="1000" {print $1,$3,$NF}' /etc/passwd
mageedu 1000 /bin/bash

15.查詢“root”關鍵字的行

# awk '/[Rr]oot/' /etc/passwd

16.利用awk模擬tail -1 的效果

# awk 'END{ print }' /etc/passwd

17.列印一個錶頭,並且列印使用者名稱和ID

# awk -F: 'BEGIN{print "NamettIDn--------"} {print $1"tt"$3}' /etc/passwd

18.列印一個錶頭和表尾,並列印使用者名稱,ID,及shell

# awk -F: 'BEGIN{print "username    ID    shell"}{printf "%-20s%-10s%-10sn",$1,$3,$7}
END{print "-----end of report-----"}' /etc/passwd

19.對文字中的欄位進行字元個數統計

# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg

20.列印字元個數大於等於8的欄位

# awk -F: '{i=1;while(i<=NF){if(length($i)>=8){print $i};i++}}' /etc/passwd

21.統計系統中shell的型別,並列印shell參照的次數

# awk -F: '$NF!~/^$/{BASH[$NF]++}END{for(A in BASH){printf "%15s:%in" ,A,BASH[A]}}' /etc/passwd

22.統計fstab檔案中,各檔案系統被參照的次數

# awk '/^UUID/{filesystem[$3]++}END{for (i in filesystem) {print i,filesystem[i]}}' /etc/fstab

23.統計正與系統建立連線的IP地址(ESTABLISHED),並統計建立連線的連線數量

# netstat -tn | awk '/^tcp>/{split($5,ip,":");count[ip[1]]++}END{for(i in count)print i,count[i]}'
# netstat -tan | awk '{print $5}' | sort  -n | cut -d: -f1 | uniq -c | sort -n

24.將文字的重複行去掉

# awk '!a[$0]++' FILE      $ awk '{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}' access.log

25.列印偶數行

$ seq 1 5 |awk '!(i=!i)'

$ seq 1 5 |awk 'NR%2==0'

26.列印奇數行

$ seq 1 5 |awk 'i=!i'

$ seq 1 5 |awk 'NR%2!=0'

27.列印九九乘法表

[root@localhost ~]# awk '
>BEGIN{for(n=0;n++<9;)
>{for(i=0;i++<n;)
>printf i"x"n"="i*n" ";print ""}}'
1x1=1 
1x2=2 2x2=4 
1x3=3 2x3=6 3x3=9 
1x4=4 2x4=8 3x4=12 4x4=16 
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

28.刪除重複行

[root@localhost ~]# awk '!a[$0]++' num #!優先順序高於++

29.找出兩個檔案相同的行

[root@localhost ~]# awk 'FNR==NR{a[$0];next}($0 in a)' num num1

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-02/140273.htm


IT145.com E-mail:sddin#qq.com