1. 程式人生 > 實用技巧 >16.文字處理之awk--案例分析

16.文字處理之awk--案例分析

1.檔案host_list.log 如下格式,請提取”.magedu.com”前面的主機名部分並寫入到回到該檔案中。

1 www.magedu.com
2 blog.magedu.com
3 study.magedu.com
4 linux.magedu.com
5 python.magedu.com
......
999 study.magedu.com
[root@localhost /data]#cat host_list.log 
1 www.magedu.com
2 blog.magedu.com
3 study.magedu.com
4 linux.magedu.com
5 python.magedu.com
......
999 study.magedu.com
[root@localhost /data]#awk -F'[ .]' '{print $2}' host_list.log >> host_list.log 
[root@localhost /data]#cat host_list.log 
1 www.magedu.com
2 blog.magedu.com
3 study.magedu.com
4 linux.magedu.com
5 python.magedu.com
......
999 study.magedu.com
www
blog
study
linux
python

study

2.統計/etc/fstab檔案中每個檔案系統型別出現的次數。

[root@localhost /data]#awk -F'[[:space:]]+' '/^UUID/{print $3}' /etc/fstab |uniq -c
      3 xfs
      1 swap
[root@localhost /data]#cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Mon Aug  3 17:02:43 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=71b66acd-688f-45df-8d45-1d3cf606820f /                       xfs     defaults        0 0
UUID=1890737d-134e-49aa-a764-569a2bd251d8 /boot                   xfs     defaults        0 0
UUID=82c012a2-3f30-4649-ac90-e9896c20f829 /data                   xfs     defaults        0 0
UUID=87716ee2-fda6-41e2-9d46-4d42bd7bb257 swap                    swap    defaults        0 0

3.統計/etc/fstab檔案中每個單詞出現的次數。

[root@localhost /data]#cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Mon Aug  3 17:02:43 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=71b66acd-688f-45df-8d45-1d3cf606820f /                       xfs     defaults        0 0
UUID=1890737d-134e-49aa-a764-569a2bd251d8 /boot                   xfs     defaults        0 0
UUID=82c012a2-3f30-4649-ac90-e9896c20f829 /data                   xfs     defaults        0 0
UUID=87716ee2-fda6-41e2-9d46-4d42bd7bb257 swap                    swap    defaults        0 0
[root@localhost /data]#awk  '{for(i=1;i<=NF;i++)word[$i]++}END{for (a in word) print a,word[a]}'   /etc/fstab 
man 1
2020 1
and/or 1
maintained 1
xfs 3
Accessible 1
# 7
are 1
UUID=71b66acd-688f-45df-8d45-1d3cf606820f 1
defaults 4
blkid(8) 1
/ 1
0 8
See 1
3 1
Mon 1
Created 1
on 1
mount(8) 1
anaconda 1
fstab(5), 1
UUID=82c012a2-3f30-4649-ac90-e9896c20f829 1
/boot 1
findfs(8), 1
'/dev/disk' 1
by 2
/etc/fstab 1
pages 1
more 1
/data 1
UUID=87716ee2-fda6-41e2-9d46-4d42bd7bb257 1
info 1
UUID=1890737d-134e-49aa-a764-569a2bd251d8 1
Aug 1
swap 2
17:02:43 1
filesystems, 1
reference, 1
for 1
under 1

4.提取出字串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有數字。

[root@localhost /data]#echo "Yd$C@M05MB%9&Bdh7dq+YVixp3vpw" | awk  '{gsub(/[^0-9]/,"");print $0}'
05973

5.有一檔案記錄了1-100000之間隨機的整數共5000個,儲存的格式100,50,35,89…請取出其中最大和最小的整數。

[root@localhost /data]#for i in {1..5000};do echo -n $((($RANDOM+90000)%100000)),>>random.txt;done
[root@localhost /data]#awk -F, '{max=$1;min=$1;for(i=1;i<NF;i++){if($i>max){max=$i}else{if($i<min){min=$i}}}}END{print "最大值:"max,"最小值:"min}' random.txt 
最大值:99999 最小值:1

6.解決Dos攻擊生產案例:根據web日誌或者或者網路連線數,監控當某個IP併發連線數或者短時內PV達到100,即呼叫防火牆命令封掉對應的IP,監控頻率每隔5分鐘。防火牆命令為:iptables -A INPUT -s IP -j REJECT

[root@localhost /data]#ss -nt | awk -F " +|:" '{ip[$4]++}END{for(i in ip){if(ip[i]>100){system("iptables -A INPUT -s "i" -j REJECT")}}}'

7.將以下檔案內容中FQDN取出並根據其進行計數從高到低排序

http://mail.magedu.com/index.html
http://www.magedu.com/test.html
http://study.magedu.com/index.html
http://blog.magedu.com/index.html
http://www.magedu.com/images/logo.jpg
http://blog.magedu.com/20080102.html
http://www.magedu.com/images/magedu.jpg
[root@localhost /data]#awk -F"/" '{url[$3]++}END{for(i in url){print url[i],i}}' http.log |sort -nr
3 www.magedu.com
2 blog.magedu.com
1 study.magedu.com
1 mail.magedu.com
[root@localhost /data]#cat http.log 
http://mail.magedu.com/index.html
http://www.magedu.com/test.html
http://study.magedu.com/index.html
http://blog.magedu.com/index.html
http://www.magedu.com/images/logo.jpg
http://blog.magedu.com/20080102.html
http://www.magedu.com/images/magedu.jpg

8.將以下文字以inode為標記,對inode相同的counts進行累加,並且統計出同一inode中,beginnumber的最小值和endnumber的最大值

inode|beginnumber|endnumber|counts|
106|3363120000|3363129999|10000|
106|3368560000|3368579999|20000|
310|3337000000|3337000100|101|
310|3342950000|3342959999|10000|
310|3362120960|3362120961|2|
311|3313460102|3313469999|9898|
311|3313470000|3313499999|30000|
311|3362120962|3362120963|2|

輸出的結果格式為:

310|3337000000|3362120961|10103|
311|3313460102|3362120963|39900|
106|3363120000|3368579999|30000|