【威尼斯网址开户网站】Centos 6.6上awk命令的简短利用

Centos 6.6上awk命令的粗略利用

正文实验情况:vmware workstation 10 +Centos6.6
X86_64,文中命令请谨慎使用。

AWK是类UNIX操作系统中一款文本管理工科具,同grep,sed并形成文本管理三徘徊花,使用上的基本点为:生成格式化的文件报告,但awk有抬高的语法和灵活的变量,称其为一门独立的言语也不为过。下文仅仅是awk生成格式化文本报告作用的简单利用。

1.awk干活经过描述:

awk将被处理的公文,逐行读入;依照输入分隔符,对改行进行划分处理;分割后的行内容块的目录从1开首,索引0为整行内容;依照定义的管理情势对行内容实行相配,若相称原则,则以适宜的格式打字与印刷相应的行数据块,若行数据不相配相应规范,则不管理。

2.awk语法格式

对awk来说很难总计出贰个全然适应任何地方的语法格式,就生成格式化文本报告作用来讲能够勉强写为上边包车型客车:

$awk [option] ‘[PATTERN] { ACTION STATEMENT }’ file

option:

时常选用的有2个:

-F PUNCT:钦定输入分隔符。

-v VAL_NAME=VALUE:自定义变量值。下文有例子表达。

别的的局地,请依照上边包车型地铁事例进行学习,文末尾再进行总计。

3.事例教学:

3.1)打字与印刷/etc/passwd文件中root顾客条指标顾客名,uid和shell。

先抽出/etc/passwd文件中root客户的条款

[[email protected]~]$``grep``'^root\>'``/etc/passwd``root:x:0:0:root:``/root``:``/bin/bash``#因没说到行模式匹配,故这里借用grep搜索root开头的行

能够看到有关root客户的条目款项管理时利用“:”为分隔符是个明智的选料,客商名在第1局地,uid在第二局地,shll在第七局地,所以能够采纳awk这样来写,就满意题意:

[[email protected]~]$``grep``'^root\>'``/etc/passwd``|``awk``-F``':'``'{print$1,$3,$7}'``root0``/bin/bash``[[email protected]~]$``#因没说到行模式匹配,故这里借用grep搜索root开头的行

上述awk表明式中,使用-F钦定输入分隔符为“:”; ACTION为
print,正是打字与印刷的情趣, STATEMENT是 $1,$3,$7

理之当然也可这么写:

[[email protected]~]$``grep``'^root\>'``/etc/passwd``|``awk``-``v``FS=``':'``'{print$1,$3,$7}'``root0``/bin/bash``[[email protected]~]$``#因没说到行模式匹配,故这里借用grep搜索root开头的行

总结一:ACTION: print

print:

格式:
print item1,item2,…
要点:
1)各item间使用逗号分隔,而输出时利用输出分隔符分隔,输出分隔符默感到空格。
2)输出的各item为字符串,数值和日前记录的字段($n),变量的值或awk的表明式,
数值会被隐式调换为字符进行输出。
3)print后边的item就算简单,也便是print $0;输出空白 相当于print ” “

上述2种awk表明格局能够产生问题的渴求,可是输入的开始和结果不是极美丽貌,能够使用printf
替代print 来打字与印刷输出格式:

[[email protected]~]$``grep``'^root\>'``/etc/passwd``|``awk``-F``':'``'{printf"USERNAME:%-s\nUID:%-d\nSHELL:%-s\n",$1,$3,$7}'``USERNAME:root``UID:0``SHELL:``/bin/bash``[[email protected]~]$``#因没说到行模式匹配,故这里借用grep搜索root开头的行

“USERNAME:%-s\nUID:%-d\nSHELL:%-s\n”
是格式符,因背后有3个部分要打字与印刷,故这里给出了3个格式符,USE宝马X5NAME:%-s\n是对准第多个item即标题中的要打字与印刷的客商名,UID:%-d\n是指向第三个item即标题中的要打字与印刷的UID,SHELL:%-s\n针对的是第五个item即顾客的shell。况兼各种格式符中显著钦定了换行符\n

纵然美观了,不过awk表明式也复杂起来,上面就计算下ACTION中printf的施用:

总结二:ACTION:printf:
格式:
printf format,item1,item2,…
要点:
1)printf中format称为格式符,是务必的,需分明给出
2)不会自行换行,需出示钦定换行符\n
3)format中须求各自为前面每贰个item钦点多个格式符

格式符:都是%先导,后跟一个字符
%c:展现字符ASCII码,其实突显字符自身
%d %i:呈现十进制格式的平头
%e %E:科学计数法突显数值
%f:突显浮点数
%g %G:以科学计数法格式或浮点数格式突显数值
%s:显示字符串
%u:呈现无符号整数
%%:显示%自身
格式的修饰符:
#[.#]:第一个#为数字,展现上涨的幅度,后边.#在发布浮点数时表示精度
-:左对齐,暗中同意右对齐
+:显示数值的暗记, 正负数

3.2)使用”#”为连接符,展现系统上root客商的名目,uid和shell的设定

[[email protected]~]``#grep'^root\>'/etc/passwd|awk-vFS=':'-vOFS='#''{print$1,$3,$7}'``root``#0#/bin/bash``[[email protected]~]``#``#因没说到行模式匹配,故这里借用grep搜索root开头的行

小结三:awk变量:FS为行输入分隔符,OFS为行输出分隔符,使用-v
val_name=value来定义,-F PUNCT也是点名输入分隔符的,二者默以为空格。

3.3)打字与印刷/etc/passwd文件中客商名称叫一行

因awk是逐行对文本进行管理的,故/etc/passwd文件中每行的$1就是顾客名,可是对输出换行符不开展点名的话,打字与印刷出来是以此样子:

