- ベストアンサー
システム管理について
ある大学でシステム管理をしているのですが、リモートで監視をしているときに、 lastコマンドを使ってログインの情報をみているのですが、情報が多いので当日と 昨日の結果を表示させたいのですが、簡単に設定できようにはできないでしょうか。ご教授お願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.1 の補足です。(あれだけではちょっと不親切なので…) 実際にこちらで動作している Perl スクリプトを載せておきます。 このスクリプトの名前が today だとすると、last | today でお望みの結果が得られます。 ---------- #!/usr/local/bin/perl use Time::Local; @monstr = ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'); @ltime = localtime(time); $p_today = sprintf("%s %2d", $monstr[$ltime[4]], $ltime[3]); @ltime = localtime(time - 86400); $p_yesterday = sprintf("%s %2d", $monstr[$ltime[4]], $ltime[3]); while (<>) { last unless (/$p_today|$p_yesterday/); print; } ----------
その他の回答 (2)
- ysk6406
- ベストアンサー率40% (237/589)
> うまくいきません。どこがおかしいのか、教えていただけないでしょうか。 う~ん、見てて頭が痛くなってきた(失礼!) Perl をご存じなのでしたら、もう一歩頑張って全部 Perl で書かれればよろしいのに… それはともかくとして、 fwscript で月の数値を文字列に変換していますが、switch-case のところの echo は何でしょう? これでは、単に Jan などの文字を表示しているだけで、$mon には代入されませんよね? ここは、「set mon='Jan'」のようにしないと… それから、「grep "$mon $day"」ですが、これでは、日が1日~9日の時に1桁ずれてしまいます。 つまり、「J a n sp sp 1」となるべきところが「Jan sp 1」になってしまいます。 これではマッチしませんね。 取りあえず気づいたのは、こんなところです。 (なお、このスクリプトでは昨日の分が先に表示されますが、私の書いたものだと今日が先になります。これはおわかりですよね?)
お礼
大変参考になりました。 ありがとうございました。
- ysk6406
- ベストアンサー率40% (237/589)
簡単かどうかはわかりませんが… 「last の出力のうち、今日と昨日のものだけを通過させるスクリプトを Perl 等で書いて、last の出力をパイプでそのスクリプトに流す」というのが、多分正攻法なのではないでしょうか? スクリプトの内容(処理手順)は、大体次のようになるはずです。 (1) 今日の日付を取得。 (2) それを元に昨日の日付を計算し、「今日」と「昨日」の文字列パターンを準備。 (毎月1日の場合の処理がやっかいなので、一度 UTC(通算秒数)に直してから 1日(=86400sec)を引き、それから昨日の日付を求めるのが楽だと思います。) (3) 読み込まれた last の出力を順に見ていき、今日か昨日のものであれば print、 それ以外のものが来たところで Stop。 スクリプトの言語は、やはり Perl がお薦めですね。そんなに大げさなプログラムにはならないと思います。
補足
何度も書いていたらすみません。 私も一応書いてみたのですが、プログラミングは初心者なので うまくいきません。どこがおかしいのか、教えていただけないでしょうか。 micworld% more day.pl #!/usr/local/bin/perl @list = localtime(time - (24*60*60)); print "$list[3]\n"; micworld% more mon.pl #!/usr/local/bin/perl @list = localtime(time - (24*60*60)); $list[4]++; print "$list[4]\n"; moicworld% more fwscript #!/bin/csh set mon=`./mon.pl` set day=`./day.pl` switch ($mon) case 1: echo Jan breaksw ;; case 2: echo Feb breaksw ;; . . case 12: echo Dec breaksw ;; endsw set val=`date '+ %b %e '` last | grep "$mon $day" last | grep "$val"