未加星标

Linux高级文本处理之gawk的使用

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二03 | 时间 2017 | 作者 红领巾 ] 0人收藏点击收藏
1.取出linux中eth0的IP地址 [[email protected] ~]# ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}'
192.168.1.8

说明: "+"为正则表达式模式匹配至少重复一次。

2.统计文件中所有行单词出现的次数 [[email protected] ~]# awk '
>{for(i=1;i<=NF;i++)
>{count[$i]++}}
>END{for(j in count)
>{print j,count[j]}}' /etc/init.d/functions 3.统计文件中每行的单词出现的次数 [[email protected] ~]# 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连接的各种状态数 [[email protected] ~]# ss -tan | awk '!/^State/{state[$1]++}END{for(i in state)print i,state[i]}'
ESTAB 1
LISTEN 4 5.统计制定的web访问日志中各ip的访问资源次数 [[email protected] ~]# 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访问内容的总大小($body bytes sent) $ 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:%d\n",$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 "Name\t\tID\n--------"} {print $1"\t\t"$3}' /etc/passwd 18.打印一个表头和表尾,并打印用户名,ID,及shell # awk -F: 'BEGIN{print "username ID shell"}{printf "%-20s%-10s%-10s\n",$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:%i\n" ,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.打印九九乘法表 [[email protected] ~]# 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.删除重复行 [[email protected] ~]# awk '!a[$0]++' num #!优先级高于++ 29.找出两个文件相同的行 [[email protected] ~]# awk 'FNR==NR{a[$0];next}($0 in a)' num num1

本文地址 : http://www.codesec.net/Linux/2017-02/140273.htm

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: LinuxNginx数据删除
分页:12
转载请注明
本文标题:Linux高级文本处理之gawk的使用
本站链接:http://www.codesec.net/view/530414.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(19)