Bash中按行末数值子串(数据包数量)排序的问题
嘿,我来帮你搞定这个排序问题!你之前用的sort -k6 -t '=' -n没生效,是因为分隔符选成=之后,每行的字段数根本到不了第6个,咱们一步步来解决:
问题原因分析
你用-t '='把每行按等号分割,拿其中一行举例:
type udp ip src=192.168.2.173 dport=53 packets=1
按=分割后会变成4个字段:
type udp ip src192.168.2.173 dport53 packets1
这时候指定-k6是无效的,因为不存在第6个字段,自然没法正确排序。
两种可行的解决方案
方案一:按等号分割,取最后一个字段排序
既然packets=是每行最后一个键值对,按=分割后的最后一个字段就是咱们要的数据包数字,直接针对这个字段做数值排序就行:
sort -t '=' -k4,4n your_input_file.txt
这里-k4,4n表示只对第4个字段进行数值排序,避免其他字段干扰。
方案二:用默认空格分割,取目标字段的数字部分排序
如果用默认的空格作为分隔符,每行的第6个字段是packets=X,咱们可以指定从这个字段的第8个字符开始排序(因为packets=占了7个字符,第8位就是数字开头):
sort -k6.8n your_input_file.txt
这个写法更简洁,不用指定分隔符,直接精准定位到数字部分做数值排序。
排序后的示例输出
执行上面任意一个命令后,输出会按数据包数量升序排列,大致是这样:
type udp ip src=192.168.2.173 dport=53 packets=1
type udp ip src=192.168.2.168 dport=53 packets=1
type udp ip src=192.168.2.173 dport=53 packets=1
type udp ip src=192.168.2.175 dport=53 packets=1
type udp ip src=192.168.2.178 dport=53 packets=1
type udp ip src=192.168.2.173 dport=53 packets=1
type udp ip src=192.168.2.173 dport=53 packets=7
type udp ip src=192.168.2.173 dport=53 packets=11
type udp ip src=192.168.2.162 dport=53 packets=23
type udp ip src=192.168.2.173 dport=53 packets=75
type udp ip src=192.168.2.162 dport=7777 packets=75
type udp ip src=192.168.2.173 dport=53 packets=100
type udp ip src=192.168.2.173 dport=53 packets=200
type udp ip src=192.168.2.170 dport=53 packets=560
备注:内容来源于stack exchange,提问作者okoolo