[[email protected]~]``#head-3/etc/passwd|awk-F':''{print$1}'``root``bin``daemon``[[email protected]~]``#

从而必要钦命输出换行符,那样才可将/etc/passwd文件中客户名打字与印刷为一行

[[email protected]~]``#awk-vFS=':'-vORS='''{print$1}'/etc/passwd``rootbindaemonadmlp``sync``shutdown``haltmailuucpoperatorgamesgopher``ftp``nobodydbususbmuxdvcsarpcrtkitavahi-autoipdabrtrpcusernfsnobodyhaldaemongdmntpapachesaslauthpostfixpulsesshdtcpdumplijun[roo[email protected]~]``#

小结三:awk变量:PRADOS为awk输入换行符,O昂科威S为出口换行符,使用-v
val_name=value来定义

3.4)展现/etc/passwd中第一行有多少个字段,并打字与印刷最终那些字段

[[email protected]~]``#head-1/etc/passwd|awk-F':''{printNF,$NF}'``7``/bin/bash

小结三:awk变量:NF为近年来行可被分割的成多少个字段,$NF为被分割后最终这一个字段,需指明行分隔符,默感觉空格。

3.5)打字与印刷彰显/etc/issue和/etc/sysconfig/network的行和行号,留意观望上面三段展现的比不上

方式一:``[[email protected]~]``#awk'{printNR,$0}'/etc/issue/etc/sysconfig/network``1CentOSrelease6.6(Final)``2Kernel\ronan\m``3``4NETWORKING=``yes``5HOSTNAME=Test02.lijun.com``[[email protected]~]``#

方式二:``[[email protected]~]``#awk'{printFNR,$0}'/etc/issue/etc/sysconfig/network``1CentOSrelease6.6(Final)``2Kernel\ronan\m``3``1NETWORKING=``yes``2HOSTNAME=Test02.lijun.com

[[email protected]~]``#awk'{printFILENAME,FNR,$0}'/etc/issue/etc/sysconfig/network``/etc/issue``1CentOSrelease6.6(Final)``/etc/issue``2Kernel\ronan\m``/etc/issue``3``/etc/sysconfig/network``1NETWORKING=``yes``/etc/sysconfig/network``2HOSTNAME=Test02.lijun.com``[[email protected]~]``#

总计三:awk变量:一行命令中并且管理多少个文件时,NEvoque:前面要拍卖的文本的行进行统一计数,突显当前行的行号。FN法拉利488:后面各样要拍卖的文件的行数单独计数时,展现当前行的行号。FILENAME:当前被管理的文书的文本名。

3.6)

(1)打印展现/etc/passwd文件中普通客户的音讯

在centos6.6上系统中的相配客商的uid从500起先的,故这里只需打字与印刷/etc/passwd文件中uid列大于等于500的客户行就可以

[[email protected]~]``#awk-vFS=':''$3>=500{print$0}'/etc/passwd``nfsnobody:x:65534:65534:AnonymousNFSUser:``/var/lib/nfs``:``/sbin/nologin``lijun:x:500:500:lijun:``/home/lijun``:``/bin/bash``[[email protected]~]``#

此处运用可行情势相称,即awk语法格式中的pattern的定义。

总结四:PATTERN:

涉嫌表明式,即上例中的’$3>=500

论及到比较操作符: >,>=,< ,<=,==,!=

(2)使用ifconfig eth1展现eth1网卡的布署新闻,抓取ip地址所在的行

[[email protected]~]``#ifconfigeth1``eth1Linkencap:EthernetHWaddr00:0C:29:70:8F:0B````inetaddr:192.168.100.2Bcast:192.168.100.255Mask:255.255.255.0````inet6addr:fe80::20c:29ff:fe70:8f0b``/64``Scope:Link````UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1````RXpackets:3806errors:0dropped:0overruns:0frame:0````TXpackets:1764errors:0dropped:0overruns:0carrier:0````collisions:0txqueuelen:1000````RXbytes:350119(341.9KiB)TXbytes:189329(184.8KiB)``[[email protected]~]``#

因IP地址所在的行在其次行,故借助N奔驰G级能够抓收取来。

[[email protected]~]``#ifconfigeth1|awk'NR==2{print$0}'````inetaddr:192.168.100.2Bcast:192.168.100.255Mask:255.255.255.0``[[email protected]~]``#

3.7)呈现/etc/passwd文件中root客商行信息

因在/etc/passwd文件每一行先导的都以客户名,故抓取root开头且为独立单词的行就可以,正则表达式为^root\>

[[email protected]~]``#awk-F':''/^root\>/{print$0}'/etc/passwd``root:x:0:0:root:``/root``:``/bin/bash``[[email protected]~]``#

总结四:PATTERN:

/regular expression/:仅处理能被/regular expression/相配的行

上述例子中root若不加词尾锚钉,会冒出下列现象:

[[email protected]~]``#awk-F':''/^root/{print$0}'/etc/passwd``root:x:0:0:root:``/root``:``/bin/bash``rootli:x:501:501::``/home/rootli``:``/bin/bash

3.8)呈现/etc/passwd文件中root伊始的行至shutdown初始的行之间的开始和结果

[[email protected]~]``#awk-F':''/^root/,/^shutdown/{print$0}'/etc/passwd``root:x:0:0:root:``/root``:``/bin/bash``bin:x:1:1:bin:``/bin``:``/sbin/nologin``daemon:x:2:2:daemon:``/sbin``:``/sbin/nologin``adm:x:3:4:adm:``/var/adm``:``/sbin/nologin``lp:x:4:7:lp:``/var/spool/lpd``:``/sbin/nologin``sync``:x:5:0:``sync``:``/sbin``:``/bin/sync``shutdown``:x:6:0:``shutdown``:``/sbin``:``/sbin/shutdown``rootli:x:501:501::``/home/rootli``:``/bin/bash``[[email protected]~]``#

