以下命令产生相同的答案:
tail -n 1 ~/watchip.sh.csv | awk 'BEGIN { FS = "," } ; { print $1 }'
tail -n 1 ~/watchip.sh.csv | awk '{ FS = "," } ; { print $1 }'
编辑:自从发布这个问题以来,我了解到我的断言上面的两个命令产生相同的答案是不正确的。至少一般不会。因此,上面的命令似乎是何时需要
BEGIN
语句的示例。为混乱道歉。
我不是一个有经验的awk
用户,但试图通过使用和阅读文档来更好地处理它。但是我在 BEGIN 和 END 上读到的所有内容都是模糊的(对我来说毫无意义)。也许这是因为我只awk
在非常有限的情况下使用过。
有人可以简要解释一下何时需要 BEGIN语句吗awk
?
当您确实需要在文件的实际处理之前和之后分别进行某些操作时,通常使用
BEGIN
andEND
子句。因此,使用这种逻辑,其中的语句/动作对于给定的输入文件只执行一次。awk
一般在哪些方面进行
BEGIN
?初始化用于拆分行输入的特殊变量,即输入和输出字段分隔
FS
符OFS
. 尽管人们总是可以使用该-v FS=
构造来定义这些特殊变量,或者通过正则表达式运算符来定义它,但以-F','
这种方式完成时更具可读性。从您必须{ FS="," }
在主体内部定义的示例中,这awk
是非常多余的,因为它为输入文件的每一行初始化变量。例如,如果您的行包含 n 行,则初始化会发生 n 次。awk
为从脚本正文生成的输出定义自定义标题行。例如,从前面的示例中,我想打印一个标题,上面写着,我正在打印第一列值(可选-仅出于可读性考虑)-您还可以初始化将在程序主体内使用的变量。虽然不推荐,但由于
awk
确实动态处理变量初始化,因此有助于BEGIN
理解变量的状态一般在哪些方面进行
END
?跟踪
awk
命令正文中处理的行数。一个通用的习惯用法是跟踪文件中的行数,我们使用特殊awk
变量NR
,它是一个运行计数器,随着每一行的处理而递增。即在第一行,变量值将是 1 并在此后递增。但是鉴于此,我们如何打印文件中的总行数。不能在print NR
文件正文中执行,因为它会在awk
处理文件时打印当前行号。例如,下面的第一个片段将不起作用。因此,在文件处理完成后END
,其中的语句就会出现在其中。因此,以同样的方式进行打印,我们将打印存储在END
NR
与
BEGIN
打印标题信息的子句一样,您可以打印字符串、信息作为摘要,因为此时您的所有文件处理都将完成。本文档有效的 AWK 编程是更好地了解该工具的最佳资源。
“有效的 AWK 编程”对我帮助很大。
awk 适用于规则,规则由一个模式和一个动作组成,您可以省略其中任何一个,但不能同时省略两者。BEGIN 和 END 是一个模式,{...} 是一个动作。如果没有模式或模式匹配,则将执行操作。
在常见的 awk 程序中: