需要从tcpdump输出中提取中间十六进制部分

时间:2011-11-26 10:35:43

标签: linux shell awk cut tcpdump

这是捕获数据包的tcpdump十六进制输出。

使用的命令是..

$ tcpdump -X -s0 protochain <portno> 

0x0000:  6000 0000 0080 3220 0000 0000 0000 0000  ................
0x0040:  0000 0000 0000 0001 0000 0000 0000 0000  ................
0x0090:  6174 6500 0000 0329                      ........

这些...可以是与指定的十六进制字符对应的ascii字符。我需要提取中间的十六进制部分。

我需要以下列格式输出。请给我一些建议。

6000 0000 0080 3220 0000 0000 0000 0000
0000 0000 0000 0001 0000 0000 0000 0000
6174 6500 0000 0329 

我试过这个,但这似乎不正确..

cut -d ":" -f2 tmp_packet.txt | awk -F " " '{printf "%s %s %s %s %s %s %s %s 
\n",$1,$2,$3,$4,$5,$6,$7,$8}' > packet.txt

尝试使用cut -b,但这会产生奇怪的输出。

如果可能,建议使用awk NRNF。我是awk的新手,所以不太了解他们。

我尝试了这个并将...作为输出。

cut -d ":" -f2 tmp_packet.txt | awk -F " " '{printf "%s\n",$NF}' > packet.txt

输出

................
................
........

有没有办法使用awk打印除最后一列之外的所有列(即打印除上述指定之外的所有列)。

4 个答案:

答案 0 :(得分:2)

您可以尝试将grep用作:

egrep -o '([0-9]{4} ){1,8}'  input

See it

答案 1 :(得分:1)

按空格切割:cut -d " " -f 3-10

答案 2 :(得分:0)

您的AWK解决方案 - awk '{for(i=2;i<=9;i++) printf $i" ";printf "\n"}' file | sed 's/\.*//g'

[jaypal~/Temp]$ cat file
0x0000:  6000 0000 0080 3220 0000 0000 0000 0000  ................
0x0040:  0000 0000 0000 0001 0000 0000 0000 0000  ................
0x0090:  6174 6500 0000 0329                      ........

[jaypal~/Temp]$ awk '{for(i=2;i<=9;i++) printf $i" ";printf "\n"}' file | sed 's/\.*//g'
6000 0000 0080 3220 0000 0000 0000 0000 
0000 0000 0000 0001 0000 0000 0000 0000 
6174 6500 0000 0329 

通过AWK打印的另一种方式 -

[jaypal~/Temp]$ awk '{$1="";$10=""; print}' file | sed 's/\.*//g'
 6000 0000 0080 3220 0000 0000 0000 0000 
 0000 0000 0000 0001 0000 0000 0000 0000 
 6174 6500 0000 0329  

答案 3 :(得分:0)

这可能对您有用:

sed 's/.\{9\}\(.\{39\}\).*/\1/' file

或者如果你想删除尾随空格:

sed 's/.\{9\}\(.\{39\}\).*/\1/;s/\s*$//' file