总结四:PATTERN:

line rangs:行限制,类似于sed 或vim 中的定界符,startline,endline

3.9)打字与印刷系统上shell为bash的客商,开首和了结要有刚烈提醒:

[[email protected]~]``#awk-F:'BEGIN{print"======================"}BEGIN{printf"%-15s%-s\n","username","shell"}$NF~/bash$/{printf"%-15s%-s\n",$1,$NF}END{print"======================"}'/etc/passwd``======================``usernameshell``root``/bin/bash``lijun``/bin/bash``rootli``/bin/bash``======================``[[email protected]~]``#

总结四:PATTERN:

BEGIN:同要管理的文本内容无妨,只是在享有awk动作在此以前实行三个动作
END:在awk全数的动作甘休后,实施的动作

3.10)展现系统中的顾客uid在0与100之间的顾客

因顾客的UID在/etc/passwd文件中第3有些,由此假如对/etc/passwd文件使用”:”为输入行分隔符,抓取第一盘部开展规范过滤就能够兑现

[[email protected]~]``#awk-F':''{if($3>0)if($3<100)printf"%-12s%-d\n",$1,$3}'/etc/passwd``bin1``daemon2``adm3``lp4``sync``5``shutdown``6``halt7``mail8``uucp10``operator11``games12``gopher13``ftp``14``nobody99``dbus81``vcsa69``rpc32``rpcuser29``haldaemon68``gdm42``ntp38``apache48``postfix89``sshd74``tcpdump72``[[email protected]~]``#

总计五:awk中的调控语句if;

格式:

if(condition){statement1;statement2;…}[else
{statement1;statement2;…}]
当 statement唯有贰个时,{}能够被概括
单分支if语句时 {}可省略

下边包车型客车例子中if语句相当于2个if语句的嵌套,若写成bash脚本格式如下:

if [ $3 -gt 0 ];then

if [ $3 -lt 100 ];then

echo …..

fi

fi

awk中是还是不是毫不写关闭符很爽,不用写bash脚本那样刻板的格式很爽,那就去游玩python吧,python的本子写着同一很爽,至少比bash
爽。

3.11)呈现/etc/inittab文件首先句中每一种字段的长度

[[email protected]~]``#head-1/etc/inittab|awk'{i=1;while(i<=NF){print$i,length($i);i++}}'``#1``inittab7``is2``only4``used4``by2``upstart7``for``3``the3``default7``runlevel.9``[[email protected]~]``#``#length($i)是awk的内置函数,用来显示字符串的长度。

小结五:awk中的调整语句:while

格式:
while(condition){statment1;statment2;…}
规范为真时循环,直到为假时退出;
常见用于在当下行的各字段间举办巡回。

在上头的awk语句中定义了变量i,NF为awk内置变量表示近年来行可被分割成的字段数,当变量i<=NF为真时,while循环运行,展现$i为index的字段,length($i)为字段的尺寸,让后用i++自加,辅导i<=NF为假时,结束while循环,甘休打印。

地方的例证使用别的一种格式来促成:

[[email protected]~]``#head-1/etc/inittab|awk'{for(i=1;i<=NF;i++)print$i,length($i)}'``#1``inittab7``is2``only4``used4``by2``upstart7``for``3``the3``default7``runlevel.9``[[email protected]~]``#

计算五:awk中的调控语句:for

格式:

for:
for(expr1;expr2;expr3) statement
expr1:变量最先值
expr2:条件
expr3:变量变化

3.12)打字与印刷/etc/passwd中uid为奇数的客商条目款项

[[email protected]~]``#awk-F':''{if($3%2!=0)print$0}'/etc/passwd``bin:x:1:1:bin:``/bin``:``/sbin/nologin``adm:x:3:4:adm:``/var/adm``:``/sbin/nologin``sync``:x:5:0:``sync``:``/sbin``:``/bin/sync``halt:x:7:0:halt:``/sbin``:``/sbin/halt``operator:x:11:0:operator:``/root``:``/sbin/nologin``gopher:x:13:30:gopher:``/var/gopher``:``/sbin/nologin``nobody:x:99:99:Nobody:/:``/sbin/nologin``dbus:x:81:81:Systemmessagebus:/:``/sbin/nologin``usbmuxd:x:113:113:usbmuxduser:/:``/sbin/nologin``vcsa:x:69:69:virtualconsolememoryowner:``/dev``:``/sbin/nologin``rtkit:x:499:497:RealtimeKit:``/proc``:``/sbin/nologin``abrt:x:173:173::``/etc/abrt``:``/sbin/nologin``rpcuser:x:29:29:RPCServiceUser:``/var/lib/nfs``:``/sbin/nologin``postfix:x:89:89::``/var/spool/postfix``:``/sbin/nologin``pulse:x:497:496:PulseAudioSystemDaemon:``/var/run/pulse``:``/sbin/nologin``rootli:x:501:501::``/home/rootli``:``/bin/bash``[[email protected]~]``#

别的一种写法:

