我想从一个文本块中仅提取某些信息。我非常幸运地向StackOverflow社区询问他们的专业知识,特别是有棘手的主题(RegEx,perl,sed,awk)。
文本是从tshark
命令输出的,我想操作并打印出来以避免不必要的信息。
任何帮助将不胜感激。我目前正在学习上述主题的方法,但进展缓慢!
任何有助于实现以下输出的脚本或命令都将非常有用。
原件:
Host 1 Host 2 Total Relative Duration
Host 1 Host 2 Frames Bytes Frames Bytes Frames Bytes Start
192.168.0.14 <-> 192.168.0.13 3898 4872033 1971 120545 5869 4992578 0.001886000 283.6363
192.168.0.162 <-> 192.168.0.71 2 1992 2 1992 4 3984 176.765198000 77.0542
192.168.0.191 <-> 192.168.0.150 3 2988 0 0 3 2988 199.319020000 59.7055
192.168.0.227 <-> 192.168.0.157 3 2988 0 0 3 2988 197.013283000 76.7197
192.168.0.221 <-> 192.168.0.94 3 2988 0 0 3 2988 196.312847000 59.7065
192.168.0.75 <-> 192.168.0.58 2 1992 1 996 3 2988 191.995706000 59.7121
224.0.0.252 <-> 192.168.0.13 3 207 0 0 3 207 180.521299000 0.0536
192.168.0.191 <-> 192.168.0.50 1 996 2 1992 3 2988 173.452130000 59.6849
192.168.0.41 <-> 192.168.0.13 3 2988 0 0 3 2988 167.180087000 76.6960
192.168.0.206 <-> 192.168.0.153 1 996 1 996 2 1992 270.528070000 4.4070
所需:
Host 1 Host 2 Total Bytes
x.x.x.x x.x.x.x N
x.x.x.x x.x.x.x N
x.x.x.x x.x.x.x N
答案 0 :(得分:2)
尝试:
awk '
BEGIN { printf "%-15s %-15s %s\n", "Host 1", "Host 2", "Total Bytes" }
NR>2 { printf "%-15s %-15s %11s\n", $1, $3, $9 }
' file
根据需要调整输出字段宽度。
BEGIN
块用于打印输出标题行。NR > 2
可确保跳过输入标题行。printf
与字段宽度说明符一起使用创建列对齐输出。
-
在宽度说明符之前指示左对齐输出(例如,%-15s
;没有它,值是右对齐的(例如,%11s
)答案 1 :(得分:2)
in perl:
tshark | perl -lane 'print join "\t", ($F[0], $F[2], $F[8])'
-a
选项将每行stdin拆分为一个名为@F
的数组。列号与数组索引号不完全对应,因为-a
默认按空格分割。如果愿意,可以使用-F
设置分隔符。
-F
也有助于正确对齐标题,但只是跳过未对齐的标题,在next if $. < 3;
之前添加print
以跳过前两行
答案 2 :(得分:1)
鉴于您的输出位于 filename :
sed 's/ \+/ /g' filename | tail -n +3 | cut -f1,3,9 -d ' ' | sed 's/ /\t/g' | sort -r -n -k3
输出:
192.168.0.14 192.168.0.13 4992578
192.168.0.162 192.168.0.71 3984
192.168.0.75 192.168.0.58 2988
192.168.0.41 192.168.0.13 2988
192.168.0.227 192.168.0.157 2988
192.168.0.221 192.168.0.94 2988
192.168.0.191 192.168.0.50 2988
192.168.0.191 192.168.0.150 2988
192.168.0.206 192.168.0.153 1992
224.0.0.252 192.168.0.13 207