シェルスクリプトのみを使用してテキストファイルを検索し、いくつかのテキストを含む完全な行ブロックをすべて一覧表示できます(簡単なgrepベース)。
"-----------------"
テキストファイルには"\n\n\n--------------------"
(正確に言うと、各ブロックは約50文字の「-」で始まります)で区切られた行ブロックがあります。
サンプルは次のとおりです。
-------------------------------
Abracadabra, blablablalbalba
blablablabla, banana
-------------------------------
Text, sample text, sample text, sample text
Text, sample text, sample text, sample text
Text, sample text, sample text, sample text
Text, sample text, sample text, sample text
-------------------------------
Text, sample text, sample text, sample text
banana. Sample text, sample text, sample text, sample text
Text, sample text, sample text, sample text
検索基準として「バナナ」という言葉を考えてみましょう。したがって、リストされたブロックは次のようになります。
-------------------------------
Abracadabra, blablablalbalba
blablablabla, banana
-------------------------------
Text, sample text, sample text, sample text
banana. Sample text, sample text, sample text, sample text
Text, sample text, sample text, sample text
編集する:
たとえば、awk 'BEGIN{RS="\n------------"}/INFO/{print}'
INFOは検索する項目です。ブロック全体を得ることはできません。実際のサンプルと結果は次のとおりです。
実際のサンプル(最初の3つの新しい行を含む):
------------------------------------- 別のディレクトリ:adis、IWZLM(/home/interx/adis/src/IWZLM.SRC) Gerando rotina em linguagem C: (yla5 adis IWZLM -if) .INFO => Rotina BLOQUEADA(状態 "M"): Geracao ignorada(-is para ignorar checagem do status を使用) [ OK-I ] IWZLM(adis) - 一般ユーザーのリスト: Geracao ignorada do codigo em C. ------------------------------------- ディレクトリ内の別のディレクトリ:adis、ADISA(/home/interx/adis/src/ADISA.SRC) Gerando rotina em linguagem C: (yla5 adis ADISA -if) .ERRO:パルハ・イネスペラダ コンパイラ: (ycomp adis ADISA -exe adis/exe/ADISA.temp.exe) adis/exe/ADISA.temp.exe => adis/exe/ADISA [確認] ADISA(adis) - メニュー A: Gerada e compilada com sucesso. ------------------------------------- ディレクトリはadis、ADISD1(/home/interx/adis/src/ADISD1.SRC)です。 Gerando rotina em linguagem C: (yla5 adis ADISD1 -if) .ATENCAO: ローカライズの定義 コンパイラ: (ycomp adis ADISD1 -exe adis/exe/ADISD1.temp.exe ) adis/exe/ADISD1.temp.exe => adis/exe/ADISD1 [確認] ADISD1(adis) - メニュー: Gerada e compilada com sucesso.
ブロック全体を取得できず、ORSが設定されているかどうかにかかわらず、通常のgrepなどの「INFO」を含む行のみを取得できます。
$ cat file | awk 'BEGIN{RS="\n------------"}/INFO/{print}'
.INFO =>Rotina BLOQUEADA (status 'M'): Geracao ignorada (use -is para ignorar checagem do status)
メモ: AIX 7.1では、gawkではなくawkです。
ベストアンサー1
awk '
{
if (/-------------------------------------------------/) {
if (hold ~ /INFO/) {
print hold;
}
hold="";
} else {
hold=hold "\n" $0
}
}
END {
if (hold ~ /INFO/) {
print hold;
}
}' file
これは、「hold」変数(ala sed)を使用して区切られたブロック間に行を蓄積します。新しいブロック(またはEOF)が見つかると、保存された値は/ INFO /パターンと一致する場合にのみ印刷されます。
(以前のコメントに対する回答、この回答をクリーンアップするために、以前の不適切なawkとperlの回答を削除しました)