複数ファイルから特定文字列検索の方法とエラー出力の制限

このQ&Aのポイント
  • 複数ファイルから特定文字列を検索する方法と、エラー出力を制限する方法について説明します。
  • findコマンドとxargsコマンドを使用して、複数のファイルから特定文字列を検索する方法を紹介します。また、エラー出力の制限についても詳しく解説します。
  • 具体的なコマンド例を使用して、特定のキーワードにマッチする行だけを表示する方法を説明します。エラー出力の制限については、headコマンドを使用して直近の出力のみ表示する方法を紹介します。
回答を見る
  • ベストアンサー

複数ファイルから特定文字列検索

エラー出力をさがすのに以下のコマンドが役にたつのですが、 直近の出力のみ探し出せればよいので、それぞれ該当した場合は 5行のみ表示としたいのです。 find /www/logs/* /var/log/messages* |xargs egrep "memory|proc|Resource " やはり地道に1行ずつheadをつけるしか方法はないのでしょうか find /www/logs/*|xargs grep memo|head -5 find /www/logs/*|xargs grep proc|head -5 find /www/logs/*|xargs grep Resource |head -5

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

  • ベストアンサー
回答No.1

こんにちは。「直近の」とは「ファイル内で一番最後に出てくる」という意味でおっしゃっているのでしょうか。ログは普通ログファイル最後に追加されていくと思います。そうしますと、 # for file in /www/logs/*; do grep -5 -H "memory|proc|Resource" $file | tail -11; done でも用が足りそうに思いますが、いかがですか。パス付きファイル名および該当行+前後10行が出力されます。該当行+その後5行なら grep -A5 ... | tail -6 ... というふうに使えます。 また、1日以内に(=24時間内に)変更され、logという拡張子が付いたファイルの中から検索する、というような場合は、 # for file in `find /www/logs -name *.log -mtime -1`; do grep -5 -H "memory|proc|Resource" $file | tail -11; done などとできると思います。コマンドのバージョンにより使えるオプションが異なるかもしれません。

参考URL:
http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html
r-linux
質問者

お礼

xargsで検索したファイル名を先頭につけてる? のかはわかりませんが、それもしっかりと-Hオプションで 補えるのですね!!すんばらしいです!! ありがとうございました!!

関連するQ&A

  • シェルスクリプトでsyslogを別ファイルに追記

    Linuxとシェルスクリプトの超初心者です。 よろしくお願いします! 下記のようなシェルスクリプトを作りたいのですが、アドバイスをよろしくお願いします。 例) (1)/var/log/messagesを/tmp/syslogAllとしてコピーする (2)一日一度のcronで、messagesの新しいログ部分のみをsyslogAllに追記していく。 (1)部分は問題ないのですが、(2)の「messagsの新しいログ部分のみをsyslogAllに追記していく」方法のアドバイスをよろしくお願いします。 一応、自分なり以下の通り考えたのですが、普通じゃなさそうなので・・・(^^; ※syslogAllの最後の行(keyword)を取得し、messagesをgrepした後リダイレクトで追記していく。 grep -A 10000 keyword /var/log/messages | grep -v keyword >> /tmp/syslogAll どうぞ、よろしくお願いいたします!

  • SJISファイルを日本語でgrep

    UNIX環境で、 SJISファイルを日本語でgrepしたのですが、 ファイル名が出力されずにうまくいきません。 どなたかご教授願えないでしょうか。 [自分のコマンド] find ./ -type f -print | xargs nkf -e | grep 'テスト' とし、日本語は検地できたのですが、 ファイル名が出力されずに困っております。 grep -l としたら、↓のエラーが表示されました。 xargs: nkf: シグナル 13 によって終了しました サブディレクトリも含めて検地したいのですが、 なにかいい方法ありますでしょうか。

  • 出力各行の特定文字より左をパイプで渡す

    $ find /tmp -type f | sudo xargs grep -i ok /tmp/01.txt:ok wave /tmp/02.txt:ok wave /tmp/03.txt:ok wave それぞれの出力に対して txt より左をパイプで渡して gedit によりそのファイルを開き、 この例では3つのタブが開かれるようにしたいのですが、 どうすればよいでしょうか? よろしくお願いします。

  • perlのファイルへの書き込みついて

    perl scriptにて処理を/var/log/messages等に、 エラーや実行結果を出力したいと考えています。 messagesログは他のスクリプトも使っているので、 他のプロセスがmessagesログを使っていたらすぐに書き込まずに待機して その処理が終わった後に書き込みを行うようなことをやりたいのですが、 どのようにしたら可能でしょうか。 出来ればCPAN等は使わずperl標準の機能で実装できたらと考えています。 perlのバージョンは5でお願いします。

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

    アプリケーションのログファイルから、特定文字列を抽出し、 一致する場合ユーザ名とアクションをまとめた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 上記アドレスで同じような質問がされていたのですが、 記載内容を実行してもエラー出力されてしまったため、質問させて頂きました。 なにとぞよろしくお願い致します。

  • ログファイルを後ろから検索し、最初のマッチで止める

    CentOS 5 を使っています。 とある巨大なログファイルがあります。 例えば grep hoge log.txt | tail -1 みたいな事をやっているのですが、これをどうにか高速にできないですかね? 上記だと、ログファイルを全検索しているので効率が悪いです。 (ログファイルはファイルの最後の方に新しい情報が記録されているので、その最新ログが見たいのです) 安易に思いつくのは tac コマンドを使って tac log.txt | grep hoge | head -1 でもいいんですが、grep で「最初のマッチで終了」してくれるオプションもなさそうです。 何か良い方法があればご教示願います。 (ruby 等でスクリプトを書いても良いのですが、何とかワンライナーで出来ないかなと) P.S ちなみに実際の見たい情報は「grep でマッチした前後数行」なので -A や -B オプションを使っています。

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

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

  • /var/adm/messagesから当日分のみのログを抽出する方法

    /var/adm/messagesから当日分のみのログを抽出しようとしています。 そこで、下記のように日付をCシェルの中で取得して、 ログをgrepする際の引数にしようとしています。  $ date | cut -c 5-10  Sep  3 (空白2文字) 例えば、  $ set today=`date | cut -c 5-10` とすると、  $ echo $today  Sep 3 (空白1文字) となり、 Sepと3の間の空白が1文字分削られてしまい、 grepの引数としては設定したいものとは異なります。 また、grepの引数に空白を含む文字列を与えると、引数が2つと判断され、 これまた引数としては不適格です。 そこで、date | cut -c 5-10 の結果をアポストロフィーで囲み 'Sep  3' の状態でgrepの引数にしたいと思っていますが、 アポストロフィー付きで変数をうまくセットできません。  $ grep $today /var/adm/messages ($todayの中身は'Sep  3') 上記のようなシェルを実現する方法を教えてください。 または、/var/adm/messagesから当日分のみのログを抽出する方法を 教えてください。 よろしくお願いします。

  • syslogの出力先追加

    syslogの出力先を追加する方法について教えていただきたいです。 使用環境は、Red Hat系のLinuxです。 現状、syslog.confの設定が下記のようになっているため、messagesファイルに syslogが大量に出力され、必要なログを探すのが大変な状態です。 syslog.confの中身 *.info;mail.none;authpriv.none;cron.none /var/log/messages authpriv.* /var/log/secure mail.* /var/log/maillog cron.* /var/log/cron *.emerg * uucp,news.crit /var/log/spooler local7.* /var/log/boot.log そこでfacilityのlocal0-7を使用し、syslogに出力するファイルを分散 させようと考えています。 例えば、local0の出力先を追加するのは、syslog.confを下記のように 修正すればよいでしょうか。 (実際に試せばよいのでしょうが、多くの人達が使用している環境のため、  syslogd再起動が出来ない状態です。) messagesの設定 修正前:*.info;mail.none;authpriv.none;cron.none /var/log/messages 修正後:*.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages local0の設定 追加:local0.* /var/log/ファイル名 ご回答の方、よろしくお願いします。

  • sshで他サーバーにログインしつつコマンドを実行

    いつも大変お世話になっております。 かぎ交換済みの他サーバーにsshでログインしつつ、ログからキーワードを指定してデータを取得したいのです。 下記の記述で、ログの内容を取得できるようにはなりました。 ssh user@host1 "cat /logs/session.log | grep 'keyword' | head" しかしながら、項目数の多いフォーマットなので必要箇所だけを絞りたいため【awk】コマンドを使用したいのですが、無視されるようで希望の形になってくれません。 ssh user@host1 "cat /logs/session.log | grep 'keyword' | awk '{print $1, $2, $5}' | head" 「'」を「\"」にしてみたり、順番を入れ替えたりいろいろ試してはいるのですが手詰まりになりました。 解決方法をご存知の方がいらっしゃいましたらお助けください。 よろしくお願いいたします。