web-dev-qa-db-ja.com

日付または日付範囲でシステムログファイルをフィルタリングします

私が達成したいこと:

システムログファイルを日付でフィルタリングしたいのですが、次のような場合です。

_$ cat /var/log/syslog | grep -i "error\|warn\|kernel" 
_

最後の3日間は次のように表示されます。

_(...)
Apr  3 06:17:38 computer_name kernel: [517239.805470] IPv6: ADDRCONF(NETDEV_CHANGE): wlp3s0: link becomes ready
(...)
Apr  4 19:34:21 computer_name kernel: [517242.523165] e1000e: enp0s25 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
(...)
Apr  5 09:00:52 computer_name kernel: [517242.523217] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s25: link becomes ready
_

Grepする方法(選択、またはフィルター):

  • 日付で?
  • 日付+時間で?

私が試したこと:

_$ cat /var/log/syslog | grep -i "Apr  5" | grep -i "error\|warn\|kernel" 
_

これは、syslogファイルでは期待どおりに機能しますが、たとえば_kern.log_ファイルでは機能せず、Binary file (standard input) matchesのみを返します。また、この特定のファイルをtailすると、syslogファイルと同じ開始日の形式を確認できます。

質問:

_kern.log_ファイルのような他のログで同じようにするにはどうすればよいですか?

さらに、フィルタリングすることは可能ですか?

  • 日付範囲で?
  • 日付と時間の範囲で?

ヒント:可能であれば、「覚えやすいコマンド」を使用します。

12
s.k

Systemdを使用すると、次のように簡単に細かいフィルタリングが可能なjournalctlを取得できます。

Sudo journalctl --since "2 days ago"   
Sudo journalctl --since "2019-03-10" --until "2019-03-11 03:00"
Sudo journalctl -b # last boot 
Sudo journalctl -k # kernel messages
Sudo journalctl -p er # by priority (emerg|alert|crit|err|warning|info|debug)
Sudo journalctl -u sshd # by unit 
Sudo journalctl _UID=1000 # by user id

例を組み合わせることができます!

14
tomodachi

一般に、kern.logはテキストファイルです。ただし、特にシステムが以前にクラッシュし、システムがファイルを適切に閉じられなかった場合は特に、binaryデータが含まれていることがあります。次に、^@^@^@^@^@^@^@^@^@などのテキストを含む行に気付くでしょう。

入力がbinaryであることにgrepが気付いた場合、通常はそれ以上の処理を停止し、代わりに... binary file ...を出力します。ただし、この動作を変更するスイッチがあります。 manpage から:

[...]
File and Directory Selection
   -a, --text
          Process a binary file as if it were text; 
          this is equivalent to the --binary-files=text option.
[...]

以下を試すことができます:

$ grep -a -i "Apr  5" /var/log/kern.log  | grep -i "error\|warn\|kernel"

(しかし、私は実際には別の答えで与えられたjournalctlソリューションを好みます。)

4
PerlDuck