この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

このコマンドがファイルの2行でパターンマッチングを実行する方法はわかりません。国境を越える作業の例が見つかりません。のカンマに関連しているようですが、/<Directory /\>,/AllowOverride正確に何が起こっているのか理解したいと思います。このパターンマッチングはファイルの2行でどのように実行されますか?

また、なぜ必要ですか{print}?デフォルトでは結果が印刷されませんかawk

答え1

  • /<Directory \/>/,/AllowOverride None/(この行の間に)
  • sub( ... )None交換しますAll
  • {print}すべての行には(交換するかどうか)が必要です。

with行はAllowOverride Noneasubと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つのフィールドを持つ行を印刷しますが、あなたの場合、サブ機能はデフォルトをオーバーライドするため、他のアクションは実行されません。これが明示的な印刷が必要な理由です(明示的な印刷を削除しても何も出力されません)。

関連情報