awk filtra captura en vivo con archivo como lista de patrones

awk filtra captura en vivo con archivo como lista de patrones

Lo que intento hacer es bastante simple. Estoy generando resultados tsharky redireccionándolos awkcon una tubería |. Dado que tsharkobtiene datos en vivo, quiero awkbuscar en cada salida un patrón (algunas direcciones MAC que ya tengo) en la primera columna de un archivo ("target.txt") y, si hay una coincidencia, awkdebería generar la primera y segunda columna de este archivo.

Ejemplo 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 hacerlo todo más fácil, mi tsharksalida tiene solo 2 columnas y la columna de dirección MAC es la segunda.

1 línea de tsharksalida es como:

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

Entonces, si tsharklo encuentra 12:34:56:78:90:10, awkgenerará

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

o mejor:

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

EDITAR #1

Bueno, hice algunas pruebas y descubrí que tsharkla salida de s está separada por tab\t. No es gran cosa, pero ya es una pequeña mejora. La cuestión es que obtuve muestras de tsharkla salida y las probé con la respuesta de Gnoucs a través de un echocomando antes de la tubería |. Funcionó. Luego cambié el echofor tsharky todo dejó de funcionar =).

¿Es un problema con los datos en vivo o algo así? Aquí está mi código hasta ahora:

$ 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 -

bueno, ¡simplemente funcionó! Probablemente fue un error tipográfico. ¡Gracias por todas las respuestas!

Respuesta1

Prueba esto:

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

Ejemplo:

$ 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

Explicación

  • -F[ ,\t]: utilizamos coma, espacio o tabulador como separadores de campos.
  • FNR == NR { a[$1] = $2 }: FNR == NRsolo es cierto cuando se procesa el primer archivo. Entonces, con cada línea en target.txt, guardamos el segundo campo en una matriz asociativa, donde el primer campo (dirección MAC) es el índice.
  • ($NF in a): Al leer la entrada ( -después de target.txtcausar awkla lectura de la entrada), si el último campo está en una matriz asociativa a, imprimimos el resultado deseado.

Respuesta2

Si le entiendo correctamente, cualquiera de estos al menos generará el resultado deseado:

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


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

Probé esto de la siguiente manera:

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

Y este fue mi resultado:

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

Respuesta3

#!/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
}

Aquí está el enfoque de fuerza bruta. Cargue el archivo de destino, luego imprima el alias de mac solo si la dirección mac está en la lista.

Tenga en cuenta que en este caso, el "target.txt" está codificado en el script awk. En la respuesta de Gnouc, puede escribir el nombre del archivo de la lista de objetivos como desee.

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

información relacionada