セクション間の行を見つけるために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_1039
chunkbig10_
これがあなたが望むものではない場合は、どうぞ編集するあなたの質問はあなたが望むものをより明確に説明します。
1回の呼び出しでこれを行うことができますsed
。
sed -n '/chunkbig10_1039/,/chunkbig10_/ { /eppix/p }' infile
sed n
「すべてを印刷するのではなく、私たちが印刷したものだけを印刷してください」という意味です。/eppix/p
「次eppix
を含むすべての行を印刷する」という意味/chunkbig10_1039/,/chunkbig10_/ { … }
「最初の一致と次の一致の間の行でのみコマンドを実行してください{
」を意味します。}
chunkbig10_1039
chunkbig10_
私は私の家とその不足を示すよりシンプルで読みやすい入力ファイルを作成しました。
$ 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'