![行7から13の間に特定の文字列を含む内容を印刷します(awkスクリプト)。](https://linux33.com/image/141340/%E8%A1%8C7%E3%81%8B%E3%82%8913%E3%81%AE%E9%96%93%E3%81%AB%E7%89%B9%E5%AE%9A%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E5%90%AB%E3%82%80%E5%86%85%E5%AE%B9%E3%82%92%E5%8D%B0%E5%88%B7%E3%81%97%E3%81%BE%E3%81%99%EF%BC%88awk%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%EF%BC%89%E3%80%82.png)
特定の文字列を含む7から13行の間の行を印刷するスクリプト(.awk)を作成しようとしています。部分的に動作しますが、7から13の間の行だけでなく、その文字列を含むすべての行を印刷します。
#!/usr/bin/awk -f
BEGIN { (NR>=7) && (NR<=13) }
/word/ {print $0}
ランタイム出力
script.awk filename
次の単語を含むすべての行。
編集する:
ジェフの提案を試した後、私は彼のアドバイスを得ました。 /needle/ このキーワードです。
問題は、他の言語に慣れているので、別の行に{print $ 0}があることです。コードを分離するのが大好き
答え1
実行する「BEGIN」ブロックに行制限ロジックを配置しました。今後 awk
すべてのデータを読んでください。このロジックを基本ループに移動します。
NR >= 7 && NR <= 13 && /word/ { print }
$0
指定されていない場合はデフォルトのprint
引数です...またはより短いです。
NR >= 7 && NR <= 13 && /word/
指定しない場合、それ以降は{print}
デフォルト操作です。スクリプト
の本文は、awk
目的のタスクの前にパターンを追加したい「パターン」「アクション」の形を取ります。ここで、パターンは3つのテストがすべて真でなければならず、仕事は行を印刷することです。別の行に入れることは、print
テストが「通過」したときに「ジョブ」がなく、各行を印刷する「モード」がなく、すべての行が印刷されることを意味します。
答え2
ただのサプリメントジェフの答えそのうちの1つは次のとおりですsed
。
sed -n '7,13 { /expression/ p; }' <file
これにより、正規表現に一致する7行と13行(含む)の間のすべての行が印刷されますexpression
。出力はデフォルトでオフになっているため、-n
コマンドを使用して明示的に印刷された行のみがp
出力されます。
上記のスクリプトをsed
次に直接翻訳してくださいawk
。
awk 'NR == 7, NR == 13 { if (/expression/) print }' <file
この条件は、「7の入力レコードから13の入力レコードまでNR == 7, NR == 13
」として理解する必要があります。ここで、「入力レコード」は、デフォルトでこれまでに読み取ったレコード(行)の数である1行に設定されます。NR
NR
NR
答え3
どうですか?
awk 'NR>6&&NR<14&&/word/' file