システムログファイルを日付でフィルタリングしたいのですが、次のような場合です。
_$ 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
_ファイルのような他のログで同じようにするにはどうすればよいですか?
さらに、フィルタリングすることは可能ですか?
ヒント:可能であれば、「覚えやすいコマンド」を使用します。
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
例を組み合わせることができます!
一般に、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
ソリューションを好みます。)