首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于tcpdump输出上的简单问题,需要使用awk/sed/cut替代方案。

对于tcpdump输出上的简单问题,需要使用awk/sed/cut替代方案。
EN

Stack Overflow用户
提问于 2011-11-28 12:31:11
回答 4查看 1.9K关注 0票数 1

这是我输入文件时遇到的问题,它包含不同类型的n/w数据包以及报头信息。

这是一个只包含两个包的示例文件..。

代码语言:javascript
复制
18:10:17.528660 IP6 2001::100 > 2001::200: ESP(spi=0x00005fb4,seq=0x23),
length 168
    0x0000:  6000 0000 00A8 3220 2001 0000 0000 0000   ................
    0x0010:  0000 0000 0000 0100 2001 0000 0000 0000   ................
    0x0020:  0000 0000 0000 0200 0000 5FB4 0000 0023   ................
    0x0030:  0000 0000 0000 0000 0000 0000 0000 0000   ................
    0x0040:  0000 0000 0000 0000 0000 0000 0000 0000   ................
    0x0050:  0000 0000 0000 0000 0000 0000 0000 0000   ................
    0x0060:  5361 6C74 6564 5F5F 1267 6EE1 8FFD A625   ................
    0x0070:  6DAB 0F22 B006 0809 505F CD62 4C4F FCC2   ................
    0x0080:  0966 DD9A E1E8 F582 EF63 C8BF 5F08 3D46   ................
    0x0090:  3033 3361 3666 6131 3430 3036 6163 3931   ................
    0x00a0:  3365 6137 3936 3866 6133 6334 6434 3837   ................
    0x00b0:  3037 6531 6534 3761 0A00 0000 0000 0000   ................
    0x00c0:  0000 0000 0000 0000 0000 0000 0000 0000   ................
18:10:17.528660 IP6 2001::100 > 2001::200: ESP(spi=0x00005fb4,seq=0x23), 
length 168
    0x0000:  6000 0000 0070 3220 0000 0000 0000 0000   ................
    0x0040:  0000 0000 0000 0001 0000 0000 0000 0000   ................
    0x0050:  0000 0000 0000 0002 0000 0270 0000 000D   ................
    0x0060:  5361 6C74 6564 5F5F 682A CB8F 97D9 10A2   ................
    0x0070:  1D12 88CB EE21 9F00 42AF AFA4 C919 B1E6   ................
    0x0080:  045A B5DF 93BE FA50 3231 3164 3939 6534   ................
    0x0090:  3332 6563 3634 3737 6133 6265 3231 6161   ................
    0x00a0:  3730 3866 6331 3636 3363 3933 6232 3264   ................
    0x00b0:  0A00 0000 0000 0000 0000 0000 0000 0000   ................
    0x00c0:  0000 0000 0000 0000                       ........

这些...可以是任何它们各自对应于指定十六进制字符的ascii字符。我只需要提取每包的中六角部分。

我需要以下格式的输出。

代码语言:javascript
复制
6000 0000 00A8 3220 2001 0000 0000 0000
0000 0000 0000 0100 2001 0000 0000 0000
0000 0000 0000 0200 0000 5FB4 0000 0023
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
5361 6C74 6564 5F5F 1267 6EE1 8FFD A625
6DAB 0F22 B006 0809 505F CD62 4C4F FCC2
0966 DD9A E1E8 F582 EF63 C8BF 5F08 3D46
3033 3361 3666 6131 3430 3036 6163 3931
3365 6137 3936 3866 6133 6334 6434 3837
3037 6531 6534 3761 0A00 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

例如,这里有两个文件应该生成,即ipsec_packet1.txt和ipsec_packet2.txt,每个文件都应该包含仅以上述格式指定的中间十六进制部分。

这是我的剧本..。

代码语言:javascript
复制
 cat received_ipsec.txt | tr '[a-z]' '[A-Z]' > tmp_tcpdump.txt

 count=`grep -w -c 0X0000 tmp_tcpdump.txt`

 grep -w -n 0X0000 tmp_tcpdump.txt > tmp_samp.txt

 i=1

 cut -d ":" -f$i tmp_samp.txt | tr '\n' ' ' > tmp_try.txt

 while [ $i -le $count ]

 do

    k=`expr $i + 1 `

    prev_j=`cut -d " " -f$i tmp_try.txt`
    next_j=`cut -d " " -f$k tmp_try.txt`

//这部分需要注意.

