Lo que intento hacer es bastante simple. Estoy generando resultados tshark
y redireccionándolos awk
con una tubería |
. Dado que tshark
obtiene datos en vivo, quiero awk
buscar 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, awk
deberí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 tshark
salida tiene solo 2 columnas y la columna de dirección MAC es la segunda.
1 línea de tshark
salida es como:
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10
^^^^- date and MAC are separated by tab!
Entonces, si tshark
lo encuentra 12:34:56:78:90:10
, awk
generará
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 tshark
la 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 tshark
la salida y las probé con la respuesta de Gnoucs a través de un echo
comando antes de la tubería |
. Funcionó. Luego cambié el echo
for tshark
y 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 == NR
solo es cierto cuando se procesa el primer archivo. Entonces, con cada línea entarget.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 detarget.txt
causarawk
la lectura de la entrada), si el último campo está en una matriz asociativaa
, 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