首页 > 代码库 > 正则表达式 awk笔记

正则表达式 awk笔记

awk ‘条件类型1 {动作1}条件类型2{动作2}...‘ filename

NF 每一行($0)拥有的字段总数

NR AWK所处理的是某一行的数据

FS 输入字段分割字符,默认为空格

RS输入行分隔符

OFS输出字段分隔符

ORS输出行分隔符

FNR各自统计行

BEGIN 表示后面不带文件 只做演示

-F 分隔符

awk –v 设置变量


例:打印passwd文件中ID小于10的用户

 cat /etc/passwd | awk -F":" ‘ $3<10 {print $1 "\t" $3}‘ 

计算出每个人的总额

[root@localhost ~]# cat aa | awk ‘NR==1{print $1,$2,$3,$4,"Total"}NR>=2{total=$2+$3+$4;print $1,$2,$3,$4,total}‘

Name 1st 2nd 3th Total

VBird 23000 24000 25000 72000

DMTsai 21000 20000 23000 64000

Bird2 43000 42000 41000 126000


[root@localhost ~]# awk -vtest="test" ‘BEGIN{print test}‘

Test

或者

[root@localhost ~]# awk‘BEGIN{test="test";print test}‘

Test

多个语句之间要用分号;隔开

Printf

技术分享

[root@localhost ~]# awk -F : ‘$3>500{print $1,$3}‘ /etc/passwd

nfsnobody 65534

www 501

mysql 502

nagios 503

aaa 504

打印出passwd文件中ID大于500的用户

[root@localhost ~]# awk -F :‘$7~"bash$" {print $1,$7}‘ /etc/passwd

root /bin/bash

chen /bin/bash

nagios /bin/bash

打印出第七列以bash结尾的用户

awk -F : ‘$7!~"bash$" {print$1,$7}‘ /etc/passwd 取反

[root@localhost ~]# awk -F : ‘/^r/ {print$1,$7}‘ /etc/passwd

root /bin/bash

rpc /sbin/nologin

rtkit /sbin/nologin

rpcuser /sbin/nologin

去以r开头的行

[root@localhost ~]# awk -F : ‘/^r/,/^m/ {print$1,$7}‘ /etc/passwd 第一个r开头的行到第一个m开头的行

[root@localhost ~]# awk -F:‘$3==0,$7~"bash$"{print $1,$7}‘ /etc/passwd

root /bin/bash

ID=0和第七列以bash结尾的行

 [root@localhost ~]# awk -F:‘$3==0,$7~"nologin"{printf "%-10s%-10s%-20s\n",$1,$3,$7}‘/etc/passwd

root     0         /bin/bash          

bin      1         /sbin/nologin

取第三列=0和第七列以nologin结尾的值打印$1 $3 $7 "%-10s%-10s%-20s\n"表示中间隔多少字符串

BEGIN/END awk执行前执行一次和awk执行后执行一次

[root@localhost ~]# awk -F: ‘BEGIN{print "username   ID   shell"}$3==0,$7~"nologin"{printf"%-10s%-10s%-20s\n",$1,$3,$7}‘ /etc/passwd

username    ID  shell

root     0         /bin/bash          

bin      1         /sbin/nologin

AWK执行前 打印出三列的表头

[root@localhost ~]# awk -F: ‘BEGIN{print"username    ID  shell"}$3==0,$7~"nologin"{printf "%-10s%-10s%-20s\n",$1,$3,$7}END{print "End of file"}‘ /etc/passwd

username   ID   shell

root     0         /bin/bash          

bin      1         /sbin/nologin      

End of file

AWK执行后 打印出结束语

[root@localhost ~]# awk -F: ‘{if($1=="root") print $1 , "this is admin";else print$1,"no admin"}‘ /etc/passwd

root this is admin

bin no admin

daemon no admin

adm no admin

if语句 如果$1=root则显示$1this isadmin 否则显示no admin

[root@localhost ~]# awk -F: -v sum=0 ‘{if($3>500) sum++}END{print sum}‘ /etc/passwd

5

-v 变量sum赋值为0 如果ID大于500 sum+1 执行完成后显示sum的值

 

netstat -ant | awk‘/^tcp/{state[$NF]++}END{for (s in state) {print s,state[s]}}‘

查看TCP状态

[root@localhost ~]# awk‘{count[$1]++}END{for (ip in count) {print ip,count[ip]}}‘/home/webserver/nginx/logs/access.log

统计网站每个IP访问量


另:文件比较工具 diff

diff参数用法

-b 忽略一行当中的空格

-B 或略空白行

-i 忽略大小写的不同

用法:diff [-bBi] 文件1 文件2即可  (也可比较目录)

正则表达式 awk笔记