Linux高级文本处理之gawk变量的操作符(三)推荐

一、变量

Awk 变量以字母开头,后续字符可以是数字、字母、或下划线。关键字不能用作 awk 变量。awk 变量可以直接使用而不需事先声明。 如果要初始化变量,最好在BEGIN 区域内做,它只会执行一次。Awk 中没有数据类型的概念,一个 awk 变量是 number 还是 string 取决于该变量所处的上下文。

实例1:使用”total”便是用户建立的用来存储公司所有雇员工资总和的变量。

[root@localhost~]#catemp4101,JohnDoe,CEO,10000102,JasonSmith,ITManager,5000103,RajReddy,Sysadmin,4500104,AnandRam,Developer,4500105,JaneMiller,SalesManager,3000[root@localhost~]#catemp.awkBEGIN{FS=",";total=0;print$2"'ssalaryis:"$4;total=total+$4;print"---\nTotalcompanysalary=$"total;[root@localhost~]#awk-femp.awkemp4JohnDoe'ssalaryis:10000JasonSmith'ssalaryis:5000RajReddy'ssalaryis:4500AnandRam'ssalaryis:4500JaneMiller'ssalaryis:3000Totalcompanysalary=$27000

awk自定义变量的方法:

1.借助-v选项,可以将外部值(并非来自stdin)传递给awk

实例2:

[root@localhost~]#awk-vvar="young"'BEGIN{printvar,"\n","---"}{printvar}'./numyoung---youngyoungyoung

2.通过VAR=value的方式定义

实例3:

[root@localhost~]#awk'{printv1,v2}'v1="young"v2="geek"./numyounggeekyounggeekyounggeek

二、一元操作符

1.取正取反

只接受单个操作数的操作符叫做一元操作符。

实例1:取反操作

[root@localhost~]#catemp4101,JohnDoe,CEO,10000102,JasonSmith,ITManager,5000103,RajReddy,Sysadmin,4500104,AnandRam,Developer,4500105,JaneMiller,SalesManager,3000[root@localhost~]#awk-F,'{print-$4}'emp4-10000-5000-4500-4500-3000

注意:取反只对数值类数据生效,字符串取反结果全部为0.

实例2:

[root@localhost~]#catnum[root@localhost~]#awk'{print+$1}'num[root@localhost~]#awk'{print-$1}'num3

2.自增自减

VAR1=++VAR或者VAR1=–VAR,表示VAR先增加或者减去1再赋值给VAR1,VAR1=VAR++或VAR1=VAR–,表示先将VAR赋值给VAR1,VAR再增减或者减去1.

实例1:前自加子减

[root@localhost~]#awk-F,'{print++$4}'emp4#前自加10001[root@localhost~]#awk-F,'{print--$4}'emp4#前自减4499

实例2:后自加子减

[root@localhost~]#awk-F,'{$4--;print$4}'emp4#后自减[root@localhost~]#awk-F,'{$4++;print$4}'emp4#后自加100013001

实例3:打印所有可登陆 shell 的用户总数:

[root@localhost~]#awk-F':' '$NF~/\/bin\/bash/{n++} END{printn}'/etc/passwd[root@localhost~]#grep-c'/bin/bash$'/etc/passwd10

实例4:

[root@localhost~]#catnum[root@localhost~]#awk'/1/{printNF}'num[root@localhost~]#awk'/1/{n++}END{printn}'num[root@localhost~]#awk'/2/{n++}END{printn}'num[root@localhost~]#awk'/3/{n++}END{printn}'num[root@localhost~]#awk'/4/{n++}END{printn}'num1

三、算术运算符

需要两个操作数的操作符,成为二元操作符。 Awk 中有多种基本二元操作符(如算术操作符、 字符串操作符、赋值操作符,等等)。

实例1:将每件单独的商品价格减少 20% 并且将每件单独的商品的数量减少 1

[root@localhost~]#catitems.txt101,HDCamcorder,Video,210,10102,Refrigerator,Appliance,850,2103,MP3Player,Audio,270,15104,TennisRacket,Sports,190,20105,LaserPrinter,Office,475,5[root@localhost~]#catdis.awkBEGIN{FS=",";OFS=",";discount=0discount=$4*20/100;print$1,$2,$3,$4-discount,$5-1[root@localhost~]#awk-fdis.awkitems.txt101,HDCamcorder,Video,168,9102,Refrigerator,Appliance,680,1103,MP3Player,Audio,216,14104,TennisRacket,Sports,152,19105,LaserPrinter,Office,380,4

实例2:只打印偶数行

[root@localhost~]#awk'NR%2==0'items.txt102,Refrigerator,Appliance,850,2104,TennisRacket,Sports,190,20

四、字符串操作符

(空格)是连接字符串的操作符。

实例1:

[root@localhost~]#catstr.awkBEGIN{FS=",";OFS=",";str1="Audio";str2="Video";nustr="100";str3=str1str2;print"Concatenatestringis:"str3;nustr=nustr+1;print"Strtonu:"nustr;[root@localhost~]#awk-fstr.awkitems.txtConcatenatestringis:AudioVideoStrtonu:101

四、赋值操作符

实例1:

[root@localhost~]#catfz.awkBEGIN{FS=",";OFS=",";total1=total2=total3=total4=total5=10;total1+=5;printtotal1;total2-=5;printtotal2;total3*=5;printtotal3;total4/=5;printtotal4;total5%=5;printtotal5;[root@localhost~]#awk-ffz.awkitems.txt0

实例2:打印商品清单

