当 awk 处理输入文件时,它会使用多个变量。有些变量是可编辑的,有些是只读的。
字段分隔符,可以是单个字符或正则表达式,控制着 awk 将输入记录拆分为字段的方式。输入记录会被扫描以查找与分隔符定义匹配的字符序列;字段本身是匹配项之间的文本。
字段分隔符由内置变量表示FS。请注意,这与IFSPOSIX 兼容的 shell 使用的变量不同。
字段分隔符变量的值可以在 awk 程序中使用赋值运算符 = 来更改。通常,执行此操作的合适时机是在执行开始之前,在任何输入被处理之前,以便使用正确的分隔符读取第一个记录。为此,请使用特殊的 BEGIN 模式。
在下面的示例中,我们构建一个命令,该命令显示系统上所有用户及其描述
kelly is in ~> awk 'BEGIN { FS=":" } { print $1 "\t" $5 }' /etc/passwd
--output omitted--
kelly Kelly Smith
franky Franky B.
eddy Eddy White
willy William Black
cathy Catherine the Great
sandy Sandy Li Wong
kelly is in ~>
|
在 awk 脚本中,它看起来像这样
kelly is in ~> cat printnames.awk
BEGIN { FS=":" }
{ print $1 "\t" $5 }
kelly is in ~> awk -f printnames.awk /etc/passwd
--output omitted--
|
仔细选择输入字段分隔符以防止出现问题。一个例子来说明这一点:假设您获得的输入形式如下所示的行
"Sandy L. Wong, 64 Zoo St., Antwerp, 2000X"
您编写一个命令行或脚本,它打印出该记录中人员的姓名
awk 'BEGIN { FS="," } { print $1, $2, $3 }'inputfile
但是一个人可能拥有博士学位,并且可能像这样书写
"Sandy L. Wong, PhD, 64 Zoo St., Antwerp, 2000X"
您的 awk 将为此行提供错误的输出。如果需要,请使用额外的 awk 或 sed 来统一数据输入格式。
默认的输入字段分隔符是一个或多个空格或制表符。
字段通常在输出中用空格分隔。当您使用 print 命令的正确语法时,这会变得很明显,其中参数用逗号分隔
kelly@octarine ~/test> cat test
record1 data1
record2 data2
kelly@octarine ~/test> awk '{ print $1 $2}' test
record1data1
record2data2
kelly@octarine ~/test> awk '{ print $1, $2}' test
record1 data1
record2 data2
kelly@octarine ~/test>
|
如果您不放入逗号,print 会将要输出的项目视为一个参数,从而省略使用默认的输出分隔符,OFS.
任何字符串都可以通过设置此内置变量用作输出字段分隔符。
来自整个 print 语句的输出称为输出记录。每个 print 命令都会产生一个输出记录,然后输出一个名为输出记录分隔符的字符串,ORS。此变量的默认值为 "\n",即换行符。因此,每个 print 语句都会生成一个单独的行。
要更改输出字段和记录的分隔方式,请为OFS和ORS:
kelly@octarine ~/test> awk 'BEGIN { OFS=";" ; ORS="\n-->\n" } \
{ print $1,$2}' test
record1;data1
-->
record2;data2
-->
kelly@octarine ~/test>
|
赋值新值。ORS如果
kelly@octarine ~/test> cat processed.awk
BEGIN { OFS="-" ; ORS="\n--> done\n" }
{ print "Record number " NR ":\t" $1,$2 }
END { print "Number of records processed: " NR }
kelly@octarine ~/test> awk -f processed.awk test
Record number 1: record1-data1
--> done
Record number 2: record2-data2
--> done
Number of records processed: 2
--> done
kelly@octarine ~/test>
|
除了内置变量之外,您还可以定义自己的变量。当 awk 遇到对不存在的变量(未预定义)的引用时,将创建该变量并将其初始化为空字符串。对于所有后续引用,变量的值是最后分配的值。变量可以是字符串或数值。输入字段的内容也可以分配给变量。
kelly@octarine ~> cat revenues
20021009 20021013 consultancy BigComp 2500
20021015 20021020 training EduComp 2000
20021112 20021123 appdev SmartComp 10000
20021204 20021215 training EduComp 5000
kelly@octarine ~> cat total.awk
{ total=total + $5 }
{ print "Send bill for " $5 " dollar to " $4 }
END { print "---------------------------------\nTotal revenue: " total }
kelly@octarine ~> awk -f total.awk test
Send bill for 2500 dollar to BigComp
Send bill for 2000 dollar to EduComp
Send bill for 10000 dollar to SmartComp
Send bill for 5000 dollar to EduComp
---------------------------------
Total revenue: 19500
kelly@octarine ~>
|
可以使用 = 运算符直接赋值,或者您可以将变量的当前值与其他运算符结合使用
kelly@octarine ~/html> cat make-html-from-text.awk
BEGIN { print "<html>\n<head><title>Awk-generated HTML</title></head>\n<body bgcolor=\"#ffffff\">\n<pre>" }
{ print $0 }
END { print "</pre>\n</body>\n</html>" }
|
当我们使用 awk 脚本时,来自 第 5.3.2 节 的示例变得更加容易
kelly@octarine ~/html> awk -f make-html-from-text.awk testfile > file.html |
![]() | 当使用 awk 而不是 sed 时,要执行的命令也更加直接 |
|---|---|
您系统上的 Awk 示例 我们再次参考包含您系统上 initscripts 的目录。输入类似于以下内容的命令,以查看 awk 命令广泛使用的更多实际示例grep awk |