- ベストアンサー
UNIX:ファイルから複数の特定の文字列を含む行以外を削除したい
お世話になります。 現在、仕事で、日に1度更新されるあるログファイルを確認しています。 そのログファイルは、数千行あり、その内容は (A)50種類ほどの記号 (B)開始日時 (C)状態 (D)終了日時 が含まれます。 今は、目視で開始日時、状態、終了日時の3種類の値を確認しているのですが ツールで自動化したいと考えています。 試したことは、grepで3つの状態を確認することです。 grep 開始日時 ログファイル >> 確認.log grep 状態 ログファイル >> 確認.log grep 終了日時 ログファイル >> 確認.log ですが、この方法だと、下記のようになって、それぞれの 対応関係がわかりずらいです。 ■確認.log ・開始日時 ・開始日時 ・開始日時 ・状態 ・状態 ・状態 ・終了日時 ・終了日時 ・終了日時 ですので、こんな感じで確認できればと思います。 ・開始日時 ・状態 ・終了日時 ・開始日時 ・状態 ・終了日時 ・開始日時 ・状態 ・終了日時 UNIXシェル有識者の方で、なにかヒントがあれば アドバイスを頂けますでしょうか。 以上、よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
はじめまして。 以下の方法では如何でしょうか。 これでしたら条件が増えてもgrep文の箇所が長くならないで済みますので、 多少はすっきりすると思います。 見当違いでしたら申し訳ございません。 対象外条件="条件01|条件02|...|条件10\ 条件11|条件12|...|条件20\ 条件21|条件22|...|条件30\ 条件31|条件32|...|条件40\ 条件41|条件42|...|条件50" egrep -v '(${対象外条件})' ログファイル > 確認.log
その他の回答 (3)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
質問の内容にあるgrepの使い方のまま行番号を出力するオプションを付けて、生成された「確認.log」に対して最後にsortで行番号順に並べ替えてはいかがでしょうか。 この方法であれば、最終結果の表示順序はログファイル内の順序と同じになります。
お礼
お世話になります。 なるほど、こういうアイディアもあったのですね。 参考になりました。ありがとうございます。
- shuyamakawa
- ベストアンサー率67% (111/164)
#1です。若干間違えました。 egrep '(開始日時|状態|終了日時)' ログファイル > 確認.log です。
お礼
お世話になります。 egrepは複数の条件を指定できたのですね。 知りませんでした。 ありがとうございます、参考になりました。
- shuyamakawa
- ベストアンサー率67% (111/164)
実際にやろうと思っている事がいまいち理解できていないのですが、 複数の文字列をOR条件で検索するのであれば、 egrep '(開始日時|状態|終了日時)' > 確認.log のようになります。 もっとログファイルの内容を具体的に示せば、 もっと適切な回答ができるかもしれません。
補足
お世話になります。 説明がわかりにくくてすみませんでした。 やりたいことは下記の状態のように 複数の文字列を順番に並べることでした。 1日の開始日時 1日の状態 1日の終了日時 2日の開始日時 2日の状態 2日の終了日時 ですので教えていただいた方法で、解決することができました。 ただ、一つ疑問がでましたので教えてください。 >egrep '(開始日時|状態|終了日時)' > 確認.log ここの条件なのですが、3つくらいでしたら直接記述すれば問題ないのですが、 たくさんの条件をしたい場合は、なにかスマートなやりかたがあるでしょうか? というのは、この条件に、-v をつけて、ログファイルの(A)50種類ほどの記号 以外のものというふうにできないか? と思ったからです。 50個の条件を記述すればよいのでしょうが、よりいい方法があれば知りたいです。
お礼
お世話になります。 教えていただいたアイディアで、望みどおりの結果を得ることが できました。 ありがとうございました。 対象外条件のところをテキストファイルにして読み込むという形式 にして作成しようと思います。