[[email protected]~]``#awk-F':''{if($3%2==0)next;print$0}'/etc/passwd``bin:x:1:1:bin:``/bin``:``/sbin/nologin``adm:x:3:4:adm:``/var/adm``:``/sbin/nologin``sync``:x:5:0:``sync``:``/sbin``:``/bin/sync``halt:x:7:0:halt:``/sbin``:``/sbin/halt``operator:x:11:0:operator:``/root``:``/sbin/nologin``gopher:x:13:30:gopher:``/var/gopher``:``/sbin/nologin``nobody:x:99:99:Nobody:/:``/sbin/nologin``dbus:x:81:81:Systemmessagebus:/:``/sbin/nologin``usbmuxd:x:113:113:usbmuxduser:/:``/sbin/nologin``vcsa:x:69:69:virtualconsolememoryowner:``/dev``:``/sbin/nologin``rtkit:x:499:497:RealtimeKit:``/proc``:``/sbin/nologin``abrt:x:173:173::``/etc/abrt``:``/sbin/nologin``rpcuser:x:29:29:RPCServiceUser:``/var/lib/nfs``:``/sbin/nologin``postfix:x:89:89::``/var/spool/postfix``:``/sbin/nologin``pulse:x:497:496:PulseAudioSystemDaemon:``/var/run/pulse``:``/sbin/nologin``rootli:x:501:501::``/home/rootli``:``/bin/bash``[[email protected]~]``#

小结五:awk中的调节语句,中出色重点字:

next:提前甘休对行当的拍卖,而步入下一行的处理

break:跳出当前轮回

continue:提前结束本轮循环,步向下一轮循环

在上头的例子中应用$3%2:$3对2取模,正是求余数,若余数为0,则被除数$3为偶数,若余数不为0则被除数$3为奇数。

3.13)总括当前OS的tcp连接情形和情形的个数

呈现os的tcp连接情形:

[[email protected]~]``#ss-tan``StateRecv-QSend-QLocalAddress:PortPeerAddress:Port``LISTEN0128:::22:::*``LISTEN0128*:22*:*``LISTEN0128127.0.0.1:631*:*``LISTEN0128::1:631:::*``LISTEN0128*:60791*:*``LISTEN0100::1:25:::*``LISTEN0100127.0.0.1:25*:*``LISTEN05*:5901*:*``LISTEN0128:::111:::*``LISTEN0128*:111*:*``LISTEN0128:::45680:::*``ESTAB00192.168.100.2:22192.168.100.100:49280``[[email protected]~]``#

能够见到侧边第一列正是tcp的一而再情状,可是首先行要去掉。

[[email protected]~]``#ss-tan|awk'!/^State/{connect[$1]++}END{for(iinconnect)printi,connect[i]}'``ESTAB1``LISTEN11``[[email protected]~]``#

总结六:awk的数组:

格式:array_name[index-expression]

awk中的数组是涉嫌数组,有的编制程序语言如python中会称关联数组为字典。
index-expression:可以运用任性字符串;
要是某数组成分不设有,在援引时,awk会自动创造该因素并将其早先化为空白
在数组中遍历每一个因素:使用 for(var in array){for body}
var会遍历array的每三个目录,print array[var]显示该索引代表的值

下面的例子中采用/^State/,那些正则表明式相称#ss
-tan的率先行,使用!/^State/
表示对这一个形式取反,即要管理不以State最初的行。定义了关联数组connect[],使用$1为数组的index值,管理每一行时,若connect[$1]存在则数字加1,若connect[$1]不设有则开创。awk动作甘休后,使用for语句来管理,上例中i代表connect数组的index,connect[i]则为该index对应的值。

总计七:awk的松开函数管理字符串时使用:
字符串管理:

length([s]):重回钦点字符串的尺寸
sub(r,s[,t]):以r所代表的方式来搜寻t字符串中的相称,将其首先次出现替换同s所代表的字符串
#awk -F:'{sub(root,ROOT,$0)}’ /etc/passwd

gsub(r,s[,t]):以r所表示的形式来寻找t字符串中的相称,将享有出现替换为s所代表的字符串
split(s,a[,r]):以r为分隔符切割字符串s,并将切割的结果保存至数组a中,
len=split(s,a[,r])为被切割后的段数

#netstat -tan|awk
‘/^tcp/{len=split($5,count,”:”);ip[count[len-1]]++}END{for(i in
ip){print i,ip[i]}}’

<总结连接中,Foreign Address现身的次数>
substr(s,i[,n]):从s表示的字符串中取子串,从i开端,取n个字符

4 awk实在行使比如:

4.1)抽取当前网卡eth1的ipv4地址:

eth1地址格式:

[[email protected]~]``#ifconfigeth1``eth1Linkencap:EthernetHWaddr00:0C:29:70:8F:0B````inetaddr:192.168.100.2Bcast:192.168.100.255Mask:255.255.255.0````inet6addr:fe80::20c:29ff:fe70:8f0b``/64``Scope:Link````UPBROADCASTRUNNINGMULTICASTMTU:1500Metric:1````RXpackets:14759errors:0dropped:0overruns:0frame:0````TXpackets:13311errors:0dropped:0overruns:0carrier:0````collisions:0txqueuelen:1000````RXbytes:1331116(1.2MiB)TXbytes:7782755(7.4MiB)``[[email protected]~]``#

处理方式:

[[email protected]~]``#ifconfigeth1|awk-F'[:]+''NR==2{print$4}'``192.168.100.2``[[email protected]~]``#

说明:-F ‘[ :]+’ 钦定输入行分隔符为
空格和’:’,+表示出现的次数至少1次,

inet addr : 192.168.100.2 。。。。

第一列 第二列 第三列 第四列 忽略

N福特Explorer表示前段时间管理的行在文书中的地点行号。

若依然不晓得,自身动手试试or画个圈圈诅咒本身的灵性吗!

4.2)总括上面apache access日志中提交的ip地址和访谈次数

