• ベストアンサー

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

はじめまして。 「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 宜しくお願い致します。

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

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

gar2255
質問者

お礼

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

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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 が書き換え前の状態のファイルになります。

gar2255
質問者

お礼

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

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.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 でもいけるかと思います。

gar2255
質問者

お礼

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