我想要达到的目标:
我想按日期过滤系统日志文件,即当我这样做时:
$ cat /var/log/syslog | grep -i "error\|warn\|kernel"
它在最后三天打印这样的行让我们说:
(...)
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,它允许像这样进行过滤:
可以结合例子!
通常,它
kern.log
是一个文本文件。但有时会发生它包含一些二进制数据,特别是当系统之前崩溃并且系统无法正确关闭文件时。然后,您可能会注意到包含诸如此类的文本的行^@^@^@^@^@^@^@^@^@
。如果
grep
注意到它的输入是binary... binary file ...
,它通常会停止进一步的处理并改为打印。但是有一个开关可以改变这种行为。从手册页:您可以尝试以下方法:
(但我实际上更喜欢
journalctl
另一个答案中给出的解决方案。)