这将产生以下输出:
username: halt uid:7
username: operator uid:11
username: root uid:0
username: shutdown uid:6
username: sync uid:5
username: bin uid:1
....etc.
3、调用外部脚本
将脚本作为命令行自变量传递给awk对于小的单行程序来说很简单。
而对于多行程序,则可以在外部文件中撰写脚本,然后向awk传递-f选项,以向它提供外部脚本文件的调用:
$ awk -f myscript.awk myfile.in
将脚本放入文本文件还可以使用附加awk功能。例如:
BEGIN {
FS=":"
}
{ print $1 }
打印出 /etc/passwd 中每一行的第一个字段
在这个脚本中,字段分隔符在代码自身中指定(通过设置 FS 变量)。
在脚本自身中设置字段分隔符,可以少输入一个命令行自变量。
4、begin和end块
BEGIN 和 END 块
通常,对于每个输入行,awk 都会执行每个脚本代码块一次。然而,可能需要在 awk 开始处理输入文件中的文本之前执行初始化代码。对于这种情况,awk 允许您定义一个 BEGIN 块。我们在前一个示例中使用了 BEGIN 块。因为 awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置。
awk 还提供了另一个特殊块,叫作 END 块。awk 在处理了输入文件中的所有行之后执行这个块。通常,END 块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
5、正则表达式
awk 允许使用正则表达式,根据正则表达式是否匹配当前行来选择执行独立代码块。
输出包含字符序列foo的行:
/foo/ { print }
复杂点的,只打印包含浮点数的行:
/[0-9]+.[0-9]*/ { print }
可以将任意一种布尔表达式放在一个代码块之前,以控制何时执行某特定块。仅当对前面的布尔表达式求值为真时,awk 才执行代码块。以下示例脚本输出将输出其第一个字段等于 fred 的所有行中的第三个字段。如果当前行的第一个字段不等于 fred,awk 将继续处理文件而不对当前行执行 print 语句:
$1 == "fred" { print $3 }
awk 提供了完整的比较运算符集合,包括 "=="、"<"、">"、"<="、">=" 和 "!="。另外,awk 还提供了 "~" 和 "!~" 运算符,它们分别表示“匹配”和“不匹配”。
它们的用法是在运算符左边指定变量,在右边指定正则表达式。如果某一行的第五个字段包含字符序列 root,以下示例只打印这一行中的第三个字段:










