今天白眉的这篇文章主要是对awk 做练习,我们之前在 linux awk命令详解 (linux 三剑客之awk)
这篇文章中介绍 linux awk 的用法。 不多说了, 我们来练习吧!
准备内容:
cat -n /etc/passwd| head > ~/baimei.txt
(1)取出文件中的第5行
awk 'NR==5' baimei.txt
(2) 取出文件中大于7的所有行
awk 'NR>7' baimei.txt
(3)取出小于5的行
awk 'NR<5' baimei.txt
(4)取出大于3并且小于7的行
awk 'NR>3&& NR<7' baimei.txt
(5) 取出文件中包含root的行
awk '/root/' baimei.txt
(6) 取出文件中匹配root-adm之间的行
awk '/root/,/adm/' baimei.txt
(7) 取出文件中所有的用户名
awk -F':' '{print$1}' baimei.txt
(8) 取出文件中所有的解释器
awk -F':' '{print $NF}' baimei.txt
(9) 同时输出用户名的列和解释器的列以空格分隔
awk -F':' '{print $1, $NF}' baimei.txt
awk -F: '{print $1"---"$NF}' baimei.txt
(10) 只取出文件中的adm用户输出到屏幕上
awk -F: '$1=="adm" {print $1}' baimei.txt
(11)只取出文件中的root用户和adm用户输出到屏幕上
awk -F: '$1=="adm" || $1=="root" {print $1}' baimei.txt
(12)只取出root用户,并且在root用户前面加上 管理员字符
示例: 管理员: root
awk -F: '$1=="root" {print "管理员:" $1}' baimei.txt
(13)取出第三列等于0的行
awk -F: '$3==0 {print }' baimei.txt
(14)取出第三列大于5的行
awk -F: '$3>5 {print }' baimei.txt
(15)取出第三列大于0并且小于999的行
awk -F: '$3>0&&$3<999 ' baimei.txt
(16).取出第三列大于1000的行(先使用useradd baimei在统计大于1000的行)
cat /etc/passwd | awk -F: '$3>1000'
(17)统计管理员的个数
cat /etc/passwd | awk -F: '$NF=="/bin/bash"' |wc -l
(18) 统计虚拟用户的个数
cat /etc/passwd | awk -F: '$NF=="/sbin/nologin"' |wc -l
(19) 统计普通用户的个数
cat /etc/passwd | awk -F: '$3>1000' |wc -l
(20 )输出文件的行号
NF 中存储着每一行最后一列的列号,NR 中存储 行号
awk '{print NF,$1}' baimei.txt
复制以下内容到test.txt
lzy:--baimeidashu:-is a:/good boy!
(21)指定:-/为任意单个字符取出good字符
awk -F'[-: /]' '{print $(NF-1)}' test.txt
(22)指定:-/为连续的字符串取出good字符
awk -F':/' '{print$2 }' test.txt | awk -F' ' '{print $1}'
下载 下边 百度云 文件中的access.log上传到家目录
链接:https://pan.baidu.com/s/1qIra0LLyiK6VxkoqlFHZJw?pwd=saba
提取码:saba
然后解压:
unzip 02-【awk练习文件】access-服务的访问日志-v3.zip
出现 access.log 文件
aw
(22)取出access.log文件中所有的IP地址(第一列为IP),并取Top10
awk -F' - - ' '{print $1}' access.log
(23)取出access.log中上午8点-下午4点之间的总行数
awk -F'+0800' '{print $1}' access.log | awk -F: '$2>8&& $2<16 {print $2}' |wc -l
(24)取出access.log中上午8点-下午4点之间的IP的Top10、
awk -F'+0800' '{print $1}' access.log | awk -F: '$2>8&& $2<16 {print $1}' | awk -F'- - ' '{print$1}' |sort |uniq -c|sort -rn|head
(25).使用df -h命令,过滤出包含sda3的行(最少三种方法)
df -h | awk '/sda3/'
df -h| grep 'sda3'
df -h |sed -n '/sda3/p'
(26).统计下面文件中每个域名出现的次数
(注: 先取出域名在排序 域名类似: www.baidu.com取出后去重统计)
cat url.txt
http://www.baidu.com/index.html
http://www.sina.cn/1.html
http://www.weibo.com/index.html
http://www.baiduaaa.com/index.html
http://www.baidu.com/index.html
http://www.sina.cn/2.html
http://www.sina.com/index.html
http://www.baidu.cn/3.html
awk -F'://' '{print $2}' url.txt | awk -F'/' '{print$1}' |uniq -c|sort -rn
扩展题:(比较烧脑适可而止!)
使用awk的if判断统计虚拟用户数量
使用awk统计access.log的总行数
使用awk数组统计出passwd中最后一列解释器出现的次数
使用sed将文件内容逆序排序显示到屏幕
示例:
正常情况是:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
逆序后是:
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash