- ベストアンサー
grepコマンドを使ったシェルについて
いつもお世話になっております。 今回は、以下の仕様なシェルを作りたいのですが、お力をお貸しください。 ファイルからある文字列(xxx)を含んだ1文を抽出します。しかしこの1文の1段上に時間が表示されているのですが、この時間も一緒に持って期待と思っています。該当文字列は膨大にあるので時間帯で分けたいと思います。 例: ファイル名:TEST.txt yyyy/mm/dd 00:00:00 ←時間帯も抽出したい AAAAAAA BBBBBBBBBBBBB CCCCC xxx DDDD ←この一文を他のファイルにコピーします。 grep xxx TEST.txt > TEST.log 上記の該当文字列の1段上の時間帯も引っ張りたいのですがどの様にすればよいでしょうか? 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> gの意味は何でしょうか? g は global の意味で、次の /xxx/ と組み合わせて、「すべての xxx を含む行に対して」という意味になります。 . は現在の行番号を表します。前に /xxx/ があるので、/xxx/ を含む行が . になります。".-1,." で「xxx を含む行の一行前から xxx を含む行まで」p で「出力する」ということになります。 > /.-1,.pは該当文字列から-1行を見に行くということで > 該当文字列から+3行-3行と見に行こうとする場合は、 > どの様に記述すればよいのでしょうか? その場合は、".-1,." の代わりに".-3,.+3" と書きます。「.+3 から .-3 まで逆順に」ということでしたら、それはちょっと難しいと思います。 なお、その後分かったのですが、ed には -s オプションをつけた方が良いようです。
その他の回答 (3)
- oldroot2005
- ベストアンサー率66% (68/103)
grep でなく ed でできます。 echo g/xxx/.-1,.p | ed TEST.txt > TEST.log をお試しください。
お礼
ありがとう御座います。 もし宜しければ、echo g/xxx/.-1,.p | ed TEST.txt > TEST.log の解説をいただきたいのですが。 gの意味は何でしょうか? /.-1,.pは該当文字列から-1行を見に行くということで 該当文字列から+3行-3行と見に行こうとする場合は、 どの様に記述すればよいのでしょうか? 大変参考になりました。
- windfactA
- ベストアンサー率63% (52/82)
表題からはずれませんが、ちょっと変化球の回答です。 GNUバージョンのgrepを導入すれば、 # grep -B 1 xxx TEST.txt > TEST.log で1行前のものも引っ張ってこられます。 Solarisに元々入っているgrepでは出来ません。 GNUバージョンのgrepは、SunFreeware.comなどからバイナリパッケージの形で入手できます。
- 参考URL:
- http://www.sunfreeware.com
お礼
ありがとう御座いました。 今後の参考にさせて頂きます。
- hira6bg
- ベストアンサー率61% (8/13)
表題とはずれますが、Perlならこんな感じです。 #!/usr/bin/perl # 対象ディレクトリ指定 my $dirPath = "/tmp"; # 対象ファイル指定(正規表現で定義) my $search = $dirPath ."/TEST*"; # 出力ファイル指定 my $outFile = "/tmp/out.txt"; # ディレクトリ内照査 my @files = glob("$search"); # 出力ファイルオープン open(OUT, ">$outFile"); # 照査結果のファイルについて書き出し foreach my $file (@files){ open(IN, "$file") || die "FILE OPEN ERROR!!"; my $cnt = 1; my $line = ""; while(<IN>){ if($cnt){ $line = $_; $cnt = 0;} if(/xxx/){ print OUT "$line"; print OUT "$_"; last; } } close(IN); } #出力ファイルクローズ close(OUT); grepを使った処理ではないので、的がずれておりましたら無視してください。
お礼
ありがとう御座います。 Perlを使うときに参考にさせてもらいます。
お礼
返答ありがとう御座います。 大変参考になりました。