つまり、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でやらせている内容は、レコードセパレータを”¥n¥n”にして読み込み、そのレコード中に合致するパターンがあれば、それを出力する、という感じです。
それとも、先にsedで空行区切りまでをまとめておいて、それを検索掛ける、というアイデアでしょうか。
ただ、ちょっといろいろとやってみて、速度的に満足行くところまで自己解決できましたので、これで終了にさせていただきます。
先にgrep -Cで1レコード分をだいたい抜き出しておいてから、perlで空行区切りで読み込んで抽出、という方法です。
---
#!/usr/bin/perl
$grep=”/usr/local/bin/grep”;
$record_max_lines=20;
$/=”¥n¥n”;
$target=shift;
open( GREP, ”$grep -C $record_max_lines $target |”);
while( <GREP> ) {
print if ( /$target/ );
}