Estou analisando alguns logs do packetfilter e queria fazer uma boa tabela de alguma saída, que normalmente funciona bem quando eu uso column -t
. Não posso usar uma tabulação como meu separador de campo de saída (OFS) neste caso porque ele aumenta os campos de string de várias palavras com a exibição de tabela.
Meus dados originais consistem em linhas como esta:
2018:01:24-09:31:21 asl ulogd[24090]: id="2103" severity="info" sys="SecureNet" sub="ips" name="SYN flood detected" action="SYN flood" fwrule="50018" initf="eth0" srcmac="12:34:56:78:90:ab" dstmac="cd:ef:01:23:45:67" srcip="192.168.1.123" dstip="151.101.65.69" proto="6" length="52" tos="0x00" prec="0x00" ttl="128" srcport="59761" dstport="80" tcpflags="SYN"
Estou obtendo os dados em um formato delimitado por vírgula (CSV) usando:
grep -EHr "192\.168\.1\.123" |
cut -d':' -f2- |
awk -F '"' 'BEGIN{
OFS=",";
print "name","action","srcip","srcport","dstip","dstport","protocol","tcpflags"
}
{
print $10,$12,$22,$36,$24,$38,$26,$(NF-1)
}'
Isso funciona bem e produz esse tipo de saída (endereços IP todos alterados, eu realmente não tenho um host interno inundando este site):
name,action,srcip,srcport,dstip,dstport,protocol,tcpflags
SYN flood detected,SYN flood,192.168.1.123,59761,151.101.65.69,80,6,SYN
SYN flood detected,SYN flood,192.168.1.123,59764,151.101.65.69,80,6,SYN
SYN flood detected,SYN flood,192.168.1.123,59769,151.101.65.69,80,6,SYN
SYN flood detected,SYN flood,192.168.1.123,59771,151.101.65.69,80,6,SYN
SYN flood detected,SYN flood,192.168.1.123,59772,151.101.65.69,80,6,SYN
SYN flood detected,SYN flood,192.168.1.123,59890,151.101.65.69,80,6,SYN
SYN flood detected,SYN flood,192.168.1.123,60002,151.101.65.69,80,6,SYN
SYN flood detected,SYN flood,192.168.1.123,60005,151.101.65.69,80,6,SYN
SYN flood detected,SYN flood,192.168.1.123,60006,151.101.65.69,80,6,SYN
Por algum motivo, sempre que uso column
para exibir a saída da tabela ( -t
), ele adiciona uma nova linha após a primeira coluna onde não existe nova linha nos dados originais. Por exemplo:
$ cat mydata.csv | column -s ',' -t
name
action srcip srcport dstip dstport protocol tcpflags
SYN flood detected
SYN flood 192.168.1.123 59761 151.101.65.69 80 6 SYN
SYN flood detected
SYN flood 192.168.1.123 59764 151.101.65.69 80 6 SYN
SYN flood detected
SYN flood 192.168.1.123 59769 151.101.65.69 80 6 SYN
A saída esperada seria a seguinte:
name action srcip srcport dstip dstport protocol tcpflags
SYN flood detected SYN flood 192.168.1.123 59761 151.101.65.69 80 6 SYN
SYN flood detected SYN flood 192.168.1.123 59764 151.101.65.69 80 6 SYN
SYN flood detected SYN flood 192.168.1.123 59769 151.101.65.69 80 6 SYN
Adicionar -x
a column
também não faz diferença, nem especificar o número de colunas com -c
(tenho bastante largura de tela no terminal). Por que está fazendo isso quando não há nova linha nos dados originais?
Eu realmente não acho que seja um caractere em meus dados porque também está acontecendo com a coluna de cabeçalho que criei em meu awk
bloco BEGIN.
Posso reproduzir seu problema se inserir uma linha no arquivo CSV cujo primeiro valor separado por vírgula é uma string muito longa.
Observe que não há nova linha entre as colunas
name
eaction
na saída real, mas uma quebra de linha (devido ao fato de a linha ser tão longa) dando a ilusão de uma nova linha seguida de recuo.Isso significa que você deve procurar em seus dados uma entrada com um
name
valor muito longo.