1、awk
在某些场景下,我们需要过滤方式希望是列来匹配,而不是sed的行来匹配,而且awk还可以嵌套for等循环去使用,拓展性强,当然awk也是最难的。
awk的常用命令选项:
- -F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
- -v var=value 赋值一个用户定义变量,将外部变量传递给awk
- -f scripfile 从脚本文件中读取awk命令
- -m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
awk内置变量:
- FS 保存或设置分隔符,例如FS=",";
- $N 指定分隔符的第N个字段,例如$1,$5代表第一列和第三列;
- $0 当前读入整行的文本内容;
- NF 记录当前处理行的字段个(列)数;
- NR 记录当前处理行的数量;
- FNR 保存当前处理行在原文本内的行号;
- FILENAME 当前处理的文本名;
- ENVIRON 调用shell环境变量。
简单练习(awk对文本每一行进行操作)
1、打印hiya 次数由文件passw的行数决定
》awk '{print "hiya"}' passw
2、找出:分割的第一个字符串》awk
-F
":"
'{ print "username: " $1 }'
passw
5、打印输出文本行数
3、输出20-30行
》awk '{if(NR>=20 && NR<=30) print $1}' test.txt
4、输出指定位置字符(用,和‘ ’两个字符分割字符串输出第三和第七个)
其中文本中为 a b c,d e f g----->输出结果为 c g
》awk -F '[ ,]+' '{print $3" "$7}' test.txt
》awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' passwd
6、统计文件夹中所有文件占用量
》ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
7、以tab为分隔符(+代表一个或多个)
》awk 'BEGIN{FS="\t+"}{print $1,$2,$3}' tab.txt
8、space+一个或多个空格
》awk -F [[:space:]+] '{print $1,$2}' space.txt
9、取第二行第四个字符串
》ifconfig eth0|awk -F [" ":]+ 'NR==2{print $4}' ## NR==2也就是取第2行
》awk '/root/{print $0}' passwd ##匹配所有包含root的行
》awk -F: '$5~/root/{print $0}' passwd ## 以分号作为分隔符,匹配第5个字段是root的行
用 awk 中查看服务器连接状态并汇总》netstat
-an|
awk
'/^tcp/{++s[$NF]}END{for(a in s)print a,s[a]}'
统计 web 日志访问流量,要求输出访问次数,请求页面或图片,每个请求的总大小,总访问流量的大小汇总
》awk
'{a[$7]+=$10;++b[$7];total+=$10}END{
for
(x
in
a)print b[x],x,a[x]|
"sort -rn -k1"
"total size is :"
total}'
/app/log/access_log
查找 awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' this is a test!test! 在 info 中查找满足正则表达式, /[0-9]+/ 用”!”替换,并且替换后的值,赋值给 info 未 给 info 值,默认是$0
替换 awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' ok #未找到,返回 0
匹配查找 awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' ok #如果查找到数字则匹配成功返回 ok,否则失败,返回未找到
截取 awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' s is a tes #从第 4 个 字符开始,截取 10 个长度字符串
分割 awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' 4 4 test 1 this 2 is 3 a #分割 info,动态创建数组 tA,awk for …in 循环,是一个无序的循环。 并不是从数组下标 1…n 开始
awk常用内置变量
[root@Gin scripts]# cat recode.txt Jimmy the Weasel 100 Pleasant Drive San Francisco,CA 123456 Big Tony 200 Incognito Ave. Suburbia,WA 64890 [root@Gin scripts]# cat awk.txt #!/bin/awk BEGIN { FS="\n" RS="" } { print $1","$2","$3 } [root@Gin scripts]# awk -f awk.txt recode.txt Jimmy the Weasel,100 Pleasant Drive,San Francisco,CA 123456 Big Tony,200 Incognito Ave.,Suburbia,WA 64890
可以把代码写到文件中,使用时直接调用如:awk -F aa.txt demo.txt
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linux 三剑客(awk,sed,grep) - Python技术站