次の一致条件を特定する方法

次の一致条件を特定する方法

セクション間の行を見つけるためにgrepにいくつかのロジックが必要なタスクがあります。

私のファイルには次の内容があります。

1856 /dev/informix/chunkbig10_1039

eppix:'informix'.lsc_ix1 212995
eppix:'informix'.api_valid_token 213201
eppix:'informix'.leads_reasons 213841
eppix:'informix'.epx_vas_sms 214481
eppix:'informix'.lsc_ix1 215121
eppix:'informix'.lsc_ix1 287926
eppix:'informix'.cn_clawback_idx 288750
eppix:'informix'.consent_types_idx 288782
eppix:'informix'.lsc_ix1 288850



1936 /dev/informix/chunkbig10_1119




1937 /dev/informix/chunkbig10_1120




1981 /dev/informix/chunkbig10_1164




1982 /dev/informix/chunkbig10_1165

ファイルから抽出する必要があるのは、Chunkbig10_1039をgrepするとすべての行eppix *を印刷したいのですが、これを達成する方法をどこから始めるべきかさえわかりません。問題は、eppixを見つけるためにgrepを実行できないことです。なぜなら、単純なものは何でも構いませんが、例ではありません。

答え1

$ awk '$1~/^[0-9]+$/{ f=/chunkbig10_1039/; next } f && NF' file
eppix:'informix'.lsc_ix1 212995
eppix:'informix'.api_valid_token 213201
eppix:'informix'.leads_reasons 213841
eppix:'informix'.epx_vas_sms 214481
eppix:'informix'.lsc_ix1 215121
eppix:'informix'.lsc_ix1 287926
eppix:'informix'.cn_clawback_idx 288750
eppix:'informix'.consent_types_idx 288782
eppix:'informix'.lsc_ix1 288850

答え2

あなたは言う

...すべての行を印刷したいです。 eppix*...

さて、αГsнιιが指摘したように、(与えられた入力に対して)次のものを使用できます。

grep 'eppix' infile

実際、与えられた入力について希望の結果を得ることができます

printf "eppix:'informix'.%s\n" 'lsc_ix1 212995' 'api_valid_token 213201' 'leads_reasons 213841' \
                        'epx_vas_sms 214481' 'lsc_ix1 215121' 'lsc_ix1 287926' \
                        'cn_clawback_idx 288750' 'consent_types_idx 288782' 'lsc_ix1 288850'

しかし、あなたも言ったでしょう。

...grepはセクション間の行を探します。

だから私は推測するchunkbig10_1039あなたが意味するのは、検索を次の行と次の行に制限することですchunkbig10_。そして、あなたが言った以来、

...すべての行を印刷したいです。 eppix*...

私はとnexteppix の間に含まれるすべての行を印刷しようとしていて、そこに空でない他の行があるかもしれないという根本的な仮定をします。chunkbig10_1039chunkbig10_

これがあなたが望むものではない場合は、どうぞ編集するあなたの質問はあなたが望むものをより明確に説明します。

1回の呼び出しでこれを行うことができますsed

sed -n '/chunkbig10_1039/,/chunkbig10_/ { /eppix/p }' infile
  • sed n「すべてを印刷するのではなく、私たちが印刷したものだけを印刷してください」という意味です。
  • /eppix/p「次eppixを含むすべての行を印刷する」という意味
  • /chunkbig10_1039/,/chunkbig10_/ { … }「最初の一致と次の一致の間の行でのみコマンドを実行してください{」を意味します。}chunkbig10_1039chunkbig10_

私は私の家とその不足を示すよりシンプルで読みやすい入力ファイルを作成しました。

$ cat infile
eppix ant
chunkbig10_1
bat
eppix cat
dog
eppix elk

chunkbig10_2
eppix fox
gopher
horse
chunkbig10_3
impala
eppix jaguar
kangaroo
eppix llama

$ sed -n '/chunkbig10_1/,/chunkbig10_/ { /eppix/p }' infile
eppix cat
eppix elk

$ sed -n '/chunkbig10_2/,/chunkbig10_/ { /eppix/p }' infile
eppix fox

$ sed -n '/chunkbig10_3/,/chunkbig10_/ { /eppix/p }' infile
eppix jaguar
eppix llama
  • 一致する行だけを探したい場合スタート言い換えればeppix
  • 「セクション」で空でない行をすべて検索するには、そう言います。
  • 行を含めた場合は、chunkbig10_1039 fooそう教えてください。
  • chunkbig10_1039bar (または)を含むchunkbig10_103942行がある場合は表示してください。
  • もし
    chunkbig10_2
    
    セクションが終わるわけではありませんが、そうする必要があります。
    1983 /dev/informix/chunkbig10_2
    
    そう言った。
  • 行に以下が含まれる場合chunkbig10_ そして eppix、彼らと何をしたいのか教えてください。

答え3

sed -n -e '/chunkbig10_1039/,/chunkbig10_*/ p' test|grep -v 'chunkbig'

関連情報