AWK corresponde ao termo. Colunas não se alinham

2

Estou tentando descobrir isso por um tempo agora. Passou por este site e pesquisei como um louco. Seria muito apreciado se alguém pudesse ajudar.

Eu tenho alguns arquivos de log sem cabeçalhos e colunas em todo o lugar. Isso significa que um item como src = 4.2.2.2 pode estar em qualquer lugar do arquivo. Todos os objetos no arquivo têm um formato algo = xxx.

Log de Exemplo:

src=1.1.1.1 sport=12312 dport=80 message=hacked

dport=443 src=2.2.2.2 message=null sport=32432

message=clean dport=21 sport=43434 src=3.3.3.3

Eu usei a função match (), mas estou tentando extrair vários campos.

gawk 'match($0, "src=([^ ]+)") { print substr($0, RSTART, RLENGTH) } ' file

me dá o seguinte:

src=1.1.1.1

src=2.2.2.2

src=3.3.3.3

Eu gostaria de ter vários campos, como src, dport e message, para que as linhas de saída se pareçam com as seguintes:

src=1.1.1.1 dport=80 message=hacked

src=2.2.2.2 dport=443 message=null

src=3.3.3.3 dport=21 message=clean

Isso é possível com o gawk ou outra coisa?

Obrigado!

    
por mrusenet 03.01.2018 / 16:21

2 respostas

1
Solução

Awk (independente das posições dos itens):

awk 'function get_item(name){ 
         match($0, name"=[^[:space:]]+"); 
         return substr($0, RSTART, RLENGTH) 
     }
     { print get_item("src"), get_item("dport"), get_item("message") }' file

Com a abordagem acima, você é capaz de produzir os itens essenciais necessários em qualquer ordem.

A saída:

src=1.1.1.1 dport=80 message=hacked
src=2.2.2.2 dport=443 message=null
src=3.3.3.3 dport=21 message=clean
    
por 03.01.2018 / 16:52
2

Com o GNU awk (NOTA: isso depende da ordem de classificação lexical das strings "key"):

gawk '{split($0,a); asort(a); printf("%s\t%s\t%s\n", a[4], a[1], a[2])}' file
src=1.1.1.1     dport=80        message=hacked
src=2.2.2.2     dport=443       message=null
src=3.3.3.3     dport=21        message=clean
    
por 03.01.2018 / 16:48

Tags