String 线路操纵与控制;分类

String 线路操纵与控制;分类,string,bash,sorting,tshark,String,Bash,Sorting,Tshark,我在编写Linux脚本方面还不错,但我需要一些建议。我知道这个问题有点模糊,所以如果你能提供任何帮助,我将不胜感激 以下问题是关于个人成长的,因为我正在写一些网络工具来娱乐/学习。不涉及家庭作业(我是大学四年级学生,我的任何课程都不需要这些东西!) 我正在使用tshark获取有关数据包捕获的信息。这就是它看起来的样子: rachel@Ubuntu-1:~/PCAP$ tshark -r LargeTorrent.pcap -q -z io,phs =======================

我在编写Linux脚本方面还不错,但我需要一些建议。我知道这个问题有点模糊,所以如果你能提供任何帮助,我将不胜感激

以下问题是关于个人成长的,因为我正在写一些网络工具来娱乐/学习。不涉及家庭作业(我是大学四年级学生,我的任何课程都不需要这些东西!)

我正在使用tshark获取有关数据包捕获的信息。这就是它看起来的样子:

rachel@Ubuntu-1:~/PCAP$ tshark -r LargeTorrent.pcap -q -z io,phs

===================================================================
Protocol Hierarchy Statistics
Filter: 

eth                                      frames:4309 bytes:3984321
  ip                                     frames:4119 bytes:3969006
    icmp                                 frames:1316 bytes:1308988
    udp                                  frames:1408 bytes:1350786
      data                               frames:1368 bytes:1346228
      dns                                frames:16 bytes:1176
      nbns                               frames:14 bytes:1300
      http                               frames:8 bytes:1596
      nbdgm                              frames:2 bytes:486
        smb                              frames:2 bytes:486
          mailslot                       frames:2 bytes:486
            browser                      frames:2 bytes:486
    tcp                                  frames:1395 bytes:1309232
      data                               frames:1300 bytes:1294800
      http                               frames:6 bytes:3763
        data-text-lines                  frames:2 bytes:324
        xml                              frames:2 bytes:3205
          tcp.segments                   frames:1 bytes:787
      nbss                               frames:34 bytes:5863
        smb                              frames:17 bytes:3047
          pipe                           frames:4 bytes:686
            lanman                       frames:4 bytes:686
        smb2                             frames:13 bytes:2444
      bittorrent                         frames:10 bytes:1709
        tcp.segments                     frames:2 bytes:433
          bittorrent                     frames:2 bytes:433
            bittorrent                   frames:1 bytes:258
        bittorrent                       frames:2 bytes:221
          bittorrent                     frames:2 bytes:221
  arp                                    frames:146 bytes:8760
  ipv6                                   frames:44 bytes:6555
    udp                                  frames:40 bytes:6211
      dns                                frames:18 bytes:1711
      dhcpv6                             frames:14 bytes:2114
      http                               frames:6 bytes:1014
      data                               frames:2 bytes:1372
    icmpv6                               frames:4 bytes:344
===================================================================
我希望它看起来像什么:

rachel@Ubuntu-1:~/PCAP$ tshark -r LargeTorrent.pcap -q -z io,phs

===================================================================
Protocol Hierarchy Statistics
Filter: 

Protocol                   Bytes
=====================================
eth                        984321
  ip                       3969006
    icmp                   1308988
    udp                    1350786
      data                 1346228
      dns                  1176
      nbns                 1300
      http                 1596
      nbdgm                486
        smb                486
          mailslot         486
            browser        486
    tcp                    1309232
      data                 1294800
      http                 3763
        data-text-lines    324
        xml                3205
          tcp.segments     787
      nbss                 5863
        smb                3047
          pipe             686
            lanman         686
        smb2               2444
      bittorrent           1709
        tcp.segments       433
          bittorrent       433
            bittorrent     258
        bittorrent         221
          bittorrent       221
  arp                      8760
  ipv6                     6555
    udp                    6211
      dns                  1711
      dhcpv6               2114
      http                 1014
      data                 1372
    icmpv6                 344
