• ベストアンサー

UNIX:ファイルから複数の特定の文字列を含む行以外を削除したい

お世話になります。 現在、仕事で、日に1度更新されるあるログファイルを確認しています。 そのログファイルは、数千行あり、その内容は (A)50種類ほどの記号 (B)開始日時 (C)状態 (D)終了日時 が含まれます。 今は、目視で開始日時、状態、終了日時の3種類の値を確認しているのですが ツールで自動化したいと考えています。 試したことは、grepで3つの状態を確認することです。 grep 開始日時 ログファイル >> 確認.log grep 状態 ログファイル >> 確認.log grep 終了日時 ログファイル >> 確認.log ですが、この方法だと、下記のようになって、それぞれの 対応関係がわかりずらいです。 ■確認.log ・開始日時 ・開始日時 ・開始日時 ・状態 ・状態 ・状態 ・終了日時 ・終了日時 ・終了日時 ですので、こんな感じで確認できればと思います。 ・開始日時 ・状態 ・終了日時 ・開始日時 ・状態 ・終了日時 ・開始日時 ・状態 ・終了日時 UNIXシェル有識者の方で、なにかヒントがあれば アドバイスを頂けますでしょうか。 以上、よろしくお願いします。

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

  • ベストアンサー
  • ken__t
  • ベストアンサー率41% (53/129)
回答No.4

はじめまして。 以下の方法では如何でしょうか。 これでしたら条件が増えてもgrep文の箇所が長くならないで済みますので、 多少はすっきりすると思います。 見当違いでしたら申し訳ございません。 対象外条件="条件01|条件02|...|条件10\ 条件11|条件12|...|条件20\ 条件21|条件22|...|条件30\ 条件31|条件32|...|条件40\ 条件41|条件42|...|条件50" egrep -v '(${対象外条件})' ログファイル > 確認.log

gou2199
質問者

お礼

お世話になります。 教えていただいたアイディアで、望みどおりの結果を得ることが できました。 ありがとうございました。 対象外条件のところをテキストファイルにして読み込むという形式 にして作成しようと思います。

その他の回答 (3)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.3

質問の内容にあるgrepの使い方のまま行番号を出力するオプションを付けて、生成された「確認.log」に対して最後にsortで行番号順に並べ替えてはいかがでしょうか。 この方法であれば、最終結果の表示順序はログファイル内の順序と同じになります。

gou2199
質問者

お礼

お世話になります。 なるほど、こういうアイディアもあったのですね。 参考になりました。ありがとうございます。

回答No.2

#1です。若干間違えました。 egrep '(開始日時|状態|終了日時)' ログファイル > 確認.log です。

gou2199
質問者

お礼

お世話になります。 egrepは複数の条件を指定できたのですね。 知りませんでした。 ありがとうございます、参考になりました。

回答No.1

実際にやろうと思っている事がいまいち理解できていないのですが、 複数の文字列をOR条件で検索するのであれば、 egrep '(開始日時|状態|終了日時)' > 確認.log のようになります。 もっとログファイルの内容を具体的に示せば、 もっと適切な回答ができるかもしれません。

gou2199
質問者

補足

お世話になります。 説明がわかりにくくてすみませんでした。 やりたいことは下記の状態のように 複数の文字列を順番に並べることでした。 1日の開始日時 1日の状態 1日の終了日時 2日の開始日時 2日の状態 2日の終了日時 ですので教えていただいた方法で、解決することができました。 ただ、一つ疑問がでましたので教えてください。 >egrep '(開始日時|状態|終了日時)' > 確認.log ここの条件なのですが、3つくらいでしたら直接記述すれば問題ないのですが、 たくさんの条件をしたい場合は、なにかスマートなやりかたがあるでしょうか? というのは、この条件に、-v をつけて、ログファイルの(A)50種類ほどの記号 以外のものというふうにできないか? と思ったからです。 50個の条件を記述すればよいのでしょうが、よりいい方法があれば知りたいです。