[[email protected]~]$``cat``3.txt``10.0.0.41--[03``/Dec/2010``:23:27:01+0800]``"HEAD/checkstatus.jspHTTP/1.0"``200-``10.0.0.43--[03``/Dec/2010``:23:27:01+0800]``"HEAD/checkstatus.jspHTTP/1.0"``200-``10.0.0.42--[03``/Dec/2010``:23:27:01+0800]``"HEAD/checkstatus.jspHTTP/1.0"``200-``10.0.0.46--[03``/Dec/2010``:23:27:02+0800]``"HEAD/checkstatus.jspHTTP/1.0"``200-``10.0.0.42--[03``/Dec/2010``:23:27:02+0800]``"HEAD/checkstatus.jspHTTP/1.0"``200-``10.0.0.47--[03``/Dec/2010``:23:27:02+0800]``"HEAD/checkstatus.jspHTTP/1.0"``200-``10.0.0.41--[03``/Dec/2010``:23:27:02+0800]``"HEAD/checkstatus.jspHTTP/1.0"``200-``10.0.0.47--[03``/Dec/2010``:23:27:02+0800]``"HEAD/checkstatus.jspHTTP/1.0"``200-``10.0.0.41--[03``/Dec/2010``:23:27:03+0800]``"HEAD/checkstatus.jspHTTP/1.0"``200-``10.0.0.46--[03``/Dec/2010``:23:27:03+0800]``"HEAD/checkstatus.jspHTTP/1.0"``200-

处理形式:

[[email protected]~]$``awk``'{S[$1]++}END{for(ainS)printa,S[a]}'``3.txt|``sort``-rn-k2``10.0.0.413``10.0.0.472``10.0.0.462``10.0.0.422``10.0.0.431

以此就不用说了啊,只是awk管理数组和sort的联用,轻巧的略微可耻。

4.3)打字与印刷当前系统上,磁盘分区使用超越百分之十的分区的分区名,可使用空间和挂载点:

[[email protected]~]``#df-hP|awk'$1!~/^File/{if($5>="10%")printf"%-10s%-6s%-s\n",$1,$4,$6}'``/dev/sda2``14G/``/dev/sda1``153M``/boot``[[email protected]~]``#

6.6上awk命令的简便利用
本文实验情状:vmware workstation 10 +Centos6.6
X86_64,文中命令请小心运用。
AWK是类UNIX操作系统中一款文本管理工科具…

如何利用 awk 的 ‘next’ 命令

导读在 awk 类别小说中,大家来看一下next 命令 ,它报告 awk
跳过您所提供的具备盈余的情势和表明式,直接管理下二个输入行。next
命令支持你阻止运维命令施行进度中剩下的手续。

威尼斯网址开户网站 1
要精通它是何等工作的, 让大家来剖判一下 food_list.txt 它看起来像这样:

Food List ItemsNo      Item_Name               Price           Quantity1       Mangoes                 $3.45              52       Apples                  $2.45              253       Pineapples              $4.45              554       Tomatoes                $3.45              255       Onions                  $1.45              156       Bananas                 $3.45              30>

运营下边包车型客车下令,它将要每一个食品数量紧跟于或然等于 20 的行前边标二个星号:

# awk '$4 <= 20 { printf "%s/t%s/n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt No    Item_Name     Price      Quantity1     Mangoes       $3.45       5    *2     Apples        $2.45      253     Pineapples    $4.45      554     Tomatoes      $3.45      25 5     Onions        $1.45      15   *6     Bananas       $3.45      30

上边的授命实际运作如下:
1.它用$4 <=
20表明式检查每一种输入行的第四列(数量(Quantity))是或不是低于大概等于
20,倘诺满意条件,它就要终极打多少个星号 (*)。
2.它用$4 >
20表明式检查每一个输入行的第四列是或不是高于20,纵然满意条件,展现出来。

唯独此地有四个标题, 当第一个表明式用{ printf “%s/t%s/n”, $0,”**” ;
}命令实行标明的时候在同样的步调第三个表明式也张开了剖断那样就浪费了岁月。由此当大家早已用第一个表明式打字与印刷标识行的时候就不再供给用第1个表明式$4
> 20再度打字与印刷。

要拍卖那个主题材料, 大家须要运用next 命令:

# awk '$4 <= 20 { printf "%s/t%s/n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt

威尼斯网址开户网站 2

当输入行用$4 <= 20 { printf “%s/t%s/n”, $0,”*” ; next ;
}命令打印现在,next命令将跳过第二个$4 > 20 { print $0
;}表达式,继续推断下五个输入行,实际不是浪费时间继续判断一下是否当前输入行还不止20。

next命令在编辑高效的一声令下脚本时候是极度主要的,它能够抓牢脚本速度。

初稿来自:

转发地址:

awk 的 ‘next’ 命令 导读 在 awk
种类文章中,大家来看一下next 命令 ,它告诉 awk
跳过您所提供的兼具盈余的方式和表明式,直接…

一、简介

awk命令是一种编制程序语言,用于在linux/unix下对文件和数据开展扫描和处理的工具,其数据来源可感到标准输入、文件、管道等等。awk命令会从第一行输入初叶逐行扫描至最终一行,搜索在这之中相当特定情势的行,并在对应的行上试行顾客钦命的操作。Awk命令的中央架构由形式相称和管理动作结合,私下认可处理动作为print打字与印刷行。

awk用来拍卖文件和数量,效率很强劲,若是是有些简约的操作,能够使用cut命令来贯彻

本文主要介绍了Linux中的awk命令的一部分学问以及怎样运用awk编制程序。分化于grep的物色、sed的编辑撰写等一声令下,awk命令在文本管理和扭转报告等地点是临时选取的三个无敌命令。

二、awk命令的选择