[root@localhost~]#catitems.txt101,HDCamcorder,Video,210,10102,Refrigerator,Appliance,850,2103,MP3Player,Audio,270,15104,TennisRacket,Sports,190,20105,LaserPrinter,Office,475,5[root@localhost~]#awk-F,' BEGIN{total=0}{total+=$5} END{print"TotalQutantity:"total}'items.txtTotalQutantity:52

五、比较操作符

实例1:打印数量小于等于临界值 5 的商品信息

[root@localhost~]#awk-F,'$5 =5'items.txt102,Refrigerator,Appliance,850,2105,LaserPrinter,Office,475,5

实例2:打印编号为 103 的商品信息

[root@localhost~]#awk-F,'$1==103'items.txt103,MP3Player,Audio,270,15

实例3:打印除 Video 以外的所有商品

[root@localhost~]#awk-F,'$3!="Video"'items.txt102,Refrigerator,Appliance,850,2103,MP3Player,Audio,270,15104,TennisRacket,Sports,190,20105,LaserPrinter,Office,475,5

实例4:同实例3,但只打印描述信息

[root@localhost~]#awk-F,'$3!="Video"{print$2}'items.txtRefrigeratorMP3PlayerTennisRacketLaserPrinter

实例5:打印价钱低于 900 或者数量小于等于临界值 5 的商品信息

[root@localhost~]#awk-F,'$5 =5||$4 900'items.txt101,HDCamcorder,Video,210,10102,Refrigerator,Appliance,850,2103,MP3Player,Audio,270,15104,TennisRacket,Sports,190,20105,LaserPrinter,Office,475,5

实例6:打印/etc/password 中最大的 UID(以及其所在的整行)。

[root@localhost~]#awk-F':'' $3 maxuid {maxuid=$3;maxline=$0} END{printmaxuid,maxline}'/etc/passwd1009user3:x:1009:1010::/home/user3:/bin/bash

实例8:打印/etc/passwd 中 UID 和 GROUP ID 相同的用户信息

[root@localhost~]#awk-F':''$3==$4'/etc/passwdroot:x:0:0:young,geek,010110110,0101101101:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinnobody:x:99:99:Nobody:/:/sbin/nologindbus:x:81:81:Systemmessagebus:/:/sbin/nologinvcsa:x:69:69:virtualconsolememoryowner:/dev:/sbin/nologinabrt:x:173:173::/etc/abrt:/sbin/nologin

实例9:打印/etc/passwd 中 UID = 100 并且用户的 shell 是/bin/sh 的用户

[root@localhost~]#awk-F:'$3 =100 $7=="/bin/sh"'/etc/passwduser1:x:800:800:testuser:/none:/bin/sh

或者:

[root@localhost~]#awk-F':''$3 =100 $NF~/\/bin\/sh/'/etc/passwduser1:x:800:800:testuser:/none:/bin/sh#正则表达式模式匹配

实例10:打印/etc/passwd 中没有注释信息(第 5 个字段)的用户

[root@localhost~]#awk-F:'$5==""'/etc/passwdabrt:x:173:173::/etc/abrt:/sbin/nologinntp:x:38:38::/etc/ntp:/sbin/nologinpostfix:x:89:89::/var/spool/postfix:/sbin/nologintcpdump:x:72:72::/:/sbin/nologinsys:x:498:1001::/home/sys:/bin/bashnatasha:x:1006:1007::/home/natasha:/bin/bashharry:x:1007:1008::/home/harry:/bin/bashsarah:x:497:497::/home/sarah:/bin/nologin

实例11:使用取反(!)运算符打印奇数行

[root@localhost~]#seq10|awk'i=!i'9

实例12:打印偶数行

[root@localhost~]#seq10|awk-vi=1'i=!i'10

六、正则表达式操作符

实例1:

[root@localhost~]#catitems.txt101,HDCamcorder,Video,210,10102,Refrigerator,Appliance,850,2103,MP3Player,Audio,270,15104,TennisRacket,Sports,190,20105,LaserPrinter,Office,475,5[root@localhost~]#awk-F,'$2=="Tennis"'items.txt#精确匹配[root@localhost~]#awk-F,'$2~"Tennis"'items.txt#模糊匹配104,TennisRacket,Sports,190,20

实例2:

[root@localhost~]#awk-F,'$2!~"Tennis"'items.txt#不匹配101,HDCamcorder,Video,210,10102,Refrigerator,Appliance,850,2103,MP3Player,Audio,270,15105,LaserPrinter,Office,475,5

实例3:打印 shell 为/bin/bash 的用户的总数,如果最后一个字段包含”/bin/bash”,则变量n 增加 1

[root@localhost~]#grep-c'/bin/bash'/etc/passwd[root@localhost~]#awk-F:'$NF~/\/bin\/bash/{n++}END{printn}'/etc/passwd9

补充说明:

awk PATTERN模式的其他形式:

empy:空模式,匹配所有行

关系表达式,表达式结果非0为真,则执行后面body中语句;0则为假,不执行。例如

awk-F:'$3 =500{print$1,$3}'/etc/passwd

3.行范围,类似sed或vim中的地址定界:

/startpattern/,/endpattern/

注意:不支持直接给出数字格式

实例:

[root@localhost~]#awk'/^root/,/^mail/{print$0}'/etc/passwdroot:x:0:0:young,geek,010110110,0101101101:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologin

相信梦想是价值的源泉,相信眼光决定未来的一切,

Linux高级文本处理之gawk变量的操作符(三)推荐

相关文章:

你感兴趣的文章:

标签云: