awk最初のパターンマッチの後の行(含まない)

awk最初のパターンマッチの後の行(含まない)

echoer画面に多くの情報を印刷するスクリプト(と呼びます)があります。パターンを見つけた後に線を見ることができるようにしたいと思います。

私は使用するソリューションが次のようになると想像しています。

echoer | solution_command <pattern>

理想的にはpattern正規表現ですが、ハード値文字列で十分です。

答え1

AWKは、正規表現を使用できるパターン範囲を使用してこれを実行できます。

echoer | awk '/pattern/,0'

echoer出力は一致する最初の行から印刷されますpattern

AWKはパターンベースであり、通常、「このパターンが一致した場合は次のようにします」タイプのメソッドで使用されます。 「このパターン」は、「このパターンが一致すると、他のパターンが一致するまでこれを開始します」と定義された一連のパターンです。これは、上記のようにコンマで区切られた2つのパターンを作成することによって指定されます。パターンは、のようにテキストマッチングにすることができます。ここで、/pattern/現在の行は正規表現として解釈され、一般式でもあります。これは各行について評価され、結果が一致しないと見なされます。 0または空ではありません。

AWKでは、基本的な作業は現在の行を印刷することです。

これらすべてをまとめると、awk '/pattern/,0'一致する行を見つけ、pattern見つかったら、条件が0一致するまで(ゼロ以外)、デフォルトの操作がすべての行に適用されます。awk '/pattern/,""'動作します。

これゴークマニュアル詳細については。

答え2

sed@StephenKittのものと強制的に同じですawk

sed '/pattern/,$!d'

pattern次のように解釈されました。基本正規表現grep(代わりに拡張正規表現存在するawk/ egrep/ grep -E)。いくつかのsed実装には-E(BSD、ast、最近のGNU / busybox、まもなくPOSIX)または-r(GNU、ssed、busybox、最近のBSD)オプションがあります。拡張正規表現代わりに、いくつかは-P(ast)または-R(ssed)を使用してPerlなどの正規表現を作成します。

そしてperl

perl -ne 'print if /pattern/ .. undef'

答え3

GNU および *BSD grep の使用:

grep -A1000000000 pattern file

ファイルが1M行を超えない限り、それはすべてです。

答え4

awk最初のパターンマッチの後の行(含まない)

トリガーパターンを含む行が「CUT HERE」と等しい場合は、印刷出力から省略できます。

echoer | awk 'flag ; /pattern/ { flag=1 }'

各入力行は awk コードの 2 つのコンポーネントを通過します。最初のコンポーネントは、flagawkが「flag変数がゼロでない場合はこの行を印刷します」と解釈されます。 awk変数のデフォルト値は0なので、最初は何も印刷されません。

2番目のコンポーネント/pattern/ { flag=1 }はパターンを検出するとすぐにフラグを1に設定し、フラグは残りの実行中にその値を保持します。

パターンが初めて検出されると、その入力行を印刷する機会がありました。その後のすべての行(パターンを含む他の行を含む)が印刷されます。

関連情報