cut常用的参数时-d前边家分隔符,分隔符使用引号括起来;-f后边随着要选择的字段(这些字段的相间今后边内定的相间符为准),列数最小值为1,表示第一列,假诺要多列,能够用逗号分隔
;-c参数前边随着要接纳的字符偏移,-b表示后边跟着要挑选的字节偏移;

简介

awk命令首要用以文书分析。它的管理情势是读入文本,将每行记录以自然的分隔符(默认为空格)分割成区别的域,然后对不一样的域进行各样处理与输出。

1、命令格式

gawk [options] 'program...' FILE ...

那个选拔后边随着的参数能够运用空格分隔,也足以不加空格;

指令格式

awk命令的三个主旨格式如下:

1
awk '{pattern + action}' {filenames}

无论awk命令轻便照旧复杂,基本的格式如上所示。在这之中引号为必需,引号内代表二个awk程序。大括号非必得,括起来用于依据特定的形式对一雨后春笋指令打开分组。pattern是在数码中寻找内容,帮助正则相称。action对寻觅出来的笔录试行相应的处理,比如打字与印刷和输出等。

2、常见选项

-F fs:指明字段分隔符;
-v var=value:自定义变量;
-f programfile:从文件中读取program命令;

还要可以使用start-end表示五个距离,消除使用逗号的烦心。

awk三种调用形式

3、program语句

其program语句的常见格式为:PATTERN{action,statements},当中八个program语句之间通过;分隔。

  • 其中PATTERN格式为:
    1)empty:航空模型式,表示卓绝每一行,如:awk -F: ‘{print $1,$3}’
    /etc/passwd 表示以:为分隔符,打字与印刷每行的第一和第七个字段 。
    2)/regular expression/:仅管理能够被此方式相配到的行,如:awk
    -F: ‘/^root/{print $1,$3}’
    /etc/passwd,表示以:为分隔符,打字与印刷以root初阶的行的率先和第八个字段;
    3)/PATTERN1/,/PATTERN2/:表示仅管理从第二个被pattern1相称到行,到第多少个被pattern2所相配的行之间的具有行,如:awk
    -F: ‘/root/,/shutdown/{print $1,$3}’
    /etc/passwd,表示以:为分隔符,打字与印刷从第三个以root初步的行到第三个以shutdown初阶的行之间的全体行的第一和第多个字段。
    4)relation
    expression
    :使用关系表明式举办相配,独有结果会真正行才会被拍卖,如:awk
    -F: ‘(N奥迪Q5>=10&&N奥迪Q5<=20){print $1,$3}’
    /etc/passwd,表示以:为分隔符,打字与印刷10-20行的率先和第多少个字段;
    5)BEGIN{}和END{}
    BEGIN{}:表示在最初拍卖行前实施一回钦赐的操作;
    END{}:表示在终结对行的管理后推行壹遍钦点的操作;
    如:awk -F: ‘BEGIN{print “This is the begin.”};{print
    $1,$3};END{print “This is the end.”}’
    /etc/passwd,表示在实行行打字与印刷操作前,先打字与印刷钦赐的字符串”This is the
    begin.”,在实行行打字与印刷操作后再打字与印刷字符串“This is the end.”

  • program语句的变量
    program中寄存了一部分变量,在编排program语句时亦可平昔调用相应的变量,进而简化语句。调用内建变量时不须要加$

FS:输入字段分隔符,默感觉空白字符;
OFS:输出字段分隔符,默以为空白字符;
EnclaveS:输入时的换行符;
O奇骏S:输出时的换行符;
NF:每行的字段数,$NF代表最后叁个字段;
NLAND:表示行数;
FN昂科拉:若提供多少个文本,则分别总括各文件的行数;
FILENAME:当前文件名;
A奥迪Q5GC:命令行参数的个数;
A哈弗GV:参数数组,保存的是命令行给定的各参数;

别的也得以在awk命令中自定义相关的变量,能够采纳-v选项自定义变量,也能够在言语个中进行赋值操作,如:awk
‘BEGIN{test=”hello awk”; print test}’、ls -l | awk ‘/root/{hello=”this
is a test.”;print $3,hello}’

  • action
    常见的action动作有:print、printf
    1)print命令
    其接纳格式类似于print item1,item2,...,使用逗号作为分隔符,输出的item可以为字符串,也得感到数值,也得觉稳妥前记下的字段、变量或表达式等。如若轻易了item,则也正是print
    $0打字与印刷全部行。
    2)printf命令
    printf命令常用于格式化输出awk命令的推行结果音信。其格式类似于printf FORMAT,item1,item2...,个中必须钦命FORMAT格式;如需换行,需手动增加\n换行符;在FORMAT中须要各自为后边的各类item钦定多个格式符。
    其相应的格式符有:

%c: 展现字符的ASCII码;
%d, %i: 展现十进制整数;
%e, %E: 科学计数法数值展现;
%f:展现为浮点数;
%g, %G:以科学计数法或浮点格局突显数值;
%s:展现字符串;
%u:无符号整数;
%%: 显示%自身

里头还足以运用以下修饰符对格式符举行输出格式的整治:

#[.#]:第一个#数字调整格式符呈现的小幅度;第二个#数字代表格式符呈现的源委的正确度,只突显最大尺寸为#的格式符内容;
-:左对齐,默以为右对齐;
+:展现数值的暗记;

正如示例:

