Linux awk 命令简单使用

awk比到目前为止一直讨论的工具都强大得多。

它是一种完整的语言,是一种解析脚本语言。换句话说,在运行它们之前,不需要编译用awk编写的程序。在此将给出几个简单的awk语句,只作为命令行的应用。可以看到,它常常在系统shell脚本中使用(通常也作为一个简单的单行命令),而且知道它的存在必定有用。但是如果希望awk能够很好地完成事情(根据程序的规则,选择和替换文本文件中的文本),应该考虑任务是否可以通过另一种更强大的脚本语言,更简单、更容易地完成(例如Python或Perl)。

另一方面,awk是一个总可使用的小得多的程序:

user@bible:~>catfoods

boiledcarrots

friedpotatoes

grilledonions

gratedcarrot

user@bible:~>awk/carrot/foods

boiledcarrots

gratedcarrot

在此,awk只选择匹配carrot的行

user@bible:~>awk'{print$1}'foods

boiled

fried

grilled

grated

在此,awk打印了每一行的第一个字段,正如“{print$1}”的定义。使用$2得到第二个字段,而$0表示整行。

user@bible:~>awk-F\:'{print$}'/etc/passwd

root

bin

[...]

GuestUser

也可以定义分隔符为其他字符。以上示例中,选项-F\:定义字段分隔符是冒号,允许从/etc/passwd选择一个特定字段(第5个,它是用户的真实名称),它是一个用冒号分隔的文件。

awk有多个有用的内置函数。例如:

user@bible:~>catmorefoods

biledcarrotsandfriedbacon

friedpotatoesandgrilledsausagesandmushrooms

grilledonions

gratedcarrot

user@bible:~>awk'NF>2'morefoods

boiledcarrotsandfriedbacon

friedpotatoesandgrilledsausagesandmushrooms

NF表示字段的数量。在这个示例中,通过使用'NF>2',选择了超过两个字段的行。

常用的解决问题之处:

试解决将结构化数据导入到应用程序的问题,其中一些行有错误数量的字段,而导入失败,等等。

user@bible:~>awk'NF>2{print$4}'morefoods

fried

grilled

在此,awk打印了每行的第4个字段,它有两个以上的字段。

user@bible:~>awk'{printNF":"$0}'morefoods

5:biledcarrotsandfriedbacon

7:friedpotatoesandgrilledsausagesandmushrooms

2:grilledonions

2:gratedcarrot

在此,awk打印字段的数量,之后是一个冒号和整行(由$0表示)。

awk脚本可以从命令行运行,使用awk-fscriptname.file这样的命令即可。

例如,将以下内容保存为script.awk:

{print$1":"$2":"NF

}

END{printNR}

然后,完成以下事情:

user@bible:~>awk-fscript.awkmorefoods

boiled:carrots:5

fried:potatoes:7

grilled:onions:2

grated:carrot:2

4

文件每一行的前两个字段已经打印,它们之间是一个冒号,之后是另一个冒号和该行中的字段数量(NF)。遍历完文件之后,END字节打印NR(记录数量)的值。

在系统上,GNUawk提供了info文件格式的文档,输入infoawk可查看它。最新版本的GNUawk手册可从http://www.gnu.org/software/gawk/manual/得到。

摘自:《SUSELinux10宝典》人民邮电出版社

相关推荐