次のコマンドを使用してフィルタ基準に基づいてデータを抽出しようとしましたが、awk
機能しません。この問題を修正できますか?
awk -v RS='' -v ORS='\n\n' '/func: peak*down*HIL/' filename
入力する:
func: peak_rec_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_some_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_rec_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_joy_HIL
sub: xyz
value: adc
log:path
close:date
予想出力:
func: peak_some_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_HIL
sub: xyz
value: adc
log:path
close:date
func: peak_another_one_down_head_joy_HIL
sub: xyz
value: adc
log:path
close:date
答え1
問題は正規表現にあります。部分文字列間の任意の文字数と一致するように*
それぞれを置き換える必要があります。.*
awk -v RS='' -v ORS='\n\n' '/func: peak.*down.*HIL/' file
それぞれは、*
式の前の部分の動作を修正して0回以上一致するようにします。この式は、などのいずれかpeak*down
に一致しますpeadown
。peakdown
peakkdown
peakkkdown
ファイル形式が使用するものと同じなのでGNUスラッシュ、私は個人的にデータを照会(または一般的に使用)するrecsel
代わりに、以下を使用します。awk
recsel -e 'func ~ "peak.*down.*HIL"' file
汎用テキスト処理ツールよりもデータ型を理解するツールを使用する方が良い場合が多い(より簡単で、より強力でメンテナンスが簡単です)。