awk filtrando captura ao vivo com arquivo como lista de padrões

4

O que estou tentando fazer é bem simples. Estou gerando a saída de tshark e redirecionando-a para awk com um canal | . Como tshark obtém dados ativos, eu quero que awk pesquise em cada saída para um padrão (alguns endereços MAC que eu já tenho) na primeira coluna em um arquivo ("target.txt") e, se houver uma correspondência , awk deve produzir a primeira e a segunda coluna deste arquivo.

Exemplo de target.txt :

ab:cd:ef:gh:ij:kl,Me
12:34:56:78:90:10,You
1b:2d:3f:4h:5j:6l,someone

Para tornar tudo mais fácil, minha saída tshark tem apenas duas colunas e a coluna de endereço MAC é a segunda.

1 linha de tshark output é como:

Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 
           ^^^^- date and MAC are separated by tab!

Portanto, se tshark encontrar 12:34:56:78:90:10 , awk produzirá

12:34:56:78:90:10 -> You

ou melhor:

Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You

EDIT # 1

Bem, fiz alguns testes e descobri que tshark s output é separado por tab \ t. Não é grande coisa, mas já é uma pequena melhoria. O problema é que obtive amostras da tshark output e testei com a resposta do Gnoucs através de um comando echo antes do pipe | . Funcionou. Então eu mudei o echo para tshark e tudo parou de funcionar =).

É um problema com os dados ao vivo ou algo parecido? Aqui está o meu código até agora:

$ tshark -I -i wlan0 -T fields -e radiotap.dbm_antsignal -e wlan.sa | awk -F'[ ,\t]' '
     FNR == NR { a[$1] = $2 }
     ($NF in a) { print $0" -> "a[$NF] }
 ' alvos.txt -

bem, funcionou! Provavelmente foi um erro de digitação. Obrigado por todas as respostas!

    
por DMurta 18.06.2014 / 02:50

3 respostas

5

Tente isto:

$ awk -F'[ ,\t]' '
    FNR == NR { a[$1] = $2 }
    ($NF in a) { print $0" -> "a[$NF] }
' target.txt -

Exemplo:

$ awk -F'[ ,\t]' '
    FNR == NR { a[$1] = $2 }
    ($NF in a) { print $0" -> "a[$NF] }
' target.txt -
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 # Ctrl + D here
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You

Explicação

  • -F[ ,\t] : usamos vírgula, espaço ou tabulação como separadores de campo.
  • FNR == NR { a[$1] = $2 } : FNR == NR true somente ao processar o primeiro arquivo. Portanto, com cada linha em target.txt , salvamos o segundo campo em um array associativo, com o primeiro campo (endereço MAC) sendo o índice.
  • ($NF in a) : Ao ler a entrada ( - após target.txt causa awk lendo da entrada), se o último campo estiver na matriz associativa a , imprimimos o resultado desejado.
por 18.06.2014 / 03:59
3

Se eu entendi corretamente, qualquer um deles gerará pelo menos a saída desejada:

${TSHARK} |
sed -n "$(IFS=',
';  printf '/%s/s//& -> %s/p\n' \
        $(cat target.txt)
)"


${TSHARK} | 
sed -n "$(
   sed 's/,/|s||\& -> /
        s/.*/\|&|p/
   ' <target.txt
)"

Eu testei isso da seguinte maneira:

printf 'ab:cd:ef:gh:ij:kl,Me
12:34:56:78:90:10,You
1b:2d:3f:4h:5j:6l,someone' >./target.txt

printf 'Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10' |
sed ...

E esta foi minha saída:

Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You
    
por 18.06.2014 / 04:04
2
#!/usr/bin/env awk
# filename ~/mac-lookup.awk

function load_mac_list (filename, array) {
    while ((getline line < filename) > 0) {
        split(line, fields, ",");
        array[fields[1]] = fields[2];
    }
    close(filename)
}

BEGIN {
    load_mac_list("target.txt", mac_list);
}

($5 in mac_list) {
    print $0 " -> " mac_list[$5];
    next;
}

{
    print;   # remove this line to avoid printing unmatched lines
}

Aqui está a abordagem da força bruta. Carregue o arquivo de destino e imprima o alias do mac apenas se o endereço MAC estiver na lista.

Note que neste caso, o "target.txt" é codificado no script awk. Na resposta do Gnouc, você pode fazer o script do nome da lista de alvos conforme desejado.

Uso

$ ${TSHARK} | awk -f ~/mac-lookup.awk
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You
Jun 16, 2014 02:55:51.300286010 zy:xw:vu:ts:rq:po
Jun 16, 2014 02:55:51.300286020 ab:cd:ef:gh:ij:kl -> Me
    
por 18.06.2014 / 04:05