第1章 原题及讲解视频
1.1 原题地址:
[面试题]老男孩教育 -三剑客笔试题集合
https://www.jianshu.com/p/61d8883719ac
1.2 讲解视频地址
面试题讲解系列-三剑客面试题 -三十道面试题让你玩转 sed 和 awk
https://www.bilibili.com/video/av51101676
第2章 三剑客-基础部分题目
每道题目尽量 多种方法
涉及到三剑客过滤 替换 取列操作 。
2.1 Linux 三剑客的题目如何 举一反三?
熟悉三剑客基本操作
grep
sed
awk
sed 和 awk 的 执行过程
只要遇到三剑客或 find 题目,多种方法。
2.2 选择
2.2.1 在给定文件中查找与条件相符字符串的命令及查找某个目录下相应文件的命令为:(多选) AC
A:grep
B:gzip
C:find
D:sort
2.2.2 在给定文件中查找与设定条件相符字符串的命令为( grep)
2.2.3 (D) 命令可以从文本文件的每一行中截取指定内容的数据。
A cp
B dd
C fmt #根据参数重新显示 规划 每一行的内容 比如 每一行显示 10 个 字符 等等
D cut
2.2.4 下面表述错误的是 D
表示开头,如 ^abc 表示以 abc 开头的
表示结尾如 abc$ 表示以 abc 为结尾的
表示前一个字符出现 0 或 1 次,如 ab c 表示 a 与 c 之间可有 0 或 1 个 b 存在
表示前一个字符出现 0 或多次。如 ab+c 表示 a 与 c 之间可有 0 或多个 b 存在
2.3 填空
2.3.1 Unix 中在当前目录下所有 .cc 的文件中找到含有"asiainfo"内容的文件,命令为
[root@oldboy64-yl ~]# find . -type f -name '*.cc' -exec grep 'asiainfo' {} \;
[root@oldboy64-yl ~]# find . -type f -name '*.cc'|xargs grep 'asiainfo'
[root@oldboy64-yl ~]# grep 'asiainfo' `find . -type f -name '*.cc'`
如果没有指定扩展名则直接使用
[root@oldboy64-yl ~]# grep -Rl 'oldboy' ./*
./access.log
./anaconda-ks.cfg
./cmatrix-1.2a/config.status
./etc/group-
./etc/group
-r 递归查询
-R 与-r类似 只不过多了可以处理软链接
-l 只显示 grep 查找出来的文件名
2.3.2 使用 AWK 指定分隔符的参数是(-F) 或 (-vFS=)
eg:
FS Field Separator 字段分隔符,每一列的结束标记
[root@oldboy64-yl ~]# awk -F':' '{print $1}' /etc/passwd
root
bin
daemon
adm
[root@oldboy64-yl ~]# awk -vFS=':' '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
[root@oldboy64-yl ~]# awk 'BEGIN{FS=":"}{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2
adm 3
最后这种方法不推荐了,推荐 前 两种方法
2.4 简答
2.4.1 找出当前目录下包含 127.0.0.1 关键字的文件?
方法1
[root@oldboy64-yl ~]# grep -Rl '127.0.0.1' ./
方法2 三剑客 +反引号
[root@oldboy64-yl ~]# grep '127.0.0.1' `find . -type f`
[root@oldboy64-yl ~]# sed -n '/127.0.0.1/p' `find . -type f`
[root@oldboy64-yl ~]# awk '/127.0.0.1/' `find . -type f`
方法3 find |xargs+三剑客
[root@oldboy64-yl ~]# find . -type f |xargs grep '127.0.0.1'
[root@oldboy64-yl ~]# find . -type f |xargs sed -n '/127.0.0.1/p'
[root@oldboy64-yl ~]# find . -type f |xargs awk '/127.0.0.1/'
方法4 find -exec + 三剑客
[root@oldboy64-yl ~]# find . -type f -exec grep '127.0.0.1' {} \;
[root@oldboy64-yl ~]# find . -type f -exec sed -n '/127.0.0.1/p' {} \;
[root@oldboy64-yl ~]# find . -type f -exec awk '/127.0.0.1/' {} \;
小结:
1.grep
过滤方法 -Rl
2.find 命令与三剑客过滤的用法
2.4.2 删除 /显示 1.txt 文件第 3 行到第 10 行的内容?
2.4.2.1 删除
[root@oldboy64-yl ~]# sed '3,10d' 1.txt
[root@oldboy64-yl ~]# awk 'NR<=3||NR>10' 1.txt
[root@oldboy64-yl ~]# awk '!(NR>=3&&NR<=10)' 1.txt
说明
NR 在 awk 中内置变量表示 Number Of Field 记录号(行号)
&&表示并且 同时成立
|| 表示或者
; 分隔多条命令,让你在同一行执行多条命令
NR>=3 && NR<=10 把第 3 行到第 1 0 行取出来
! 表示取反
()被括起来的内容 整体
2.4.2.2 显示
[root@oldboy64-yl ~]# sed -n '3,10p' 1.txt
[root@oldboy64-yl ~]# awk 'NR==3,NR==10' 1.txt
[root@oldboy64-yl ~]# awk 'NR>=3 && NR<=10' 1.txt
[root@oldboy64-yl ~]# head -10 num.txt |tail -8
3
4
5
6
7
8
9
10
2.4.2.3 玩赖的了解下
[root@oldboy64-yl ~]# grep -n '.' num.txt|grep -A7 '^3:'
3:3
4:4
5:5
6:6
7:7
8:8
9:9
10:10
2.4.3 使用 awk 取出 /etc/passwd 第一列数据也就是取出用户名。
2.4.3.1 基础必备
[root@oldboy64-yl ~]# awk -F':' '{print $1}' /etc/passwd
root
bin
daemon
[root@oldboy64-yl ~]# cut -d: -f1 /etc/passwd
root
bin
daemon
[root@oldboy64-yl ~]# sed 's#:.*##g' /etc/passwd
root
bin
daemon
[root@oldboy64-yl ~]# egrep -o '^[0-Z_-]+' /etc/passwd
root
bin
daemon
说明
[ 0-Z ] == [a-zA-Z0-9]
cut -d 指定 分隔符, -d1 次 只能指定 1 个 符号作为分隔符
cut -f 取列 , -f1 -f2 -f1,2,3 -f1-5
2.4.3.2 提高
[root@oldboy64-yl ~]# egrep -o '^[^:]+' /etc/passwd
root
bin
daemon
[root@oldboy64-yl ~]# sed -r 's#(^[^:]+).*#\1#g' /etc/passwd
[root@oldboy64-yl ~]# awk '{gsub(/:.*/,"");print}' /etc/passwd
[root@oldboy64-yl ~]# awk '{gsub(/:.*/,"")}1' /etc/passwd
说明:
print 在 awk 中后面什么都不加 的 时候 表示 print $0
参考视频讲解部分:
面试题讲解系列-三剑客面试题- 三十道面试题让你玩转 sed 和 awk
https://www.bilibili.com/video/av51101676
2.4.4 用命令行更改 config.txt 文件,把里面所有的 "name" 更改为 "address"
[root@oldboy64-yl ~]# sed 's#name#address#g' config.txt
address
[root@oldboy64-yl ~]# awk '{gsub(/name/,"address")}1' config.txt
address
[root@oldboy64-yl ~]#
扩展
vi/vim 里面也可以进行替换
:%s#name#address#g
2.4.5 利用 sed 命令将 test.txt 中所有的回车替换成空格?
【吃饭的家伙】01 -老男孩教育 -三剑客- sed 执行流程
https://www.jianshu.com/p/46c02da0598e
2.4.5.1 方法 1 把每一行内容追加到 Hold Space 中,最后 1 行弄回到 P attern space 中 然后进行替换
基础版
[root@oldboyedu show01 ~]# seq 10 |sed n 'H;$x;s# n# #gp'
1 2 3 4 5 6 7 8 9 10
[root@oldboyedu s how01 ~]# seq 10 |sed n '1h;1!H;$x;s# n# #gp'
1 2 3 4 5 6 7 8 9 10
[root@oldboyedu show01 ~]# seq 10 |sed n 'H;$x;s# n# #gp'
1 2 3 4 5 6 7 8 9 10
[root@oldboyedu show01 ~]# seq 10 |sed n 'H;${x;s# n# #gp}'
1 2 3 4 5 6 7 8 9 10
加强版
上面的方法每一行开头多个空格
[roo t@oldboyedu show01 ~]# seq 10 |sed n '1h;1!H;$x;s# n# #gp'
1 2 3 4 5 6 7 8 9 10
[root@oldboyedu show01 ~]# seq 10 |sed n '1h;1!H;${x;s# n# #gp}'
1 2 3 4 5 6 7 8 9 10
备注:h,H,N 的含义参考
【进阶】04 -老男孩教育- sed 命令模式空间及保持空间命令
https://www.jianshu.com/p/770b69cdbbb0
2.4.5.2 方法 2 sed 命令的“循环 (标签 )”方法
[root@oldboyedu show01 ~]# seq 10 |sed ':label ;N;s# n# #g;t label'
1 2 3 4 5 6 7 8 9 10
2.4.5.3 方法 3 tr
如果不用
sed 直接用 tr 即可
[root@oldboy64-yl ~]# seq 10 |tr "\n" " "
1 2 3 4 5 6 7 8 9 10
2.4.5.4 方法 4 awk 修改 ORS
ORS是 Output Record Separator 输出分隔符,用来指定 awk 在显示每一行的时候每一行的结尾是什么默认是回车 这里改成了空格。正好符合题意,把回车替换成空格
1 2 3 4 5 6 7 8 9 10 [root@oldboy64-yl ~]# seq 10 |awk -vORS=" " '1'
1 2 3 4 5 6 7 8 9 10
[root@oldboy64-yl ~]# seq 10 |awk -vORS=" " '{print $0}'
1 2 3 4 5 6 7 8 9 10
2.4.6 写出查询 file.txt 以 abc 结尾的行
[root@oldboy64-yl ~]# grep 'abc$' file.txt
[root@oldboy64-yl ~]# sed -n '/abc$/p' file.txt
[root@oldboy64-yl ~]# awk '/abc$/' file.txt
说明:
awk可以过滤 时候精确到某一列
[root@oldboy64-yl ~]# awk '/nologin$/' /etc/passwd
补充说明
$0 表示一整行
[root@oldboy64-yl ~]# awk '$0~/abc$/' file.txt
2.4.7 删除 file.txt 文件中的空行
模拟环境:
[root@oldboy64-yl ~]# echo -e 'oldboy \noldboy \n \nalex \n \nalex lidao lidao alex \n oldboy \n \noldboyedu group 598972270' >file.txt
2.4.7.1 必会: 仅删除文件中的空行
[root@oldboy64-yl ~]# grep -v '^$' file.txt
[root@oldboy64-yl ~]# sed '/^$/d' file.txt
[root@oldboy64-yl ~]# awk '!/^$/' file.txt
2.4.7.2 提升 :文件中 的空行可能是 只有 空格 的 行
[root@oldboy64-yl ~]# egrep -v '^$|^ $' file.txt
[root@oldboy64-yl ~]# grep -v '^ $' file.txt
[root@oldboy64-yl ~]# awk '!/^ *$/' file.txt
[root@oldboy64-yl ~]# sed '/^ *$/d' file.txt
思考
如果还可能包含 t ab 键
说明:
^ *
*表示前 1 个字符出现 1 次及 1 次以上的时候 :^ +$
2.4.8 打印 file.txt 文件中的第 10 行
[root@oldboy64-yl ~]# sed -n '10p' file.txt
[root@oldboy64-yl ~]# head file.txt |tail -1
[root@oldboy64-yl ~]# awk 'NR==10' file.txt
2.4.9 删除 /etc/fstab 文件中所有以 开头的行的行首的 # 号及 后面的所有空白字符;
空白字符
空格
多个空格
tab 键
此题
可以分为两个题目
- 删除 /etc/fstab 文件中所有以 开头的行的行首的 # 号及 后面的所有空白字符
- 删除 /etc/fstab 文件中所有以 开头的行的行首的 # 号及 后面的 连续 的空白字符
2.4.9.1 删除 /etc/fstab 文件中所有以 开头的行的行首的 # 号及 后面的所有空白字符
可以
分为两步 哪个是 条件 ,哪个是 动作
第 1 步 找出以 开头 的行
第 2 步 在删除这一行中的空白字符 和行首的井号
[root@oldboy64-yl ~]# sed -r '/^#/s@^#|[ \t]+@@g' /etc/fstab
[root@oldboy64-yl ~]# awk '/^#/{gsub(/^#|[ \t]+/,"")}1' /etc/fstab
2.4.9.2 删除 /etc/fstab 文件中所有以 开头的行的行首的 # 号及 后面 的 连续 的空白字符
[root@oldboy64-yl ~]# awk '{gsub(/^#[ \t]+/,"")}1' /etc/fstab
#
/etc/fstab
Created by anaconda on Sun Jun 30 17:47:28 2019
#
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=47ec2d05-84dd-4131-86ec-426c706e9c01 / xfs defaults 0 0
UUID=daff218d-4ecc-484c-a479-efabd96c0467 /boot xfs defaults 0 0
UUID=f8a73e41-694e-4e02-bbb0-3dbc06d90f25 swap swap defaults 0 0
/dev/sda3 /data xfs defaults 0 0
[root@oldboy64-yl ~]# sed -r 's@^#[ \t]+@@g' /etc/fstab
#
/etc/fstab
Created by anaconda on Sun Jun 30 17:47:28 2019
#
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=47ec2d05-84dd-4131-86ec-426c706e9c01 / xfs defaults 0 0
UUID=daff218d-4ecc-484c-a479-efabd96c0467 /boot xfs defaults 0 0
UUID=f8a73e41-694e-4e02-bbb0-3dbc06d90f25 swap swap defaults 0 0
/dev/sda3 /data xfs defaults 0 0
[root@oldboy64-yl ~]#
2.4.10 查找最后创建时间是 3 天前,后缀是 *.log 的文件并删除
假设目录是 /oldboy
2.4.10.1 方法 1 find +xargs
[root@oldboy64-yl ~]# find /oldboy/ -type f -mtime +3 -name '*.log'|xargs rm -f
2.4.10.2 方法 2 find +$() 或``
[root@oldboy64-yl ~]# \rm -f $(find /oldboy/ -mtime +3 -type f -name "*.log")
[root@oldboy64-yl ~]# \rm -f `find /oldboy/ -mtime +3 -type f -name '*.log'`
2.4.10.3 方法 3 find -exec
[root@oldboy64-yl ~]# find /oldboy/ -type f -mtime +3 -name '*.log' -exec rm -f {} \;
说明
;形式 -exec find 命令找出 1 个文件就把文件放在{} 的位置
2.4.10.4 方法 4
[root@oldboy64-yl ~]# find /oldboy/ -type f -mtime +3 -name '*.log' -exec rm -f {} +
说明
如果 -exec 后面使用 find 会把前面找到的所有文件 1 次性的放在{} 所在位置
2.4.10.5 方法 5
[root@oldboy64-yl ~]# find /oldboy/ -type f -mtime +3 -name '*.log' -delete
-delete 删除
2.4.10.6 方法 6
[root@oldboy64-yl ~]# find /oldboy/ -type f -mtime +3 -name '*.log' |xargs -i rm -f {}
2.4.11 查找文件中 1 到 20 行之间,同时将 "aaa" 替换为 "AAA","ddd" 替换 "DDD"
[root@oldboy64-yl /oldboy]# cat lidao.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z
aaadddaaaddd
aaadddaaaddd
aaadddaaaddd
[root@oldboy64-yl /oldboy]#
思路
1: 简单 的替换 aaa 替换为 AAA ddd 替换为 DDD
awk 'NR==1,NR==20{gsub(/aaa/,"AAA");gsub(/ddd/,"DDD")}1' lidao.txt
sed '1,20{s#aaa#AAA#g;s#ddd#DDD#g}' lidao.txt
[root@oldboy64-yl /oldboy]# awk 'NR==1,NR==20{gsub(/aaa/,"AAA");gsub(/ddd/,"DDD")}1' lidao.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z
AAADDDAAADDD
AAADDDAAADDD
AAADDDAAADDD
[root@oldboy64-yl /oldboy]# sed '1,20{s#aaa#AAA#g;s#ddd#DDD#g}' lidao.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z
AAADDDAAADDD
AAADDDAAADDD
AAADDDAAADDD
[root@oldboy64-yl /oldboy]#
思路2: 大小写 转换,把小写字母转换为 大写 字母
tr 'ad' 'AD' <lidao.txt
sed 'y/ad/AD/' lidao.txt
awk '{print toupper($0)}' lidao.txt
sed 's#[ad]# \U&#g' lidao.txt
[root@oldboy64-yl /oldboy]# tr 'ad' 'AD' < lidao.txt
A b c D e f g h i j k l m n o p q r s t u v w x y z
AAADDDAAADDD
AAADDDAAADDD
AAADDDAAADDD
[root@oldboy64-yl /oldboy]# sed 'y/ad/AD/' lidao.txt
A b c D e f g h i j k l m n o p q r s t u v w x y z
AAADDDAAADDD
AAADDDAAADDD
AAADDDAAADDD
[root@oldboy64-yl /oldboy]#
说明:
sed命令中 y/// 类似于 tr1 对 1 替换,但是不能使用 a-z A-Z 范围
[root@oldboy64-yl /oldboy]# awk '{print toupper($0)}' lidao.txt
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
AAADDDAAADDD
AAADDDAAADDD
AAADDDAAADDD
[root@oldboy64-yl /oldboy]# sed 's#[ad]#<&>#g' lidao.txt
<a> b c <d> e f g h i j k l m n o p q r s t u v w x y z
<a><a><a><d><d><d><a><a><a><d><d><d>
<a><a><a><d><d><d><a><a><a><d><d><d>
<a><a><a><d><d><d><a><a><a><d><d><d>
[root@oldboy64-yl /oldboy]# sed 's#[ad]#\U&#g' lidao.txt
A b c D e f g h i j k l m n o p q r s t u v w x y z
AAADDDAAADDD
AAADDDAAADDD
AAADDDAAADDD
思路3 :1 到 2 0 行 大小写 转换,把小写字母转换为 大写 字母
sed -n '1,20p' lidao.txt| tr 'ad' 'AD'
awk 'NR==1,NR==20 {print toupper(0)}' lidao.txt
sed '1,20s#[ad]# U&#g' lidao.txt
sed ' 1,20 y/ad/AD/' lidao.txt
2.4.12 使用 sed 命令打印出文件的第一行到第三行
head -3 file.txt
sed -n '1,3p' file.txt
awk 'NR==1,NR==3' oldboy.txt
awk 'NR>=1&&NR<<=3' oldboy.txt
awk 'NR<<=3' oldboy.txt
2.4.13 在 /var/sync/log/cef_watchd 20080424.1og 文件中查找大小写不敏感 “ 字符串中的命令是
grep -i " mysql " /var/sync/log/cef_watchd 20080424.log
sed -n '/[a-z]/Ip' /var/sync/log/cef_watchd 20080424.log
awk -vIGNORECASE=1 '/[a-z]/' /var/sync/log/cef_watchd 20080424.log
[root@oldboy64-yl /oldboy]# sed -n '/[a-z]/Ip' lidao.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z
aaadddaaaddd
aaadddaaaddd
aaadddaaaddd
[root@oldboy64-yl /oldboy]# awk '/[a-z]/' lidao.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z
aaadddaaaddd
aaadddaaaddd
aaadddaaaddd
[root@oldboy64-yl /oldboy]# awk -vIGNORECASE=1 '/[a-z]/' lidao.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z
aaadddaaaddd
aaadddaaaddd
aaadddaaaddd
[root@oldboy64-yl /oldboy]# #ignore case 忽略大小写
2.4.14 为了在 /var/sync/log 目录中查找更改时间在 5 日以前的文件并删除它们, linux 命令是
同上题目: 1.4.10 查找最后创建时间是 3 天前,后缀是 *.log 的文件并删 除
2.4.15 把 data 目录及其子目录下所有以扩展名 .txt 结尾的文件中包含 oldgirl 的字符串全部替换为oldboy.
同此题 查找最后创建时间是 3 天前,后缀是 *.log 的文件并删除
把删除改为sed 或 awk 替换
2.4.16 写出删除 abc.txt 文件中的空 行
同此题 1.4.7 删除 file.txt 文件中的空行
2.4.17 查看 linux 服务器 ip 的命令,同时只显示包含 ip 所在的行打印出来
hostname -I
ip a s eth0|awk F ‘[ /]+’ ‘NR==3{print $3}’
ip a s eth0|sed -rn ‘3s#^.*t(.*)/.*$# \1#gp’
[root@oldboy64-yl /oldboy]# ip a s eth0|awk -F'inet |/24' 'NR==3{print $2,$0}'
10.0.0.200 inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
2.4.18 用 awk 获取文件中第三行的倒数第二列字段
awk 默认的 分隔符 就是空格,连续的空格, tab 键
[root@oldboy64-yl /oldboy]# awk 'NR==3{print $(NF-1)}' oldboy.txt
2.4.19 有文件 file1
请用 shell 查询 file1 里面空行的所在行号
grep '^$' -n file1
awk '/^$/{print NR,$0}' file.txt
sed -n '/^$/{=;p}' file.txt|sed 'N;s#\n# #g'
[root@oldboy64-yl /oldboy]# awk '/^$/{print NR,$0}' file.txt
2
[root@oldboy64-yl /oldboy]# sed -n '/^$/{=;p}' file.txt|sed 'N;s#\n# #g'
2
[root@oldboy64-yl /oldboy]# seq 10 | sed 'N;s#\n# #g'
1 2
3 4
5 6
7 8
9 10
查询 file1 以 abc 结尾的行
打印 file 文件第一行到第三行
参考上面的题目
2.4.20 显示 file 文件里匹配 foo 字串那行以及上下 5 行、显示 foo 及前 5 行、显示 foo 及后 5 行
grep "foo" B 5 file
grep "foo" A 5 file
grep "foo" C 5 file
2.4.21 echo "ABCDEF abtdefg" |sed -i s/c/t/g 这条命令是否正确?如若正确可能会显示什么样的结果?
不正确
-i 修改文件内容
no input files
sed 无法找到要修改的文件
必须熟练:单引号双引号 不加引号区别
https://www.jianshu.com/p/60a810af2656
2.4.22 当前系统中没有任何 文本编辑器( vi,emacs,vim,edit 等),如何 过滤 掉注释行和空行查看/etc/ssh/sshd_config 文件
awk '!/^#|^$/' /etc/ssh/sshd_config
egrep -v '^#|^$' /etc/ssh/sshd_config
sed -r '/^#|^$/d' /etc/ssh/sshd_config
sed -nr '/^#|^$/!p ' /etc/ssh/sshd_config
egrep '^[a-Z]' /etc/ssh/sshd_config
参考:
删除file.txt 文件中的空行
2.4.23 查找 file.log 文件中的包含关键字 “ 的内容,及其上下两行的内容 重 定向保存到 1.txt 。
请写出命令
[root@oldboy64-yl /oldboy]# grep 'helloword' -C 2|file.log > 1.txt
第3章 进阶题目:
需要用到awk数组和函数知识点
3.1 找出 ifconfig 命令结果中的 1-255 之间的数值;
net tools
[root@oldboy64-yl /oldboy]# ifconfig |egrep -o '[0-9]+' |awk '$0>=1 && $0<=255'
[root@oldboy64-yl /oldboy]# ifconfig |awk -vRS='[^0-9]+' '$0>=1 && $0<=255'
[root@oldboy64-yl /oldboy]# ifconfig |awk -vRS='[^0-9]+' '{print NR,$0}'
3.2 文件内容排序、文件行取唯一值的命 令分别是?
sort
uniq
3.3 用 awk 获取文件中第三行的倒数第二列字段
[root@oldboy64-yl /oldboy]# awk 'NR==3{print $(NF-1)}' file.txt
not
3.4 awk 是一个很强大的文本处理工具,请使用 awk 统计当前主机的并发访问量
[root@oldboy64-yl /oldboy]# netstat -ant |awk '/^tcp/{++state[$NF]} END {for(key in state) print key,state[key]}'
LISTEN 4
ESTABLISHED 1
[root@oldboy64-yl /oldboy]# ss -ant|awk '{++state[$1]}END{for (key in state) print key,state[key]}'
LISTEN 4
ESTAB 1
State 1
3.5 有一个文件 nginx.log ,请用 awk 提取时间( HH:MM 文件内容如下:
第 1 行内容 :l[20/jul/2017:10:35:14 +0800]|POST
/audiosearch/searchHTTP/1.1|200| lDalvik/1.6.0 linux;U;Android 4,4,4;Konka Android TV
638Build/KTU84P l --[5.069|5.001,0.005|www.ku yun.com|8771|172.21.19.67:8084,172.21.19.66:8084]
第 2 行 内容 : l[20/jul/2017:10:35:14 +0800]|POST
/audiosearch/searchHTTP/1.1|200| lDalvik/1.6.0 linux;U;Android 4,4,4;Konka Android TV
638Build/KTU84P l --[5.069|5.001,0.005|www.kuyun.com|8771|1 72.21.19.67:8084,172.21.19.66:8084]
[root@oldboy64-yl /oldboy]# cat nginx.log
l[20/jul/2017:10:35:14 +0800]|POST/audiosearch/searchHTTP/1.1|200| lDalvik/1.6.0 linux;U;Android 4,4,4;Konka Android TV638Build/KTU84P l --[5.069|5.001,0.005|www.ku yun.com|8771|172.21.19.67:8084,172.21.19.66:8084]
l[20/jul/2017:10:35:14 +0800]|POST/audiosearch/searchHTTP/1.1|200| lDalvik/1.6.0 linux;U;Android 4,4,4;Konka Android TV005|www.kuyun.com|8771|1 72.21.19.67:8084,172.21.19.66:8084]
[root@oldboy64-yl /oldboy]# awk -F'2017:|:14' '{print $2}' nginx.log
10:35
10:35
[root@oldboy64-yl /oldboy]# awk -F'/....:|:14 ' '{print $2}' nginx.log
10:35
10:35
[root@oldboy64-yl /oldboy]#
3.6 统计 apache 访问日志流量排名前 10 个 IP
[root@oldboy64-yl /oldboy]# awk '{h[$1]+=$10}END{for(p in h)print p,h[p]}' access.log|sort -rnk2|head
3.7 统计出 apache 的 access.log 中访问最多的 5 个 ip
[root@oldboy64-yl /oldboy]# awk '{h[$1]++}END{for(p in h)print p,h[p]}' access.log |sort -rnk2|head -5
[root@oldboy64-yl /oldboy]# awk '{print $1}' access.log|sort |uniq -c|sort -rnk2|head -5
3.8 这条 linux 命令的含义: netstat n |awk '/^tcp/ {++h[$NF]} END {for(a in h) print a,h[a]}'
tcp11 状态 每种 状态的数量。
[root@oldboy64-yl /oldboy]# netstat -n|awk '/^tcp/{++h[$NF]}END{for(a in h)print a,h[a]}'
ESTABLISHED 1
3.9 使用 awk 分析日志(最后一个字段是 IP ,统计访问量前十的 IP ,并进行排序
[root@oldboy64-yl /oldboy]# awk '{h[$NF]++}END{for(p in h)print p,h[p]}' access.log |sort -rnk2|head
[root@oldboy64-yl /oldboy]# awk '{print $NF}' access.log|sort|uniq -c|sort -rnk2|head
3.10 从 a.log 文件中提取包含 "WARNING"或 “ FATAL”,同时不包含 “ IGNOR"行,然后,提取以":"分割的第五个字段
[root@oldboy64-yl /oldboy]# awk -F: '/WARNING|FATAL/ && !/IGNOR/{print $5}' a.log
网友评论