0,基本用法awk是一个强大的文本分析工具,简单的说,awk就是逐行读取文件,(空格,制表符)作为默认分隔符对每一行进行切片,然后对切割的部分进行各种分析和处理。awk命令格式如下:awk[-Ffield-separator]'commands'input-file(s)[-Fseparator]是可选的,因为awk使用空格和制表符作为默认的字段分隔符,如果你想浏览文本如果字段之间有空格和制表符,则不需要指定此选项,但如果要浏览文件,例如/etc/passwd,此文件的每个字段都使用冒号作为分隔符,则必须指定-F选项。echo"thisisatest"|awk'{print$0}'##输出是thisisatest。shell读取用户输入的字符串,找到|,说明有管道。|left和right理解为简单命令,即前一个(左)简单命令的标准输出指向下一个(右)标准命令的标准输入awk会根据分隔符将一行分成若干字段,$0是整行,$1是***字段,$2是第二个字段,依此类推...要打印一个字段或所有字段,请使用print命令。Thisisanawkactionecho"thisisatest"|awk'{print$1}'##输出是thisecho"thisisatest"|awk'{print$1,$2}'##输出是thisis/etc/passwd的文件内容如下root:x:0:0:root:/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/nologin几个简单的小需求1.只显示/etc/passwdTheaccountawk-F:'{print$1}'/etc/passwd##输出为rootbindaemonadmlp2,显示/etc/passwd的第一列和第七列,以逗号分隔,在开始前加上列名start1所有行,start7,添加***行,end1,end7awk-F':''BEGIN{print"start1,start7"}{print$1","$7}END{print"end1,end7"}'/etc/passwd##输出为start1,start7root,/bin/bashbin,/sbin/nologindaemon,/sbin/nologinadm,/sbin/nologinlp,/sbin/nologinend1,end7BEGIN语句在所有文本处理动作执行完之前执行,END为在所有文本处理行为之前执行ions执行完之后,会执行3./etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容awk-F:'{printNR""NF""$0}'/etc/passwd##输出为17root:x:0:0:root:/root:/bin/bash27bin:x:1:1:bin:/bin:/sbin/nologin37daemon:x:2:2:daemon:/sbin:/sbin/nologin47adm:x:3:4:adm:/var/adm:/sbin/nologin57lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin1,支持内置变量上例中的NR和NF其实是awk的内置变量,有些内置-in变量如下变量名说明FILENAMEawk浏览的文件名FS设置输入字段分隔符,相当于命令行-F选项NF浏览记录的字段数NR有记录的条数读过"thisisatext")}'##输出为14将/etc/passwd的用户名改为大写输出awk-F':''{printtoupper($1)}'/etc/passwd##输出为ROOTBINDAEMONADMLP常用函数如下名称函数toupper(s)返回s的大写tolower(s)返回s的小写length(s)返回s的长度substr(s,p)返回s中从p开始的后缀部分string3.支持条件运算和正则表达式模式匹配显示/etc/passwd中有daemon行awk-F':''$0~/daemon/'/etc/passwd##输出是daemon:x:2:2:daemon:/sbin:/sbin/nologinawk条件运算符运算符说明<小于<=小于等于==等于!=不等于~匹配正则表达式!~不匹配正则表达式4、支持流控语句,类C语言ifwhiledo/whileforbreakcontinueoutput***awk-F':''{if($1>"d"){print$1}else{print"-"}}'/etc/passwd##outputasroot-daemon-lpcanputflow控制语句写成脚本,然后调用脚本执行,比如test.sh的内容如下{if($1>"d"){print$1}else{print"-"}}用法如下效果同awk-F':'-ftest.sh/etc/passwd##输出为root-daemon-lp5,应用场景小编较少使用awk进行文本分析,主要用于编写脚本如aweibo-interface-1.0.jar应用,启动脚本如下start.shnohupjava-jarweibo-interface-1.0.jar>out2>&1&关闭脚本如下,kill.shkill-9`jps-l|grep'weibo-interface-1.0.jar'|awk'{print$1}'`jps-l输出如下70208com.st.kmp.main.KmpService31036com.st.cis.main.BaiduAnalysisService66813weibo-interface-1.0.jar是关闭Hadoop集群的所有DataNode节点(如果不了解Hadoop,可以认为DataNode是集群应用),如果每台机器jps,查看pid,kill很麻烦,直接写个脚本,然后ssh到各个节点,然后执行下面的命令kill`jps|grep'DataNode'|awk'{print$1}'`jps的输出是508DataNode31481JournalNode31973NodeManager
