首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >行操作和排序

行操作和排序
EN

Stack Overflow用户
提问于 2015-03-30 00:50:37
回答 2查看 100关注 0票数 2

我很擅长编写Linux脚本,但可能需要一些建议。我知道这个问题有点模糊,所以如果你能提供任何帮助,我会很感激的!

以下是个人成长的问题,也是因为我正在写一些网络工具来取乐/学习。没有家庭作业(我是大四学生,我的课都不需要这些东西!)

我正在使用t鲨来获取有关数据包捕获的信息。看上去是这样的:

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

我想让它看起来像:

代码语言:javascript
复制
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等都是父母,他们的统计数据对我来说是不必要的。此外,我不想有一个可怕的文本块,只有空格来显示层次结构,我想为父母删除所有的统计数据,并将它们显示为孩子身后的面包屑。

示例:

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

应该变成

代码语言:javascript
复制
eth:ip:icmp - 1308988 bytes
eth:ip:udp:data - 1346228 bytes
eth:ip:udp:dns - 1176 bytes

以保留层次结构并避免打印无用的统计信息。

不管怎么说,埃坦批准的答案完美地解决了这个问题!对于那些在我这个层次上不知道在这个答案之后该如何进行的人,这将帮助你们完成:

  1. 将给定的脚本保存为filename.awk文件
  2. 将要操作的文本块保存为filename.txt文件
  3. 调用awk -f filename.awk filename.txt
  4. 可选地将输出输送到文件( awk -f filename.awk filename.txt >> output.txt )
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-30 01:50:50

我最初认为您想要的输出可以通过这个awk脚本来实现。(我认为这样做可能会更干净,但这似乎足够有效。)

代码语言:javascript
复制
function entry() {
    # Don't want to print empty entries.
    if (ind[0]) {
        printf "%s", ind[0]
        for (i = 1; i <= ls; i++) {
            printf ":%s", ind[i]
        }
        split(b, a, /:/)
        printf " - %s %s\n", a[2], a[1]
    }
}

# Found our data marker. Note that and print the current line.
$1 == "Filter:" {d=1; print; next}
# Print lines until we see our data marker.
!d {print; next}
# Print empty lines.
!NF {print; next}
# Save our trailing line for later.
/===/ {suf=$0; next}

{
    # Save our previous indentation level.
    ls = s
    # Find our new indentation level (by where the first field starts).
    s = (match($0, /[^[:space:]]/)-1) / 2

    # If the current line is at or below the last indent level print the last line.
    if (s <= ls) {
        entry()
    }

    # Save the current line's byte count.
    b=$NF
    # Save the current line's field name.
    ind[s] = $1
}

END {
    # Print a final line if we had one.
    entry()
    # Print the suffix line if we have one.
    if (suf) {
        print suf
    }
}

在样本输入上,得到这个输出。

代码语言:javascript
复制
===================================================================
Protocol Hierarchy Statistics
Filter:

eth:ip:icmp - 1308988 bytes
eth:ip:udp:data - 1346228 bytes
eth:ip:udp:dns - 1176 bytes
eth:ip:udp:nbns - 1300 bytes
eth:ip:udp:http - 1596 bytes
eth:ip:udp:nbdgm:smb:mailslot:browser - 486 bytes
eth:ip:tcp:data - 1294800 bytes
eth:ip:tcp:http:data-text-lines - 324 bytes
eth:ip:tcp:http:xml:tcp.segments - 787 bytes
eth:ip:tcp:nbss:smb:pipe:lanman - 686 bytes
eth:ip:tcp:nbss:smb2 - 2444 bytes
eth:ip:tcp:bittorrent:tcp.segments:bittorrent:bittorrent - 258 bytes
eth:ip:tcp:bittorrent:bittorrent:bittorrent - 221 bytes
eth:arp - 8760 bytes
eth:ipv6:udp:dns - 1711 bytes
eth:ipv6:udp:dhcpv6 - 2114 bytes
eth:ipv6:udp:http - 1014 bytes
eth:ipv6:udp:data - 1372 bytes
eth:ipv6:icmpv6:data - 344 bytes
===================================================================

但是,您所编辑的输出(如您希望的输出)可能更容易使用sed来处理。

代码语言:javascript
复制
/Filter:/a \
Protocol                   Bytes \
=====================================
s/frames:[^ ]*//
s/               b/b/
s/bytes:\([^ ]*\)/\1/

以输出结束。

代码语言:javascript
复制
===================================================================
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
===================================================================
票数 2
EN

Stack Overflow用户

发布于 2015-03-30 03:47:29

一个带有sed的简单脚本也可以工作。

代码语言:javascript
复制
$ 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输出的文件名):

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

输出

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

格式化

根据您关于如何根据bytes的可变长度对齐protocol tags信息的注释,您可以使用printf对输出进行格式化。就像伊森一样,我开始研究你最初的问题,把标签整合在一起。我最初的方法是将不同级别读取到不同的关联数组中,这些可以组合到您最初指定的内容中。为此,我必须使用printf生成排成一行的输出。下面是我第一次尝试使用tshark数据的前4层:

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

例如,它产生的产出如下:

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

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

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

https://stackoverflow.com/questions/29336829

复制
相关文章

相似问题

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