Чего я хочу добиться:
Я хотел бы отфильтровать файл системного журнала по дате, т.е. когда я делаю:
$ 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
файл?
Кроме того, возможно ли фильтровать:
- по диапазону дат?
- по дате + часовой диапазон?
Подсказка: если возможно, с «легко запоминающимися командами».
sudo
не требуется (в частности, если пользователь является членомadm
группы, которой обычно является «основной» пользователь).В общем,
kern.log
это текстовый файл. Но иногда случается, что он содержит некоторые двоичные данные, особенно когда система аварийно завершала работу, и система не могла правильно закрыть файл. Затем вы можете заметить строки, содержащие текст, как^@^@^@^@^@^@^@^@^@
и тому подобное.Если
grep
замечает, что его ввод является двоичным , он обычно останавливает дальнейшую обработку и печатает... binary file ...
вместо этого. Но есть переключатель, чтобы изменить это поведение. Из справочной страницы :Вы можете попробовать следующее:
(Но я бы предпочел
journalctl
решение, данное в другом ответе.)источник