- ベストアンサー
複数パターン文字列指定でログファイルの中身を削除
はじめまして。 「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 宜しくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
perlが使えると思いますので、 perl -e 'print if !(/xxx|yyy/);' -n a.log > b.log としてみて下さい。 b.logに 333zzz333 444aaa444 555bbb555 が書き込まれます。
その他の回答 (2)
- sakusaker7
- ベストアンサー率62% (800/1280)
perlをつかっていいのなら > perl -e 'print if !(/xxx|yyy/);' -n a.log > b.log は perl -i.bak -ne 'print if !(/xxx|yyy/)' でいいと思います。 -i オプションで上書きとバックアップファイルの拡張子を指定しています。 このばあいは a.log.bak が書き換え前の状態のファイルになります。
お礼
有り難う御座いました! できました! 本当に助かりました。
- ham_kamo
- ベストアンサー率55% (659/1197)
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 でもいけるかと思います。
お礼
ありがとうございました! お恥ずかしい話ですがgrepにこんな使い方があったのを知りませんでした… -Eも使用できるみたいです。 御教示いただきましたperlとgrepを組み合わせて簡易フィルタシェルを書いてみようと思います。 迅速なご回答、有り難う御座いました。
お礼
ありがとうございました! perlを使うのは盲点でした。 試してみます。 迅速なご回答、有り難う御座いました。