echoer
たくさんの情報を画面に表示するスクリプト(呼び出しましょう)があります。パターンが見つかった後にのみ行を表示できるようにしたいと思います。
私は次のようなソリューションの使用を想像します
echoer | solution_command <pattern>
理想的にpattern
は正規表現になりますが、ハードバリュー文字列で十分です。
echoer
たくさんの情報を画面に表示するスクリプト(呼び出しましょう)があります。パターンが見つかった後にのみ行を表示できるようにしたいと思います。
私は次のようなソリューションの使用を想像します
echoer | solution_command <pattern>
理想的にpattern
は正規表現になりますが、ハードバリュー文字列で十分です。
回答:
AWKはパターン範囲を使用してこれを行うことができます。これにより、任意の正規表現を使用できます。
echoer | awk '/pattern/,0'
echoer
最初の行の一致から始まる出力を印刷しますpattern
。
AWKはパターンベースであり、通常、「このパターンが一致する場合、これを行う」タイプのアプローチで使用されます。「このパターン」は、「このパターンが一致したとき、この他のパターンが一致するまで、このパターンを開始する」と定義された一連のパターンにすることができます。これは、上記のように、コンマで区切られた2つのパターンを記述することで指定されます。パターンは、のようにテキスト一致にすることができます/pattern/
。ここでは、現在の行がパターンに対してチェックされ、正規表現として解釈されます。また、一般的な式であり、すべての行で評価され、結果がゼロ以外または空でない場合に一致すると見なされます。
AWKでは、デフォルトのアクションは現在の行を印刷することです。
これをすべてまとめると、awk '/pattern/,0'
一致する行をpattern
探し、1つが見つかると、0
条件が一致する(ゼロ以外になる)まですべての行にデフォルトのアクションを適用します。awk '/pattern/,""'
うまくいくでしょう。
gawkのマニュアルは、はるかに詳細に入ります。
0
ですか?そうでしょう/pattern/,/0/
か?デフォルトのアクションを明示的に記述した場合、答えはどのようになりますか?
/pattern/,/0/
「0」を含む行(レコード)が見つかるまで印刷します。答えに明示的なアクションを持つスニペットを書くと、/pattern/,0 { print $0 }
同等になり/pattern/,0 { print }
ます。
sed
@StephenKittの必須の同等物awk
:
sed '/pattern/,$!d'
pattern
(/ /の拡張正規表現とは対照的に)のような基本正規表現として解釈されます。一部の実装には(BSD、ast、最近のGNU / busybox、まもなくPOSIX)または(GNU、ssed、busybox、最近のBSD)オプションを拡張正規表現にするオプションがあり、一部には(ast)または(ssed)にするオプションがありますperlのような正規表現。grep
awk
egrep
grep -E
sed
-E
-r
-P
-R
でperl
:
perl -ne 'print if /pattern/ .. undef'
awk
最初のパターンマッチの後(ただし含まない)の行トリガーパターンを含む行が「CUT HERE」に相当する場合、印刷出力からそれを省略できます。
echoer | awk 'flag ; /pattern/ { flag=1 }'
入力の各行は、awkコードの2つのコンポーネントを実行します。最初のコンポーネントはでflag
、awkは「変数がflag
は「がゼロ以外の。awk変数はデフォルトで0であるため、これは最初は何も出力しません。
2番目のコンポーネント、/pattern/ { flag=1 }
はパターンを検出するとすぐにフラグを1に設定し、フラグは残りの実行の間その値を保持します。
パターンが最初に検出されるまでに、その入力行を印刷する機会は過ぎました。後続の行(パターンを含む追加の行を含む)はすべて印刷されます。
少し不格好ですが、動作します。
#!/bin/bash
found=false
while IFS= read -r; do
if $found || [[ $REPLY =~ pattern ]]; then
found=true
printf '%s\n' "$REPLY"
fi
done
このバージョンはに依存していますがcat
、理解しやすいです。
#!/bin/bash
while IFS= read -r; do
if [[ $REPLY =~ pattern ]]; then
printf '%s\n' "$REPLY"
break
fi
done
cat