grep
(Linux) やfindstr
(DOS) のように、別の指定されたテキスト/パターンが見つかった後にのみ検索を開始する、テキストを検索できるユーティリティはありますか?
ファイル内の特定のテキスト/パターンを検索しようとしているようなものですが、ファイルの特定のセクション内にあるものだけを検索します。私の場合、「ファイル」だけが別のプログラムからの出力であり、出力される行数が多すぎてファイルに書き込んで分析することはできません。
例:
section ONE
text_a
text_b
text_c
section TWO
text_b
text_c
section THREE
. . .
セクション 2 のみに "text_c" があるかどうかを検索します。
のオプションを読み込もうとしましたgrep
が、この機能はないようです。「text_c」はセクション名よりもはるかに長いため、これにより文字列比較の量も最小限に抑えられると予想されます。
答え1
次のテスト ファイルを検討してみましょう。
$ cat file
section ONE
text_a
text_b
text_c <-ignore this
section TWO
text_b
text_c <-keep this
section THREE
text_a
text_b
text_c <-ignore this
text_c
を含む行を選択するにはsection TWO
:
$ awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/' file
text_c <-keep this
入力がファイルからではなく から生成される場合はcommand
、次を使用します。
command | awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/'
使い方
/^section/{f=0}
で始まる行が見つかった場合はいつでも
section
、 を設定しますf=0
。/^section TWO/{f=1}
行が で始まる場合は
section TWO
、前のコマンドを上書きして を設定しますf=1
。f && /text_c/
f
がゼロ以外で、現在の行が と一致する場合text_c
、その行を出力します。
答え2
次のようにしてこれを行うこともできますsed
:
command | sed -n -e '/section TWO/,/section THREE/ { /text_c/p;}'
これは次のように機能します:
-n
sed
デフォルトでは一致する行を印刷しないように指示します-e
sed
作業するためのスクリプト を提供する/section TWO/,/section THREE/
section TWO
アドレス範囲を設定するので、次の関数を一致する行と一致する行の間のすべての行に適用します。section THREE
{ /text_c/p;}
行に一致する関数を定義しtext_c
、見つかった場合はそれp
を出力する
答え3
各セクションに続く行数がある程度一定である場合は、「-A」オプションを使用できます。バツ' grepのオプションで印刷するバツセクション一致に続く行。これを 2 番目の grep にパイプして、「セクション 2」内でパターンを検索できます。
$ cat file
section ONE
1 text_a
1 text_b
1 text_c
section TWO
2_text_a
2 text_b
2 text_c
section THREE
3 text_a
3 text_b
3 text_c
$ grep -A3 'section TWO' file | grep text_c
2 text_c