つまり、perlやawkで言うところのレコードセパレータを”¥n¥n”にして、検索結果を表示させたいということです。
現在はperlでこの処理をさせているが、遅いため、grepを直に使うことで高速化出来ないかと考えています。
grep -C オプションで、1レコード分以上の出力を抜き出しておいて、後から余計な部分を落とすとか考えましたが、簡潔な方法があれば教えてください。
http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html
Manpage of GREP
> 現在はperlでこの処理をさせているが、遅いため、
「遅いため」ですか。。。。
下記:
grep ***** input.txt | sed ”s/$/¥n/” > output.txt
でも、駄目でしょうか? これは、
grep ***** input.txt | perl -pe ”s/$/¥n/” > output.txt
と、等価なためナンセンスな回答である可能性はあると思いながらも、perl自体のプロセスの起動に時間がかかるなどして遅いのであれば、上記のsedへの置き換えで改善しますし。。。
空行を区切りとして、表示をしたいのではなくて、検索をしたいのですね。
駄目回答を入れてしまい、大変お恥ずかしい次第です。
赤面しながら、ちょっとスクリプトを書いてみました。
下記あたりじゃないでしょうか?
perlを良く知らないので、駄目な部分があったらすみません。
------------------------------------------------------
#!/usr/bin/perl
$target=shift;
$buf = ””;
while( <STDIN> ) {
$line = $_;
$buf .= $line;
if( $line =~ /^$/ ) {
if( $buf =~ m/$target/ ) {
print ”$buf”;
}
$buf = ””;
}
}
if( $buf =~ m/$target/ ) {
print ”$buf”;
}
------------------------------------------------------
>駄目回答を入れてしまい、大変お恥ずかしい次第です。
いえいえ、お答えいただき、ありがとうございました。
実はperlだと、すごく簡単に書けます。
---
#!/usr/bin/perl
$/=”¥n¥n”;
$target=shift;
while( <> ) {
print if ( /$target/ );
}
--
空行を区切り子として指定し、マッチするレコードがあったらそのまま表示、という内容になります。
ただこれだと、サーバのログファイルなど、すごく大きなファイルについては検索にすごく時間がかかります。
grepとは雲泥の差です。
で、なにかうまいコマンドやgrepの使い方がないかな?と思ったのでした。
ただ、前に自分の書いたコードでも、レコードの長さによっては2重に表示されたりする恐れがあるため、結局grepを修正して使おうと思っています。