DMu*_*rta 4 awk text-processing tshark
我想要做的很简单。我正在生成输出tshark
并将其重定向到awk
pipe |
。由于tshark
获取实时数据,我希望awk
在文件(“target.txt”)的第一列中的每个输出中搜索模式(我已经拥有的一些 MAC 地址),如果匹配,awk
则应输出第一个和此文件的第二列。
示例来自target.txt
:
ab:cd:ef:gh:ij:kl,Me
12:34:56:78:90:10,You
1b:2d:3f:4h:5j:6l,someone
Run Code Online (Sandbox Code Playgroud)
为方便起见,我的tshark
输出只有 2 列,MAC 地址列是第二列。
1 行tshark
输出是这样的:
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10
^^^^- date and MAC are separated by tab!
Run Code Online (Sandbox Code Playgroud)
所以如果tshark
找到12:34:56:78:90:10
,awk
将输出
12:34:56:78:90:10 -> You
Run Code Online (Sandbox Code Playgroud)
甚至更好:
Jun 16, 2014 02:55:51.300286000 12:34:56:78:90:10 -> You
Run Code Online (Sandbox Code Playgroud)
好吧,我做了一些测试,发现tshark
s 的输出是由tab
\t分隔的。这不是什么大问题,但已经是一个小小的改进。问题是,我从tshark
输出中获取了样本,并通过echo
管道之前的命令使用 Gnoucs 回答进行了测试|
。有效。然后我更改了echo
fortshark
并且一切都停止了=)。
是实时数据的问题还是类似的问题?到目前为止,这是我的代码:
$ 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 -
Run Code Online (Sandbox Code Playgroud)
好吧,它刚刚奏效!这可能是一个错字。感谢所有的答案!
尝试这个:
$ awk -F'[ ,\t]' '
FNR == NR { a[$1] = $2 }
($NF in a) { print $0" -> "a[$NF] }
' target.txt -
Run Code Online (Sandbox Code Playgroud)
例子:
$ 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
Run Code Online (Sandbox Code Playgroud)
解释
-F[ ,\t]
: 我们使用逗号、空格或制表符作为字段分隔符。FNR == NR { a[$1] = $2 }
:FNR == NR
仅在处理第一个文件时为真。因此,对于 中的每一行target.txt
,我们将第二个字段保存到关联数组中,第一个字段(MAC 地址)是索引。($NF in a)
: 当读取输入时(-
在target.txt
导致awk
从输入读取之后),如果最后一个字段在关联数组中a
,我们打印所需的结果。