[root@localhost ~]# awk -F: '{printf "The user:%-20s User ID:%15d\n",$1,$3} ' /etc/passwd
The user:root                 User ID:              0
The user:bin                  User ID:              1
The user:daemon               User ID:              2
The user:adm                  User ID:              3
The user:lp                   User ID:              4
The user:sync                 User ID:              5
The user:shutdown             User ID:              6
The user:halt                 User ID:              7
The user:mail                 User ID:              8
The user:operator             User ID:             11
The user:games                User ID:             12
The user:ftp                  User ID:             14
The user:nobody               User ID:             99
The user:avahi-autoipd        User ID:            170
The user:systemd-bus-proxy    User ID:            999
The user:systemd-network      User ID:            998
The user:dbus                 User ID:             81
The user:polkitd              User ID:            997
The user:tss                  User ID:             59
The user:postfix              User ID:             89
The user:sshd                 User ID:             74
  • 原则表达式
    awk命令的program语句也补助通过标准表明式来剖断调控,其表明式补助相近的算术、赋值、相比等操作符,如:+,-,*,/,%,=,+=,>,<,~等等的操作符,也援救逻辑操作与或非,其格式为:

awk [optioins]
‘{selector?if-true-expression:if-false-expression;action statements}’
/PATH/TO/SOMEFILE

如依照客户ID推断对应客户是系统客户依旧普通客商:

[root@localhost ~]# awk -F:  '{$3>=1000?usertype="this is a common user.":usertype="This is a system user.";printf "%20s:%-s\n",$1,usertype}' /etc/passwd
                root:This is a system user.
                 bin:This is a system user.
              daemon:This is a system user.
                 adm:This is a system user.
                  lp:This is a system user.
                sync:This is a system user.
            shutdown:This is a system user.
                halt:This is a system user.
                mail:This is a system user.
            operator:This is a system user.
               games:This is a system user.
                 ftp:This is a system user.
              nobody:This is a system user.
             pegasus:This is a system user.
       avahi-autoipd:This is a system user.
                 ods:This is a system user.
   systemd-bus-proxy:This is a system user.
     systemd-network:This is a system user.
                dbus:This is a system user.
             polkitd:This is a system user.
                sssd:This is a system user.
              apache:This is a system user.

诸如这一个实例:

命令市场价格势

1
awk [-F 'field-separator'] 'commands' input-file(s)

其中的-F指令是可选的,后边跟着内定的域分隔符,比方tab键等(私下认可是空格)。前面包车型地铁commands是真的的awk命令。input-file(s)代表输入的贰个或多个公文

指令行调用艺术是最常常应用的一种办法,也是本文所讲的基本点。

三、使用案例

  • 格式化打字与印刷当前系统的顾客列表

[root@localhost ~]# awk -F: 'BEGIN{print "User lists"};{printf "User:%-25s\n",$1};END{print "This is the end."}' /etc/passwd
User lists
User:root                     
User:bin                      
.....  
User:nologin                  
User:hadoop                   
This is the end.
[root@localhost ~]# 
  • 探究打字与印刷以/bin/bash为暗中认可shell的客户消息:

[root@localhost ~]# awk -F: '$7~/.*bash\>/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
centos:x:1001:1001::/home/centos:/bin/bash
federo:x:1002:1002::/home/federo:/bin/bash
counter:x:1003:1004::/home/counter:/bin/bash
charlie:x:1004:1005::/home/charlie:/bin/bash
Jone:x:1006:1007::/Jone:/bin/bash
Williom:x:1200:1005::/home/Williom:/bin/bash
mageia:x:1100:1100::/home/linux:/bin/bash
bash:x:2003:2003::/home/bash:/bin/bash
testbash:x:2004:2004::/home/testbash:/bin/bash
basher:x:2005:2005::/home/basher:/bin/bash
hadoop:x:2007:2007::/home/hadoop:/bin/bash
  • 赢得系统网卡的Ip地址

[root@localhost ~]# ifconfig | awk '/inet\>/{print $2}'
188.88.88.42
127.0.0.1
192.168.122.1
  • 相比较之下多个公文的源委

[root@localhost tmp]# cat a.sh 
hello,world
i am charlie
this is my linux
magedeu
[root@localhost tmp]# cat b.sh 
1
hello,world
2
i am charlie
3
this is my linux
4
magedeu
[root@localhost tmp]# awk 'FNR==NR{a[$0];next}{if($0 in a)print $0}' a.sh b.sh
hello,world
i am charlie
this is my linux
magedeu

上述awk命令在FN巴博斯 SL级和NHighlander的等式创制的时候,将文件a.sh每行的剧情作为数组a下标,然后实施next跳过接二连三if判别语句;当FN奥迪Q7和N大切诺基的等式不创设的时候,不施行a[$0];next,施行前边的if语句,推断b.sh中的每行内容是或不是为a数组中的成分下标,是的话就打印该行音讯。

同理,利用取反找寻差别的行:

[root@localhost tmp]# awk 'FNR==NR{a[$0];next}{if (!($0 in a))print $0}' a.sh b.sh
1
2
3
4
  • 从文件中读取program语句实行awk命令
    此间以下面文件相比较的吩咐为例:

[root@localhost tmp]# cat awk.sh 
FNR==NR{
    a[$0];
    next
}
{
    if (!($0 in a))
    print $0
}
[root@localhost tmp]# awk -f awk.sh a.sh b.sh
1
2
3
4

如有错误,招待指引~

ubuntu@ubuntu:~$ cat test.txt
aaaaa;bbbbb;ccccc
ddddddd;eeeeee
fffff;gggggggg!iii;jjjjjj;kkkk
ubuntu@ubuntu:~$ cut -f 2,3 -d ";" test.txt #注意分隔符使用引号括起来
bbbbb;ccccc
eeeeee
gggggggg!iii;jjjjjj
ubuntu@ubuntu:~$ #上一条命令的作用是选择以;分隔之后的第2和第3字段

shell脚本方式

把平时所写的shell脚本的首行#!/bin/sh换成#!/bin/awk。把装有的awk命令插入脚本中,通过调用脚本来实践awk命令。

  