===================================================================



编辑:我将添加原始问题,以便理解所提供的(很棒的)答案

最初,我只想打印“假期”的统计数据,因为eth、ip等都是家长,我不需要他们的统计数据。此外,我想删除所有父母的统计数据,并将它们显示为孩子身后的面包屑,而不是一块只有空格的可怕的文本块来显示层次结构

例如:

eth                                      frames:4309 bytes:3984321
  ip                                     frames:4119 bytes:3969006
    icmp                                 frames:1316 bytes:1308988
    udp                                  frames:1408 bytes:1350786
      data                               frames:1368 bytes:1346228
      dns                                frames:16 bytes:1176
应该成为

eth:ip:icmp - 1308988 bytes
eth:ip:udp:data - 1346228 bytes
eth:ip:udp:dns - 1176 bytes
保留层次结构并避免打印无用的统计信息

不管怎样,伊坦批准的答案完美地解决了这个问题!对于那些与我同级的人,他们不确定在回答这个问题后如何继续,这将帮助您完成:

  • 将给定脚本另存为
    filename.awk
    文件
  • 将要处理的文本块另存为
    filename.txt
    文件
  • 调用
    awk-f filename.awk filename.txt
  • 可以选择将输出通过管道传输到文件(
    awk-f filename.awk filename.txt>>output.txt

  • 我最初认为您想要的输出可以通过这个
    awk
    脚本实现。(我认为这可能可以做得更干净,但这似乎已经足够好了。)

    但是,使用
    sed
    可能更容易处理您编辑以表示所需的输出

    /Filter:/a \
    Protocol                   Bytes \
    =====================================
    s/frames:[^ ]*//
    s/               b/b/
    s/bytes:\([^ ]*\)/\1/
    
    最后是输出

    ===================================================================
    Protocol Hierarchy Statistics
    Filter:
    Protocol                   Bytes
    =====================================
    
    eth                        3984321
      ip                       3969006
        icmp                   1308988
        udp                    1350786
          data                 1346228
          dns                  1176
          nbns                 1300
          http                 1596
          nbdgm                486
            smb                486
              mailslot         486
                browser        486
        tcp                    1309232
          data                 1294800
          http                 3763
            data-text-lines    324
            xml                3205
              tcp.segments     787
          nbss                 5863
            smb                3047
              pipe             686
                lanman         686
            smb2               2444
          bittorrent           1709
            tcp.segments       433
              bittorrent       433
                bittorrent     258
            bittorrent         221
              bittorrent       221
      arp                      8760
      ipv6                     6555
        udp                    6211
          dns                  1711
          dhcpv6               2114
          http                 1014
          data                 1372
        icmpv6                 344
    ===================================================================
    

    使用
    sed
    的简单脚本也可以工作

    $ printf "\n==========================================================\n"; printf "Protocol Hierarchy Statistics\nFilter:\n\n";printf "\nProtocol\t\t\t\t Bytes\n================================================\n" && sed -e 's/\(frames[:].*bytes[:]\)\(.*$\)/\2/' dat/tshark.txt | tail -n+4 | head -n-1 && printf "================================================\n"
    
    分解为脚本形式(其中
    dat/tshark.txt
    是保存
    tshark
    输出的文件名):

    输出

    ==========================================================
    Protocol Hierarchy Statistics
    Filter:
    
    Protocol                                 Bytes
    ================================================
    
    eth                                      3984321
      ip                                     3969006
        icmp                                 1308988
        udp                                  1350786
          data                               1346228
          dns                                1176
          nbns                               1300
          http                               1596
          nbdgm                              486
            smb                              486
              mailslot                       486
                browser                      486
        tcp                                  1309232
          data                               1294800
          http                               3763
            data-text-lines                  324
            xml                              3205
              tcp.segments                   787
          nbss                               5863
            smb                              3047
              pipe                           686
                lanman                       686
            smb2                             2444
          bittorrent                         1709
            tcp.segments                     433
              bittorrent                     433
                bittorrent                   258
            bittorrent                       221
              bittorrent                     221
      arp                                    8760
      ipv6                                   6555
        udp                                  6211
          dns                                1711
          dhcpv6                             2114
          http                               1014
          data                               1372
        icmpv6                               344
    ================================================
    

    格式化 根据您对如何对齐
    字节的评论,考虑到
    协议标签的可变长度,您可以使用
    printf
    来格式化您所指示的输出。像Ethan一样,我开始研究你的原始问题,并整合了标签。我最初的方法是将不同的级别读入不同的关联数组,这些数组可以组合到您最初指定的内容中。为此,我必须使用
    printf
    生成一行输出。以下是我第一次尝试使用tshark数据的前4个级别:

    declare -i ln=0
    declare -A l1 l2 l3 l4
    
    ## read each line in file and assing to associative arrays for each level
    while read -r line; do
    
        ln=${#line}   # base level on length of line read
        [ $ln -gt 66 ] && continue;
        [ $ln -eq 66 ] && { iface="${line%% *}"; l1[${iface}]="${line##*  }"; }
        [ $ln -eq 64 ] && { proto="${iface}:${line%% *}"; l2[${proto}]="${line##*  }"; }
        [ $ln -eq 62 ] && { ptype="${proto}:${line%% *}"; l3[${ptype}]="${line##*  }"; }
        [ $ln -le 60 ] && { data="${ptype}:${line%% *}"; l4[${data}]="${line##*  }"; }
    
    done < "$1"
    
    ## output a summary of the file
    printf "\n4-level deep summary of file '%s':\n\n" "$1"
    for i in "${!l1[@]}"; do
        for j in "${!l2[@]}"; do
            printf "  %-32s    %s\n" "$j" "${l2[$j]}"
            for k in "${!l3[@]}"; do
                printf "  %-32s    %s\n" "$k" "${l3[$k]}"
                for l in "${!l4[@]}"; do
                    [ "${l%:*}" == "$k" ] && printf "  %-32s    %s\n" "$l" "${l4[$l]}"
                done
            done
        done
    done
    

    您可以查看上面代码中的各种
    printf
    语句,并了解如何处理对齐。如果您还有其他问题,请告诉我。

    您想如何处理非叶字节计数(例如,
    eth.ip
    eth.ipv6.udp
    )的计数?问题很好!我不知道如何描述它(即非叶子项目)。我很乐意让它们出现——我编辑了这个问题来反映这一点。我试图弄清楚什么才是现实的目标,我不认为那些非叶子的可以被扔掉。我也不认为我可以按字节数排序,因为这样父项/子项就不能正确嵌套。哦,这根本不是我想你说的输出。我想你的字面意思是
    在每行上分隔层次结构名称。这个输出比我想象的要简单得多(刚刚完成)是的,我知道这让人困惑。基本上,在阅读了我“想要”的内容,然后考虑了我想要我的最终产品做什么之后,我认为简化行操作不会有什么坏处。我最初确实认为冒号可以分隔层次名称,但当然意识到这不是一个好主意&对于我需要它的目的来说,根本不需要冒号。哇,你真是一个专家。非常感谢您的帮助!绝对完美的答案。对其他读者:我编辑了这个问题,认为它是不合理的,但Etan提供了原始和编辑问题的答案。而且,要注意的是,在这篇文章中结束的其他人-将命令修改为
    awk-f protocols.awk protocols.txt | tail-n+6 | sort-r-n-k3
    将删除所有不必要的标题内容,以及按字节降序排序。在awk脚本中删除标题内容很容易。事实上,一开始的许多丑陋之处在于确保我们不这样做。从靠近顶部的一行位中删除
    print
    ,这样就可以了。是的,我忘记了排序部分,但是我会使用
    sort
    命令(如果你愿意,也可以用awk完成)。哇,谢谢你的帮助!你似乎对这东西很了解。所以,如果我把我的行格式化成这样(eth:ip:icmp-1308988字节),有没有一种方法可以将所有的字节计数分页为flush?我希望我能描述得更好,但是评论格式把我搞砸了!是的,我在上面的例子中做了一点。如果使用bash,
    printf
    可以让您更好地控制执行
    echo
    的格式设置。基本上,bash中的格式说明符与C中的格式说明符相同。在编辑之前,当我处理您的问题时,我所做的是生成一个类似于
    printf“%-32s%s字节\n”“$proto”“$bytes”
    proto
    文件(例如
    eth:ip:icmp
    )和
    字节
    保持
    1308988
    。这和你要找的相似吗?我将编辑答案并添加它。
    printf "\n==========================================================\n"
    printf "Protocol Hierarchy Statistics\nFilter:\n\n"
    printf "\nProtocol\t\t\t\t Bytes\n================================================\n"
    sed -e 's/\(frames[:].*bytes[:]\)\(.*$\)/\2/' dat/tshark.txt | tail -n+4 | head -n-1
    printf "================================================\n"
    
    ==========================================================
    Protocol Hierarchy Statistics
    Filter:
    
    Protocol                                 Bytes
    ================================================
    
    eth                                      3984321
      ip                                     3969006
        icmp                                 1308988
        udp                                  1350786
          data                               1346228
          dns                                1176
          nbns                               1300
          http                               1596
          nbdgm                              486
            smb                              486
              mailslot                       486
                browser                      486
        tcp                                  1309232
          data                               1294800
          http                               3763
            data-text-lines                  324
            xml                              3205
              tcp.segments                   787
          nbss                               5863
            smb                              3047
              pipe                           686
                lanman                       686
            smb2                             2444
          bittorrent                         1709
            tcp.segments                     433
              bittorrent                     433
                bittorrent                   258
            bittorrent                       221
              bittorrent                     221
      arp                                    8760
      ipv6                                   6555
        udp                                  6211
          dns                                1711
          dhcpv6                             2114
          http                               1014
          data                               1372
        icmpv6                               344
    ================================================
    
    declare -i ln=0
    declare -A l1 l2 l3 l4
    
    ## read each line in file and assing to associative arrays for each level
    while read -r line; do
    
        ln=${#line}   # base level on length of line read
        [ $ln -gt 66 ] && continue;
        [ $ln -eq 66 ] && { iface="${line%% *}"; l1[${iface}]="${line##*  }"; }
        [ $ln -eq 64 ] && { proto="${iface}:${line%% *}"; l2[${proto}]="${line##*  }"; }
        [ $ln -eq 62 ] && { ptype="${proto}:${line%% *}"; l3[${ptype}]="${line##*  }"; }
        [ $ln -le 60 ] && { data="${ptype}:${line%% *}"; l4[${data}]="${line##*  }"; }
    
    done < "$1"
    
    ## output a summary of the file
    printf "\n4-level deep summary of file '%s':\n\n" "$1"
    for i in "${!l1[@]}"; do
        for j in "${!l2[@]}"; do
            printf "  %-32s    %s\n" "$j" "${l2[$j]}"
            for k in "${!l3[@]}"; do
                printf "  %-32s    %s\n" "$k" "${l3[$k]}"
                for l in "${!l4[@]}"; do
                    [ "${l%:*}" == "$k" ] && printf "  %-32s    %s\n" "$l" "${l4[$l]}"
                done
            done
        done
    done
    
    eth:ip                              frames:4119 bytes:3969006
    eth:ip:udp                          frames:1408 bytes:1350786
    eth:ip:udp:data                     frames:1368 bytes:1346228
    eth:ip:udp:nbdgm                    frames:2 bytes:486
    eth:ip:udp:nbns                     frames:14 bytes:1300