awk境界はパターンの始まりです

awk境界はパターンの始まりです


1次のように失敗するtryパターンの開始範囲または境界を設定するためにawkを取得する方法

$ echo -e 'a\nb\nc\nend\ne\nf\ng\n' |awk '1,/end/ {print $0}'
a
b
c
end
e
f
g

パターンが機能するため、これはすべての人に適用されます。

$ echo -e 'a\nb\nc\nend\ne\nf\ng\n' |awk '/b/,/end/ {print $0}'
b
c
end

しかし、再び質問に戻ってパターンが始まる範囲または境界を取得する方法は何ですか?

答え1

2行と4行の間に線を追加するには:

awk 'NR ==2, NR == 4' file

目的がとのregex1間の行を得るregex2ことであれば、NR式を正規表現に置き換えることができます。

awk '/regex1/, /regex2/' file

より詳細な形式は次のとおりです。

awk '$0 ~ /regex1/, $0 ~ /regex2/ { print $0}' file

〜のようにその他の回答提案全行文字列の一致上記の表現はこのコマンドからのものです。この答えは読書に説得力があります。

awk '$0 == "b", $0 == "end" { print $0}' file

awk '/b/, /end/' fileあなたが得たいと思うもののため。

これで、NR式と正規表現を保持する2つの方法を組み合わせることができます。

awk '/b/, NR == 4' file

または

awk 'NR == 2, /end/' file

echo -e 'a\nb\nc\nend\ne\nf\ng\n' |awk '1,/end/ {print $0}'awkこのコマンドでは、ライン1(レコード数が1の場合、つまりNR == 1)で始まる必要があることを知らせる必要があります。

これは:

echo -e 'a\nb\nc\nend\ne\nf\ng\n' |awk 'NR == 1,/end/ {print $0}'

これはうまくいきます。

答え2

それは:

awk 'NR==1, /end/'

ファイルの先頭(最初の行から始まる)からパターンを含む行まで印刷することを意味します。end。気づく{print $0}(または略語print)はここでオプションです。

注文に問題がありますか?

with awk '1,/end/{ print $0 }'、実際には、このコマンドはawk '1 || /end/ {print $0}'2つの部分で構成されています。

  1. 常に入力行の常に真の条件を出力します。
  2. /end/パターンに一致する行だけを印刷する正規表現endこれより優先順位の高い条件がある場合、これは重複します。コマンドは実際にawk 1{ print $0 }上記のようにオプション)に短縮できます。

...すべてのラインが出力されます。


開始点が常に最初の行である場合はこれを作成し、表示されたらすぐに終了することもできます。endファイルの残りの部分を不必要に読み取らないようにパターンを見つけます。

awk '/end/{ print; exit }1'   ##or
awk '{ print } /end/{ exit }' ##or
awk '1; /end/{ exit }'

そして、印刷からパターン自体を除外します。

awk '/end/{ exit } { print }' ##or
awk '/end/{ exit }1'

同じことを行いますが、次のパターンを一致させます。ひも正規表現と完全行文字列の一致を使用する代わりに、次のことができます。

awk 'NR==1, $0=="end"'

バラよりパターンに一致するテキストを見つける方法は?追加のマッチングオプションを確認してください。

関連情報