布置文件调用

把具有的awk命令插入单独的文件中,然后经过以下命令调用awk:

1
awk -f awk-script-file input-file(s)

其中-f钦赐了要调用的含有awk命令的文件。

动用-表示区间

awk应用示范

ubuntu@ubuntu:~$ cat test.txt
aaaaa"bbbbb"ccccc
ddddddd"eeeeee
fffff"gggggggg!iii"jjjjjj"kkkk
ubuntu@ubuntu:~$ cut -f 1-2 -d '"' test.txt
aaaaa"bbbbb
ddddddd"eeeeee
fffff"gggggggg!iii
ubuntu@ubuntu:~$ cut -d '"' -c 1-3 test.txt
cut: an input delimiter may be specified only when operating on fields
Try 'cut --help' for more information.
ubuntu@ubuntu:~$ 

打字与印刷钦点字段

打印当前目录下具有的文件名和文件大小列表,以tab键分割:

1
ls -lh | awk '{print $5"\t"$9}'

$0变量是指当前一行记录,$1是指第一个域数据,$2指第一个域数据……就那样推算。

  注意:-d只可以和-f一齐协作使用,而-c和-b无法和-d一同行使,只好单独选拔。

print与printf

awk提供了print与printf两种打字与印刷输出的函数。

print的参数能够是变量、数值和字符串。参数用逗号分割,字符串必需用双引号援用。

printf与C语言中的printf函数类似,能够用来格式化字符串。

1
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd

 

基于钦定分隔符切割域

1
ll | awk -F '\t' 'print $9'

然后是awk

BEGIN…END

1
ls -lh | awk 'BEGIN {print "size\tfilename"}  {print $5"\t"$9} END {print "---end---"}'

BEGIN...END言辞的实施流程是,awk命令读入数据,然后从BEGIN语句初阶,依次读取每一行记录,并打字与印刷相应的域,当全体记录都管理后再实行END语句后的顺序。也等于说BEGIN...END语句块中的内容在读取数据进度中会一再施行,直到数据读取实现。

-F 前边加上分隔符
,提议空格分开后,使用引号将分隔符括起来,不加-F时,默许是以空格分隔。$0代表整行数据,$1表示第3个字段

pattern正则相配

上面包车型客车例子表示打字与印刷当前目录下,全部以.bat后缀结尾的文本名列表:

1
ls -l | awk -F: '/\.dat$/{print $9}'
ubuntu@ubuntu:~$ cat test.txt
aaaaa"bbbbb"ccccc
ddddddd"eeeeee
fffff"gggggggg!iii"jjjjjj"kkkk
ubuntu@ubuntu:~$ cat test.txt | awk -F '"' '{print $1"=>"$2}'
aaaaa=>bbbbb
ddddddd=>eeeeee
fffff=>gggggggg!iii

awk内置变量

awk有相当多平放变量用来设置情况变量新闻,那一个变量都足以被转移。常用的嵌入变量和职能如下所示:

1
2
3
4
5
6
7
8
9
10
11
ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行-F选项
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 指定用来切片的分隔符

awk中的内置变量都以很有用处的,可以一贯利用。举个例子下边讲过的内定分隔符操作就能够用FS变量来代替:

1
ll | awk '{FS="\t";} {print $9}'

上面会有那个实用awk内置变量的事例。

  awk特别强劲,这里提一丝丝,能够参见

awk编程

概念变量和平运动算

awk能够自定义变量,并参预运算。

比方说总括当前目录下列出的文书总大小,以M为单位出示出来:

1
ls -l | awk 'BEGIN {size=0;} {size+=$5;} END {print "size is ", size}'

注意此总计未有把公文夹下的有着文件算在内。

自定义的变量有的时候候可以毫不作初始化操作,可是行业内部起见,照旧建议作伊始化操作为好。

标准语句

awk中的条件语句跟C语言类似,注解格局如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(expression){
  statement1;
  statement2;
}
if(expression){
  statement1;
} else {
  statement2;
}
if(expression1){
  statement1;
} else if (expression2) {
  statement2;
} else {
  statement3;
}

看上边例子,将第三列为12,第六列为0的行打字与印刷输出:

1
awk 'BEGIN {FS="\t"}{if($3==12 && $6==0) print $0} END' incoming_daily_20150223.dat

循环语句

awk中的循环语句一样与C语言中的类似,扶助while、do/while、for、break、continue关键字。

看上边的例子,输出每行的行号和第一列的多寡:

1
awk 'BEGIN {FS="\t";} {data[NR] = $1} END {for(i=1; i<=NR; i++) print i"\t"data[i]}' incoming_daily_20150223.dat

数组

看上面例子,计算第六列每多少个值出现的次数:

1
awk 'BEGIN {FS="\t"}{count[$6]++} END {for(x in count) print x,count[x]}' incoming_daily_20150223.dat

Linux系统之文本格式化学工业具awk
http://www.linuxidc.com/Linux/2016-02/128150.htm

AWK简单介绍及利用实例
http://www.linuxidc.com/Linux/2013-12/93519.htm

Linux awk文本深入分析工具
http://www.linuxidc.com/Linux/2015-12/126217.htm

Linux文本管理工具之awk 
http://www.linuxidc.com/Linux/2015-01/111437.htm

如何在Linux中使用awk命令
http://www.linuxidc.com/Linux/2014-10/107542.htm

文本解析工具-awk 
http://www.linuxidc.com/Linux/2014-12/110939.htm

选用awk格式化输出文本
http://www.linuxidc.com/Linux/2016-04/130193.htm

正文恒久更新链接地址:http://www.linuxidc.com/Linux/2016-08/134623.htm

威尼斯网址开户网站 3

相关文章