web-dev-qa-db-ja.com

パターンを見つけた後にのみ出力を印刷する

一連の情報を画面に表示するために出力するスクリプト(echoerと呼びましょう)があります。パターンが見つかった後にのみ線が表示されるようにしたいと思います。

次のようなソリューションの使用法を想像します

echoer | solution_command <pattern>

理想的にはpatternは正規表現ですが、難しい値の文字列で十分です。

13
user23146

AWKはこれをパターン範囲で実行できます。これにより、任意の正規表現を使用できます。

echoer | awk '/pattern/,0'

echoerの出力は、patternに一致する最初の行から出力されます。

AWKはパターンベースであり、通常、「このパターンが一致する場合、これを実行する」タイプのアプローチで使用されます。 「このパターン」は、「このパターンが一致したときに、この他のパタ​​ーンが一致するまでこれを開始する」として定義されるパターンの範囲にすることができます。これは、上記のように、コンマで区切られた2つのパターンを記述することによって指定されます。パターンは、/pattern/のようにテキスト一致にすることができます。この場合、現在の行がパターンに対してチェックされ、正規表現として解釈されます。また、一般的な式にすることもでき、すべての行で評価され、結果がゼロ以外または空でない場合に一致すると見なされます。

AWKでは、デフォルトのアクションは現在の行を印刷することです。

これらすべてをまとめると、awk '/pattern/,0'patternに一致する行を探し、1つが見つかると、0条件が一致する(ゼロでない)まで、すべての行にデフォルトのアクションを適用します。 awk '/pattern/,""'も機能します。

Gawkマニュアル は、さらに詳細に説明しています。

21
Stephen Kitt

必須の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'
7

GNUおよび* BSD grep:

grep -A1000000000 pattern file

ファイルに100万行を超える行がない限り、それだけです。

4
mosvy

Bash

少し不格好ですが、動作します。

#!/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
0
wjandrea

コマンドの出力を表示するためにlessなどのポケットベルを使用している場合

less +pattern
0
iruvar

awkは、最初のパターン一致の後(含まない)の行

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

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

入力の各行は、awkコードの2つのコンポーネントを通過します。最初のコンポーネントはflagであり、awkは「変数flagがゼロ以外の場合に行を出力する」と解釈します。 awk変数はデフォルトで0であるため、最初は何も出力されません。

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

パターンが最初に検出されるまでに、その入力行を印刷する機会が過ぎています。後続の行(パターンを含む追加の行を含む)は印刷されます。

0
Gaultheria