awk: awk用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。
o 确保整个awk命令用单引号括起来。
o 确保命令内所有引号成对出现。
o 确保用花括号括起动作语句,用圆括号括起条件语句。
o 可能忘记使用花括号
[hadoop@localhost d5]$ cat 111
Adam Bor,34,IndiaKerry Miller,22,USA
Adamr,434,Millhadooper,322,CHK
[hadoop@localhost d5]$ cat 111 | awk -F, '{print $1,$3}'这里我们使用,作为字段分割符,同时打印第一个和第三个字段
Adam Bor IndiaKerry Miller
Adamr Millhadooper
[hadoop@localhost dzztest]$ more 44
-rwxrwxrwx 1 hadoop hadoop 66 Sep 9 21:48 a1.sh
-rwxrwxrwx 1 hadoop hadoop 109 Sep 9 20:10 a.sh
-rwxrwxrwx 1 hadoop hadoop 128 Sep 10 03:03 b.sh
-rwxrwxrwx 1 hadoop hadoop 204 Sep 10 03:24 c.sh
drwxrwxr-x 2 hadoop hadoop 97 Sep 10 20:02 d11
drwxrwxr-x 2 hadoop hadoop 52 Sep 10 20:51 d12
如果希望打印记录的所有域,不必指明 $1,$2,$3,$4...可使用$0,意即所有域。
[hadoop@localhost dzztest]$ awk '{print $0}' 44
-rwxrwxrwx 1 hadoop hadoop 66 Sep 9 21:48 a1.sh
-rwxrwxrwx 1 hadoop hadoop 109 Sep 9 20:10 a.sh
-rwxrwxrwx 1 hadoop hadoop 128 Sep 10 03:03 b.sh
-rwxrwxrwx 1 hadoop hadoop 204 Sep 10 03:24 c.sh
drwxrwxr-x 2 hadoop hadoop 97 Sep 10 20:02 d11
drwxrwxr-x 2 hadoop hadoop 52 Sep 10 20:51 d12
[hadoop@localhost dzztest]$ awk '{print $1}' 44
-rwxrwxrwx
-rwxrwxrwx
-rwxrwxrwx
-rwxrwxrwx
drwxrwxr-x
drwxrwxr-x
[hadoop@lost est]$ awk 'BEGIN {print "user filename\n------------------"} {print $3"\t"$9} END {print "end-of-report"}' 44
user filename
------------------
hadoop a1.sh
hadoop a.sh
hadoop b.sh
hadoop c.sh
hadoop d11
hadoop d12
end-of-report
下划线使用\n,强迫启动新行,打印信息头放置在BEGIN模式部分,因为打印信息头被界定为一个动作,必须用大括号括起来。
在awk查看第一条记录前,信息头被打印,如果在末行加入end of report信息,可使用E N D语句。
END语句在所有文本处理动作执行,完之后才被执行。END语句在脚本中的位置放置在主要动作之后
模糊查询记录中有sh的记录
[hadoop@localhost dzztest]$ awk '$0~/sh/' 44
-rwxrwxrwx 1 hadoop hadoop 66 Sep 9 21:48 a1.sh
-rwxrwxrwx 1 hadoop hadoop 109 Sep 9 20:10 a.sh
-rwxrwxrwx 1 hadoop hadoop 128 Sep 10 03:03 b.sh
-rwxrwxrwx 1 hadoop hadoop 204 Sep 10 03:24 c.sh
查询文件大小=66的记录
[hadoop@localhost dzztest]$ awk '$5=="66" {print $0}' 44
-rwxrwxrwx 1 hadoop hadoop 66 Sep 9 21:48 a1.sh
变量size等于100,然后传入awk中,查询100以上的行。
[hadoop@localhost dzztest]$ more 44
-rwxrwxrwx 1 hadoop hadoop 66 Sep 9 21:48 a1.sh
-rwxrwxrwx 1 hadoop hadoop 109 Sep 9 20:10 a.sh
-rwxrwxrwx 1 hadoop hadoop 128 Sep 10 03:03 b.sh
-rwxrwxrwx 1 hadoop hadoop 204 Sep 10 03:24 c.sh
drwxrwxr-x 2 hadoop hadoop 97 Sep 10 20:02 d11
drwxrwxr-x 2 hadoop hadoop 52 Sep 10 20:51 d12
[hadoop@localhost dzztest]$ awk '{if ($5 > size) print $0}' size=100 44
-rwxrwxrwx 1 hadoop hadoop 109 Sep 9 20:10 a.sh
-rwxrwxrwx 1 hadoop hadoop 128 Sep 10 03:03 b.sh
-rwxrwxrwx 1 hadoop hadoop 204 Sep 10 03:24 c.sh
快速查看记录个数
[hadoop@localhost dzztest]$ awk 'END {print NR}' 44
6
所有记录被打印,并带有其记录号。使用NF变量显示每一条读记录中有多少个域,并在END部分打印输入文件名。
[hadoop@localhost dzztest]$ awk '{print NF,NR,$0} END {print FILENAME}' 44
9 1 -rwxrwxrwx 1 hadoop hadoop 66 Sep 9 21:48 a1.sh
9 2 -rwxrwxrwx 1 hadoop hadoop 109 Sep 9 20:10 a.sh
9 3 -rwxrwxrwx 1 hadoop hadoop 128 Sep 10 03:03 b.sh
9 4 -rwxrwxrwx 1 hadoop hadoop 204 Sep 10 03:24 c.sh
9 5 drwxrwxr-x 2 hadoop hadoop 97 Sep 10 20:02 d11
9 6 drwxrwxr-x 2 hadoop hadoop 52 Sep 10 20:51 d12
44
2022-9-23