Filtre cualquier archivo de registro del sistema por fecha o rango de fechas

12

Lo que quiero lograr:

Me gustaría filtrar un archivo de registro del sistema por fecha, es decir, cuando lo haga:

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

imprime líneas como estas durante los últimos tres días, digamos:

(...)
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

Cómo grep (seleccionar o filtrar):

  • ¿por fecha?
  • por fecha + hora?

Lo que probé:

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

Funciona como se esperaba en el syslogarchivo, pero no en el kern.logarchivo, por ejemplo, que sólo regresa: Binary file (standard input) matches. Y cuando veo taileste archivo en particular, puedo ver el mismo formato de fecha de inicio que en el syslogarchivo.

Pregunta:

¿Cómo lograr lo mismo en otros registros como el kern.logarchivo?

Además, ¿es posible filtrar:

  • por rango de fechas?
  • por fecha + rango de hora?

Sugerencia: si es posible, con "comandos fáciles de recordar".

sk
fuente

Respuestas:

14

Con systemd obtuvimos journalctl que permite fácilmente un filtrado de grano fino como este:

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

¡Los ejemplos se pueden combinar!

tomodachi
fuente
55
Ok ahora esto es genial!
George Udosen
2
A menudo ni siquiera sudose requiere (en particular si el usuario es miembro del admgrupo, que generalmente es el usuario "principal").
PerlDuck
4

En general, el kern.loges un archivo de texto. Pero a veces sucede que contiene algunos datos binarios , especialmente cuando el sistema se ha bloqueado antes y el sistema no pudo cerrar el archivo correctamente. Luego puede observar líneas que contienen texto como ^@^@^@^@^@^@^@^@^@y tal.

Si se grepda cuenta de que su entrada es binaria , generalmente detiene el procesamiento e imprime en su ... binary file ...lugar. Pero hay un cambio para cambiar este comportamiento. Desde la página del manual :

[...]
File and Directory Selection
   -a, --text
          Process a binary file as if it were text; 
          this is equivalent to the --binary-files=text option.
[...]

Puedes probar lo siguiente:

$ grep -a -i "Apr  5" /var/log/kern.log  | grep -i "error\|warn\|kernel"

(Pero en realidad preferiría la journalctlsolución dada en otra respuesta).

PerlDuck
fuente