一連の情報を画面に表示するために出力するスクリプト(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マニュアル は、さらに詳細に説明しています。
必須の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'
GNUおよび* BSD grep:
grep -A1000000000 pattern file
ファイルに100万行を超える行がない限り、それだけです。
少し不格好ですが、動作します。
#!/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
コマンドの出力を表示するためにless
などのポケットベルを使用している場合
less +pattern
awk
は、最初のパターン一致の後(含まない)の行トリガーパターンを含む行が「CUT HERE」に相当する場合は、印刷出力から省略できます。
echoer | awk 'flag ; /pattern/ { flag=1 }'
入力の各行は、awkコードの2つのコンポーネントを通過します。最初のコンポーネントはflag
であり、awkは「変数flag
がゼロ以外の場合に行を出力する」と解釈します。 awk変数はデフォルトで0であるため、最初は何も出力されません。
2番目のコンポーネント、/pattern/ { flag=1 }
、パターンを検出するとすぐにフラグを1に設定し、フラグは残りの実行の間その値を保持します。
パターンが最初に検出されるまでに、その入力行を印刷する機会が過ぎています。後続の行(パターンを含む追加の行を含む)は印刷されます。