1

这是捕获的数据包的 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但这给出了奇怪的输出。

如果可能的话,建议使用 awkNRNF. 我是 awk 的新手,所以对它们了解不多。

我试过这个并将它们...作为输出。

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

输出 :

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

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

4

4 回答 4

2

您可以尝试使用 grep 作为:

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

看见

于 2011-11-26T10:49:20.923 回答
1

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

于 2011-11-26T10:39:54.863 回答
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  
于 2011-11-26T10:55:19.390 回答
0

这可能对您有用:

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

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

sed 's/.\{9\}\(.\{39\}\).*/\1/;s/\s*$//' file
于 2011-11-26T19:45:52.177 回答