这个 awk 命令如何跨多行工作?

这个 awk 命令如何跨多行工作?

我对以下命令的一部分感到困惑。

awk '/<Directory \/>/,/AllowOverride None/{sub("None", "All", $0)}{print}' /etc/apache2/apache2.conf > myfile.txt

该命令替换

<Directory />
    AllowOverride None
</Directory>

<Directory />
    AllowOverride All
</Directory>

在 Apache 配置中,并将更新的配置写入myfile.txt.

我不明白该命令如何跨文件的两行进行模式匹配。我无法找到跨界工作的示例。我猜这与 中的逗号有关/<Directory /\>,/AllowOverride,但我想确切地了解发生了什么。这个模式匹配是如何在文件的两行中完成的?

另外,为什么是{print}必要的?默认情况下不awk打印结果吗?

答案1

  • /<Directory \/>/,/AllowOverride None/(这些线之间)内
  • sub( ... )None替代All
  • {print}所有行都需要a (替换或未替换)

请注意, with 行将AllowOverride None得到 asub和 a print,所有其他行将仅打印。

样本文件:

<Directory />
   ## we don't want None
    AllowOverride None
   ## all or None-thing
</Directory>

会变成

<Directory />
   ## we don't want All
    AllowOverride All
   ## all or None-thing
</Directory>

关于默认,考虑

... | awk 'NF==7' 

默认情况下,它将打印包含 7 个字段的行,但是,在您的情况下,子函数会覆盖默认值,因此不会采取其他操作。这就是为什么您需要显式打印(如果删除显式打印,则不会输出任何内容)。

相关内容