代码语言:javascript
复制
    if [ $i -eq $count ]
    then

            awk -v prev_j=$prev_j '{if(NR>=prev_j)print $0}' 
      tmp_tcpdump.txt > tmp_packet.txt


       // first trial failed so commented

          # cut -d ":" -f2 tmp_packet.txt | sed 's/ *//' | 
          #   cut -d " " -f1-8 > ipsec_packet$i.txt

       // secone trial failde so commented

          #  cut -d " " -f 3-10 tmp_packet.txt > ipsec_packet$i.txt

       // third one although it also not working properly but will 
          explain it below


      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}' >ipsec_packet$i.txt

    else
            awk -v prev_j=$prev_j -v next_j=$next_j 
       '{if(NR>=prev_j && NR<next_j-1)print $0}' tmp_tcpdump.txt
       > tmp_packet.txt

      # cut -d ":" -f2 tmp_packet.txt | sed 's/ *//' | 
      #  cut -d " " -f1-8 > ipsec_packet$i.txt

     #  cut -d " " -f 3-10 tmp_packet.txt > ipsec_packet$i.txt


       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}' > ipsec_packet$i.txt

    fi

    i=`expr $i + 1 `

   done 

创造角色的问题是..。

代码语言:javascript
复制
   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}' 

如果最后一行是这样的,那么就没有问题(如上面的第1包)。

代码语言:javascript
复制
   0000 0000 0000 0000 0000 0000 0000 0000 

但是,如果最后一行是这样的,那么就会出现一个问题(如上面的第2包)。

代码语言:javascript
复制
   0000 0000 0000 0000 

然后,它将抓住其他四个字段从虚线部分,如..。

代码语言:javascript
复制
   0000 0000 0000 0000 ....

也许我不需要所有这些来执行我的任务,但我是新的,所以不太了解这个sed/awk世界。

编辑:

这是grep ...and示例之一的输出,我没有任何理由说明它为什么是这种格式的。这就是为什么我没有使用简单的cut by column逻辑。

代码语言:javascript
复制
2:      0X0000:  6000 0000 00A8 3220 2001 0000 0000 0000  
16:        0X0000:       6000 0000 0070 3220 0000 0000 0000 0000
27:     0X0000:  6000 0000 0080 3220 0000 0000 0000 0000
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-28 12:36:46

在你的grep之后只有相关的行,只做

代码语言:javascript
复制
cut -d: -f2- | cut -c3-42

可能会有个别的错误,但是那些你可以通过尝试和错误来修正的错误。或者,您只需要一个单独的cut -c...就可以做到这一点,但是您需要计算更多的字符。

票数 2
EN

Stack Overflow用户

发布于 2011-11-28 12:40:53

根据您的示例,您只需要一个简短的awk oneliner:注意,-F中有两个空格

代码语言:javascript
复制
 awk -F'  ' '{print $4}' yourFile

去拿你需要的零件。

对您的示例进行测试:(t是文件)

代码语言:javascript
复制
kent$  awk -F'  ' '{print $4}' t


6000 0000 00A8 3220 2001 0000 0000 0000
0000 0000 0000 0100 2001 0000 0000 0000
0000 0000 0000 0200 0000 5FB4 0000 0023
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000
5361 6C74 6564 5F5F 1267 6EE1 8FFD A625
6DAB 0F22 B006 0809 505F CD62 4C4F FCC2
0966 DD9A E1E8 F582 EF63 C8BF 5F08 3D46
3033 3361 3666 6131 3430 3036 6163 3931
3365 6137 3936 3866 6133 6334 6434 3837
3037 6531 6534 3761 0A00 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000


6000 0000 0070 3220 0000 0000 0000 0000
0000 0000 0000 0001 0000 0000 0000 0000
0000 0000 0000 0002 0000 0270 0000 000D
5361 6C74 6564 5F5F 682A CB8F 97D9 10A2
1D12 88CB EE21 9F00 42AF AFA4 C919 B1E6
045A B5DF 93BE FA50 3231 3164 3939 6534
3332 6563 3634 3737 6133 6265 3231 6161
3730 3866 6331 3636 3363 3933 6232 3264
0A00 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000
票数 0
EN

Stack Overflow用户

发布于 2011-11-28 12:42:01

(g)awk

代码语言:javascript
复制
awk '/^ *0x....:/ {print substr($0,14,39)}' INPUTFILE

HTH

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8295843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档