跳转到内容

Awk 入门/Awk 调用和操作

来自维基教科书,开放书籍,开放世界

Awk 的调用方式如下

awk -Fch  -f program-file  variables  input-files

给 Awk 的每个参数都是可选的。

字段分隔符

[编辑 | 编辑源代码]

给 Awk 的第一个选项,-F,让你可以改变字段分隔符。通常,我们数据文件中的每个“单词”或字段都是由空格分隔的。这可以改变成任何一个字符。许多文件是制表符分隔的,所以每个数据字段(比如金属、重量、国家、描述等)都是由制表符分隔的。使用制表符允许在字段中包含空格。其他常见的字段分隔符是冒号或分号。

例如,文件 "/etc/passwd"(在 Unix 或 Linux 系统上)包含所有用户的列表,以及一些数据。每个字段都用冒号分隔。这个示例程序打印每个用户的名称和 ID 号

awk -F:  '{ print $1, $3 }' /etc/passwd

注意冒号用作字段分隔符。这个程序没有它就无法工作。

程序文件

[编辑 | 编辑源代码]

Awk 程序通常具有以下形式

BEGIN { initializations }  search pattern 1 { program actions } search pattern 2 { program actions } ... END { final actions }

同样,如果不需要,每个部分都是可选的。

如果你将 Awk 程序输入到一个单独的文件中,请使用-f选项告诉 Awk 该文件的路径和名称。对于较大、更复杂的程序,你一定想要使用程序文件。这允许你将每个语句放在单独的一行上,并充分利用空格和缩进以提高可读性。对于简短、简单的程序,你可以直接在命令行中键入程序。

如果 Awk 程序是在命令行中编写的,它应该用单引号而不是双引号括起来,以防止 shell 将程序中的字符解释为特殊 shell 字符。请记住,COMMAND.COM shell(用于 Windows 和 DOS)不允许以这种方式使用单引号。当然,如果需要这种解释,可以使用双引号。Awk 程序中那些 shell 不应解释的特殊 shell 字符应该用反斜杠开头。

也可以在命令行中初始化 Awk 变量。这显然只在 Awk 程序存储在一个文件中,或者它是 shell 脚本中的一个元素时才有用。在命令行中编写的脚本中需要的任何初始值都可以作为程序文本的一部分写入。

考虑上一章中计算硬币收藏价值的程序示例。银和金的当前价格嵌入在程序中,这意味着每次两种金属的价格发生变化时都必须修改程序。指定程序调用时的价格会简单得多。

原始程序的主要部分写成

/gold/    { num_gold++; wt_gold += $2 }
/silver/  { num_silver++; wt_silver += $2 } 
END {
    val_gold   = 485 * wt_gold
    val_silver = 16 * wt_silver
    ...

金和银的价格可以用变量来指定,比如pgps

END {
    val_gold   = pg * wt_gold
    val_silver = ps * wt_silver
    ...

程序将使用命令行中的变量初始化调用,如下所示

awk -f summary.awk pg=485 ps=16 coins.txt

这会产生与之前相同的结果。注意,变量初始化被列为pg=485ps=16,而不是pg = 485ps = 16;不建议包含空格,因为它可能会混淆命令行解析。

数据文件(s)

[编辑 | 编辑源代码]

命令行末尾是数据文件。这是 Awk 应该用你的程序处理的文件的名称,就像我们之前示例中的 "coins.txt" 一样。

也可以指定多个数据文件。Awk 将依次扫描它们,并从多个文件的内容生成一个连续的输出,就像它们是一个长文件一样。

  1. 如果你还没有,尝试运行“字段分隔符”中的程序来列出所有用户。看看不使用-F:会发生什么。(如果你没有使用 Unix 或 Linux,抱歉;它不会工作。)
  2. 编写一个 Awk 程序,将“coins.txt”(来自前几章)转换成一个制表符分隔的文件。这将需要“管道”,这取决于你的系统而有所不同,但你可能应该写一些类似 > tabcoins.txt 的东西,将 Awk 的输出发送到一个新文件而不是屏幕。
  3. 现在,用-F'\t'重新运行“summary.awk”。单引号是必需的,这样 Awk 才能将“\t”处理为制表符而不是“\”和“t”这两个字符。字段现在可以包含空格,而不会影响输出。尝试将一些金属改为“纯金”或“98% 纯银”,看看它是否有效。
  4. 尝试使用一些其他命令行选项,例如多个输入文件。
  5. 编写一个程序,作为简单的计算器。它不需要输入文件;让它从键盘接收输入。输入应该是两个数字,中间有一个运算符(如 + 或 -),所有这些都用空格分隔。匹配包含这些模式的行,并输出结果。
如果你需要 #5 的提示,请打开这个框。

你的程序应该包含类似这样的行

$2=="+" { print ($1 + $3) }


在下一章中,你将被介绍 Awk 最显着的功能:模式匹配。

华夏公益教科书