awk:处理文本文件的上方宝剑!
awk基本命令格式
awk ‘模式{操作}’ 文件1 文件2 ……
模式:匹配
操作:print
模式:
模式是一种表达式。
BEGIN 和 END 是两个特殊的模式,BEGIN 在第一条记录被读取之前匹配,END 在最后一条记录处理完
之后匹配。
awk 的程序可以以两种方法来运行:
1. 直接命令行方式:
awk 'pattern-action statements' input file list
其中 “模式-动作” 语句必须括在单引号中。
2. awk 命令程序方式:
通常将 awk 程序放在一个单独的文本文件中,然后用 -f 选项来引用:
awk -f awk file input file list
其实应该以.awk作为文本文件,因为awk语法格式只有,awk文件能识别。
所以为了发挥其最大的功能,建议使用.awk文件来编写你的awk程序。
awk 的变量分为内部变量和用户定义的变量两种。
awk 的内部变量有:
FS:字段分割符
NF:当前记录中的字段数
NR:至今读取的记录数
OFS:输出字段分割符
ORS:输出记录分割符
RS:输入记录分割符
如果你想在该文件中查找某个特定的字符串:
awk '/需要查找的字符串/{print}‘ 文件名
结果将把该字符串所在行打印出来
awk ‘ NR == 1,NR==3{print} ‘ file.txt :打印file.txt文件的第一行到第三行的内容
awk ’ ( NR==1) || (NR==3){print}‘ file.txt :打印file.txt文件的第一行和第三行的内容
awk '/bash$/{print}' file.txt :打印以bash结尾的行
awk 'NR==1,NR==5{print $1,$3}' file.txt :打印从第一行到第五行中第一个字符串和第三个字符串,字符串用空格隔开
awk -F":" {print $1,$3} file.txt :打印所有行第一个和第三个字符串,字符串用‘:’隔开,参数-F":"的做哟你
打印语句会输出双引号里的内容:
awk -F":" '{print "username:" $1,"\tuid:" $3} /etc/passwd 显示所有的用户名和用户名的uid,形式如:username:dengcan uid:1000
当然如果你只想查看dengcan这个用户,不如这样:
awk -F":" '/dengcan/{print "username:"$1,"\tuid:"$3}' etc/passwd
注意:转意字符是用反斜线,如:\t
当然你为了显示更美观,可以打印当前的行数,不如这样做:
awk -F":" '{print NR,"\tusername:" $1,"\tuid:" $3}' passwd
注意:{操作}里所有要显示的内容,必须在最前面加print,上例中如果你这么写:
awk -F":" '{NR,print "\tusername:" $1,"\tuid:" $3}' passwd
就会报错!
printf的使用:
『引用』
{ printf("total pay for %ns is $%n.2f\n", $1, $2 * $3) } //%s对应$1,%.2f对应$2*$3,%s表示输入字符串,%.2f表示输出数字保留小数点后2位
注意:printf不会自动换行,所以在双引号里需要加入换行转义符\n
n的含义是在n个字符宽度的字段中左对齐输出
我的第一个awk程序。。。
$ vim chuli.awk
#!bin/awk -f
{print $1}
注意:模式{动作}不需要用单引号扩起来,不然会报错
即‘{print $1}'是错误的!我一开始就是卡在这里!
也不用这么写:awk ... ...
第二个程序。。。
/^$/{print "this is a blank line"}
END {print "Hello World"}
注意:^$表示空行。 /^$/表示匹配空行。。。