関連するQ&A

  • UNIXで複数のログファイルからエラー文字を探す

    初歩的な質問で申し訳ないのですが、UNIXで複数のログファイルから エラー文字を探して、確認したい次第です。 探したい文字列:E0001 ログファイル:20110823.log 20110824.log 20110825.log等日付名のログファイルがたくさんあります。 grepコマンドを使うといいと思うのですが、ご教授いただけますでしょうか。

  • 【シェル】複数の行の列を1行で表示したい

    お世話になります。 掲題の件で質問します。 現在、Linux上でシェルの開発を行っています。 処理としては、テキストファイルを読み込んで、各行の先頭列 のみ1行で表示させるものなのですが、望みの状態が得られません。 何か良い方法はないでしょうか。 有識者の方がいらっしゃれば、アドバイス願います。 ○試したこと grep を試したのですが、1行で表示されてしまいます。 # テキストデータの形式 1行目 AAA aaa 2行目 BBB bbb 3行目 CCC ccc # 望みの状態 AAABBBCCC 環境 Linux

  • ある単語を含む行と、1つ前の行とを削除するシェル

    UNIX初心者です。 シェル(Korn)で、あるファイル中に、単語 "iwa"を含んだら、その行と、1つ前の行とを削除したいシェルを作りたいのです。  つまり、grep, sed, awk などで、"iwa"を含む行がみつかったら、その行(iwaを含む行)と、なおかつ、1行前の合わせて、2行を削除するシェルを作りたいのですが、行番号(NR?)などを使うのでしょうか? よろしく、お願いします。

  • UNIXで、とあるテキストに対して2文字区切りで改行をいれるには?

    UNIXのシェルスクリプトで、このような動作ができないものかどうか考えています。 あるテキストファイルの内容を、2文字ごとに区切って改行を入れるように加工する 例えば file1.txt が以下のような内容であれば --file1.txt-- 000092 027301 01 0263000001 2文字ずつ区切って改行を挿入したファイル --file2.txt-- 00 00 92 02 73 01 01 02 63 00 00 01 を生成したいと思います。 ここで元のファイルは必ず、半角の数字のみで構成されており、 1行の文字数は最低2文字以上あり、なおかつ奇数個の文字列は存在しないものとします。 awk や grep や sed を組みあわせて考えているのですが、 なかなか解決に至りません。 どなたかお知恵を拝借願います。

  • アプリケーションのログファイルから、特定文字列を抽出し、

    アプリケーションのログファイルから、特定文字列を抽出し、 一致する場合ユーザ名とアクションをまとめたcsvファイルに出力をさせるvbsを作成したいのですが、 いろいろと調べても殆どが結果に結びついていません。 イメージは以下のようなものになります。 インプットファイル(ログファイル)には、以下のように出力されています。 20100601 USER1 update 20100601 USER2 logon 20100601 USER3 delete . . . . このファイルから、たとえばupdateを抽出し、その行にupdateの文字列が含まれていたら、 行内にあるUSER1を抽出させます。 処理が終わったら、以下イメージのCSV出力ファイルを作成します。 DATE,USERNAME,logon,update,delete 20100601,USER1,0,1,0 20100601,USER2,1,0,0 20100601,USER3,0,0,1 集計はエクセルを使用するのでカウントはせず、フラグ(1)を立てるだけをイメージしています。 updateの文字列は実際には記号等が含まれるので、grepのような正規表現にて抽出しないと難しい と思うのですが、vbsでのgrepがちょっとよくわかりません。 http://okwave.jp/qa/q5973058.html 上記アドレスで同じような質問がされていたのですが、 記載内容を実行してもエラー出力されてしまったため、質問させて頂きました。 なにとぞよろしくお願い致します。

  • シェルスクリプト grep

    下記のようなファイルから年月をkeyとして2009/08/05以降のものだけを取得してくる方法がわかりません。 grepでは日時指定をしようにも方法がわからず、awkを使ってもいまいちうまくいきません。 何か方法ありますでしょうか 2009/08/04 08:00:07 開始 2009/08/04 08:00:07 終了 2009/08/05 08:00:07 開始 2009/08/05 08:00:07 終了 2009/08/05 08:00:07 開始 2009/08/05 08:00:07 終了 2009/08/06 08:00:07 開始 2009/08/06 08:00:07 終了

  • シェルで特定の日本語を検索してそのファイル名とパスを表示したい

    シェルで特定の日本語を検索してそのファイル名とパスを表示したいのですが、できませんでした。 半月間考えて一応、次のシェルで行番号とその行を表示することはできたのですが、どのファイルかが分からないのであまり役に立ってません。 # find /var/www/html -name "*.html" -exec nkf -w -Lu {} \; | grep -n "日本語" UNIX系を使っている方なら普段多用しているはずと、検索で調べれば見つけられると思ったのですがだめでした。 よろしくお願いします。

  • scriptコマンドでログファイル viewだと文字化け^M

    Fedora Core4でscriptコマンドで 作業ログとして取得した後にviewコマンドでログを確認すると 改行位置に ^M の文字があり、 catコマンドではプロンプトの位置がずれてしまいます。 下記作業内容になります [unix@local ~]$ script hoge スクリプトを開始しました、ファイルは hoge です [unix@local ~]$ hostname local.com [unix@local ~]$ date 2007年 7月 20日 金曜日 23:48:35 JST [unix@local ~]$ exit スクリプトを終了しました、ファイルは hoge です [unix@local ~]$ cat hoge スクリプトは 2007年07月20日 23時48分27秒 に開始しました[unix@local ~]$ hostname local.com [unix@local ~]$ date 2007年 7月 20日 金曜日 23:48:35 JST [unix@local ~]$ exit スクリプトは 2007年07月20日 23時48分37秒 に終了しました[unix@local ~]$ [unix@local ~]$ view hoge スクリプトは 2007年07月20日 23時48分27秒 に開始しました[unix@local ~]$ hostname^M local.com^M [unix@local ~]$ date^M 2007年 7月 20日 金曜日 23:48:35 JST^M [unix@local ~]$ exit^M スクリプトは 2007年07月20日 23時48分37秒 に終了しました 以上、お手数お掛けいたしますが ご教授よろしくお願い致します。

  • tailとgrepの組み合わせて、結果をファイルに出力について

    おせわになります。シェルの初心者です。 基本的なことかもしれませんが・・ tail -f test.log | grep -e TEST >> tailgrep.log のように、tailとgrepをパイプで連結した結果をファイルに書き出そうとしても、何も書き込んでくれません。 リダイレクトしなければ画面上にはちゃんと表示されますが、若しだめだったら、シェルなどで、解決方法をご存知でしたら、教えていただいて、助かります。

  • teeコマンドを使わずにUNIXで標準出力とエラー出力を、ファイルと標準出力の両方に出すには?

    UNIX系のBシェルで、 コマンドを実行して、 その標準出力とエラー出力をログファイルに出力し、 かつ、同じものを標準出力にも出力したいのです。 また、その後でコマンドの戻り値$?をエラーチェックしたいです。 このため、パイプでteeコマンドを使用すると戻り値が上書きされてしまいます。 いったん一時ファイルに出力するしかないのでしょうか?

専門家に質問してみよう