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

12

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

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

$ 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файл?

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

  • по диапазону дат?
  • по дате + часовой диапазон?

Подсказка: если возможно, с «легко запоминающимися командами».

ск
источник

Ответы:

14

С помощью 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

Примеры можно объединять!

Tomodachi
источник
5
Хорошо, теперь это так круто!
Джордж Удосен
2
Часто даже sudoне требуется (в частности, если пользователь является членом admгруппы, которой обычно является «основной» пользователь).
PerlDuck
4

В общем, 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решение, данное в другом ответе.)

PerlDuck
источник