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