Отфильтруйте любой системный файл журнала по дате или диапазон дат

Чего я хочу достигнуть:

Я хотел бы отфильтровать системный файл журнала по дате, т.е. когда я делаю:

$ 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 (выбор или фильтр):

  • по дате?
  • date+hour?

Что я попробовал:

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

Это работает как ожидалось над syslog файл, но не на kern.log файл, например, который только возвращается: Binary file (standard input) matches. И когда я tail этот конкретный файл I видит тот же формат срока начала работы, чем в syslog файл.

Вопрос:

Как достигнуть того же на других журналах как kern.log файл?

Кроме того, это возможный отфильтровать:

  • диапазоном дат?
  • диапазоном date+hour?

Подсказка: если это возможно, с "легкими, чтобы помнить командами".

11
задан 6 April 2019 в 08:29

2 ответа

С 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
ответ дан 23 November 2019 в 03:58

В целом, kern.log текстовый файл. Но иногда это происходит, что это содержит некоторые двоичные данные, особенно когда система отказала, прежде и система не мог закрыть файл правильно. Можно затем заметить строки, содержащие текст как ^@^@^@^@^@^@^@^@^@ и такой.

Если grep замечает, что его вход является двоичным, он обычно останавливает последующую обработку и печать ... binary file ... вместо этого. Но существует переключатель для изменения этого поведения. Из страницы справочника:

[...]
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
ответ дан 23 November 2019 в 03:58

Другие вопросы по тегам:

Похожие вопросы: