ファイル/入力内の文字列パターンを検索、コンテキスト依存検索 (grep とは異なります)

ファイル/入力内の文字列パターンを検索、コンテキスト依存検索 (grep とは異なります)

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;}'

これは次のように機能します:

  • -nsedデフォルトでは一致する行を印刷しないように指示します
  • -esed作業するためのスクリプト を提供する
    • /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

関連情報