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


13

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

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

echoer | solution_command <pattern>

理想的にpatternは正規表現になりますが、ハードバリュー文字列で十分です。


パターンは複数の文字列にすることができますか?
イニアン

グロブ?正規表現を意味しますか?グローブは、ファイル名の拡張に対してのみ意味を持ちます。
テルドン

@Inian私は質問を理解しているかどうかわかりません。これを選言で動作させたいかどうか尋ねるつもりですか?
user23146

回答:


21

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

echoer | awk '/pattern/,0'

echoer最初の行の一致から始まる出力を印刷しますpattern

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

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

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

gawkのマニュアルは、はるかに詳細に入ります。


3
私は、範囲の終わりとしてゼロを持つ範囲セマンティクスを知りませんでした。ありがとう!
クサラナナンダ

@StephenKittこれは素晴らしい!一致するまで印刷したい場合はどうすればよい0ですか?そうでしょう/pattern/,/0/か?デフォルトのアクションを明示的に記述した場合、答えはどのようになりますか?
-user23146

@ user23146はい、/pattern/,/0/「0」を含む行(レコード)が見つかるまで印刷します。答えに明示的なアクションを持つスニペットを書くと、/pattern/,0 { print $0 }同等になり/pattern/,0 { print }ます。
スティーブンキット

7

sed@StephenKittの必須の同等物awk

sed '/pattern/,$!d'

pattern(/ /の拡張正規表現とは対照的に)のような基本正規表現として解釈されます。一部の実装には(BSD、ast、最近のGNU / busybox、まもなくPOSIX)または(GNU、ssed、busybox、最近のBSD)オプションを拡張正規表現にするオプションがあり、一部には(ast)または(ssed)にするオプションがありますperlのような正規表現。grepawkegrepgrep -Esed-E-r-P-R

perl

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

4

GNUおよび* BSD grepを使用:

grep -A1000000000 pattern file

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


0

lessコマンドからの出力を表示するなどのページャーを使用している場合

less +pattern

0

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

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

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

入力の各行は、awkコードの2つのコンポーネントを実行します。最初のコンポーネントはでflag、awkは「変数がflagは「がゼロ以外の。awk変数はデフォルトで0であるため、これは最初は何も出力しません。

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

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


0

バッシュ

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

#!/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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.