こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

複数パターン文字列指定でログファイルの中身を削除

はじめまして。
「a.log の xxx と yyy のある行を削除」
というようなshellScriptを書いています。

a.logは以下のようになっています。
a.log
111xxx111
222yyy222
333zzz333
222yyy222
444aaa444
555bbb555
111xxx111

xxx、yyyの複数パターンで行の削除はできないでしょうか。
sedで中間ファイル(ワークファイル)を2回作成すればできるのですが…
なるべく中間ファイルは作成したくありません。

最終的にはa.logを下記のようにしたいです。
a.log
333zzz333
444aaa444
555bbb555

宜しくお願い致します。

投稿日時 - 2007-03-09 20:10:43

QNo.2817991

すぐに回答ほしいです

質問者が選んだベストアンサー

perlが使えると思いますので、
perl -e 'print if !(/xxx|yyy/);' -n a.log > b.log
としてみて下さい。
b.logに
333zzz333
444aaa444
555bbb555
が書き込まれます。

投稿日時 - 2007-03-10 08:53:08

お礼

ありがとうございました!
perlを使うのは盲点でした。
試してみます。
迅速なご回答、有り難う御座いました。

投稿日時 - 2007-03-10 10:18:45

ANo.2

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

perlをつかっていいのなら
> perl -e 'print if !(/xxx|yyy/);' -n a.log > b.log

perl -i.bak -ne 'print if !(/xxx|yyy/)'

でいいと思います。
-i オプションで上書きとバックアップファイルの拡張子を指定しています。
このばあいは a.log.bak が書き換え前の状態のファイルになります。

投稿日時 - 2007-03-10 17:13:48

お礼

有り難う御座いました!
できました!
本当に助かりました。

投稿日時 - 2007-03-12 18:37:29

ANo.1

a.logを読み込みながらa.logに書き込むのは無理なので、中間ファイルを1つも使わない、ということは難しいでしょう。

grep -v xxx a.log | grep -v yyy > b.log
mv b.log a.log

という感じでいかがでしょうか。

Solarisの grep で使えるかどうかわかりませんが、-Eが使えるなら、

grep -v -E 'xxx|yyy' > b.log
mv b.log a.log

でもいけるかと思います。

投稿日時 - 2007-03-09 22:57:16

お礼

ありがとうございました!
お恥ずかしい話ですがgrepにこんな使い方があったのを知りませんでした…
-Eも使用できるみたいです。
御教示いただきましたperlとgrepを組み合わせて簡易フィルタシェルを書いてみようと思います。
迅速なご回答、有り難う御座いました。

投稿日時 - 2007-03-10 10:25:54