Para colocar uma quebra de linha antes de cada nova hora:
awk '!a[$1,$2]++ && NR>1{print ""} 1'
Como funciona: No awk, $1
e $2
são os primeiros campos, neste caso, a data e a hora. a[$1,$2]
é uma matriz associativa que conta quantas vezes vimos esses dois campos. Se já vimos essa data e hora antes, !a[$1,$2]
e não estamos na primeira linha, NR>1
, então imprimimos uma linha em branco para separação, print ""
. O% final 1
é apenas uma abreviação para imprimir na linha atual.
Exemplo
Com seus logs de amostra no arquivo logfile
:
$ awk '!a[$1,$2]++ && NR>1{print ""} 1' logfile
2017-12-03 01:35:58 [Notice] syslog: local IP address
2017-12-03 01:35:58 [Notice] syslog: remote IP address
2017-12-03 01:35:58 [Notice] syslog: primary DNS address
2017-12-03 01:35:58 [Notice] syslog: secondary DNS address
2017-12-03 01:35:59 [Warning] kernel: Link State: PVC_8_0 logistic interface up.
2017-12-03 01:35:59 [Informational] dnsmasq[10463]: started, version 2.52 cachesize 150
2017-12-03 01:35:59 [Informational] dnsmasq[10463]: compile time options: no-IPv6 GNU-getopt no-RTC no-DBus no-I18N no-DHCP no-TFTP
2017-12-03 01:35:59 [Warning] dnsmasq[10463]: ignoring nameserver 127.0.0.1 - local interface
2017-12-03 01:35:59 [Informational] dnsmasq[10463]: using nameserver 87.216.1.66#53(via ppp80)
2017-12-03 01:35:59 [Informational] dnsmasq[10463]: using nameserver 87.216.1.65#53(via ppp80)
2017-12-03 01:35:59 [Informational] dnsmasq[10463]: read /etc/hosts - 6 addresses
2017-12-03 01:36:00 [Informational] dnsmasq[10532]: started, version 2.52 cachesize 150
2017-12-03 01:36:00 [Informational] dnsmasq[10532]: compile time options: no-IPv6 GNU-getopt no-RTC no-DBus no-I18N no-DHCP no-TFTP
2017-12-03 01:36:00 [Informational] dnsmasq[10532]: using nameserver 87.216.1.66#53(via ppp80)
2017-12-03 01:36:01 [Warning] kernel: ^M
2017-12-03 01:36:01 [Warning] kernel: Send DNS Query : domain=ntp2.jazztel.com qType=A dnsServer=87.216.1.65
2017-12-03 01:36:01 [Warning] kernel: domain: ntp2.jazztel.com , IP: 87.216.1.241
2017-12-03 01:36:01 [Warning] kernel: sntp server=ntp2.jazztel.com: 0x5 ntpServerIP=87.216.1.241
Removendo timestamps duplicados
$ awk '{if(a[$1,$2]++){gsub(/./," ",$1); gsub(/./," ",$2)} else if (NR>1) print""} 1' logfile
2017-12-03 01:35:58 [Notice] syslog: local IP address
[Notice] syslog: remote IP address
[Notice] syslog: primary DNS address
[Notice] syslog: secondary DNS address
2017-12-03 01:35:59 [Warning] kernel: Link State: PVC_8_0 logistic interface up.
[Informational] dnsmasq[10463]: started, version 2.52 cachesize 150
[Informational] dnsmasq[10463]: compile time options: no-IPv6 GNU-getopt no-RTC no-DBus no-I18N no-DHCP no-TFTP
[Warning] dnsmasq[10463]: ignoring nameserver 127.0.0.1 - local interface
[Informational] dnsmasq[10463]: using nameserver 87.216.1.66#53(via ppp80)
[Informational] dnsmasq[10463]: using nameserver 87.216.1.65#53(via ppp80)
[Informational] dnsmasq[10463]: read /etc/hosts - 6 addresses
2017-12-03 01:36:00 [Informational] dnsmasq[10532]: started, version 2.52 cachesize 150
[Informational] dnsmasq[10532]: compile time options: no-IPv6 GNU-getopt no-RTC no-DBus no-I18N no-DHCP no-TFTP
[Informational] dnsmasq[10532]: using nameserver 87.216.1.66#53(via ppp80)
2017-12-03 01:36:01 [Warning] kernel: ^M
[Warning] kernel: Send DNS Query : domain=ntp2.jazztel.com qType=A dnsServer=87.216.1.65
[Warning] kernel: domain: ntp2.jazztel.com , IP: 87.216.1.241
[Warning] kernel: sntp server=ntp2.jazztel.com: 0x5 ntpServerIP=87.216.1.241
Nesse caso, se tivermos visto a data, $1
e hora, $2
, antes, substituiremos o conteúdo por espaços em branco, gsub(/./," ",$1); gsub(/./," ",$2)
. Se não, e se não estivermos na primeira linha, imprimiremos uma linha em branco para separação.