通过命令提取文本文件信息 line/script
Extracting text file information via command line/script
我只想从一段文本中提取某些信息。我很幸运地向 Whosebug 社区寻求专业帮助,尤其是棘手的主题(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
鉴于您的输出在 文件名:
sed 's/ \+/ /g' filename | tail -n +3 | cut -f1,3,9 -d ' ' | sed 's/ /\t/g' | sort -r -n -k3
- 用一个空格替换多个空格,用于分词
- 丢弃前两 header 行
- 项目第 1、3 和 9 列
- 用制表符替换空格以使列返回
- 按总字节数对 desc 排序
输出:
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
尝试:
awk '
BEGIN { printf "%-15s %-15s %s\n", "Host 1", "Host 2", "Total Bytes" }
NR>2 { printf "%-15s %-15s %11s\n", , , }
' file
根据需要调整 output-field 宽度。
BEGIN
块用于打印输出header行。
NR > 2
确保跳过输入 header 行。
printf
与 field-width 说明符一起使用创建 column-aligned 输出。
- a
-
在宽度说明符之前表示 left-aligned 输出(例如,%-15s
;没有它,值为 right-aligned(例如,%11s
)
在 Perl 中:
tshark | perl -lane 'print join "\t", ($F[0], $F[2], $F[8])'
-a
选项将标准输入的每一行拆分为一个名为 @F
的数组。列号与数组索引号不对应,因为默认情况下 -a
按 space 拆分。如果你愿意,你可以用 -F
设置分隔符。
-F
也有助于使 headers 正确对齐,但要跳过未对齐的 headers,请在 print
之前添加 next if $. < 3;
以跳过前两行
我只想从一段文本中提取某些信息。我很幸运地向 Whosebug 社区寻求专业帮助,尤其是棘手的主题(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
鉴于您的输出在 文件名:
sed 's/ \+/ /g' filename | tail -n +3 | cut -f1,3,9 -d ' ' | sed 's/ /\t/g' | sort -r -n -k3
- 用一个空格替换多个空格,用于分词
- 丢弃前两 header 行
- 项目第 1、3 和 9 列
- 用制表符替换空格以使列返回
- 按总字节数对 desc 排序
输出:
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
尝试:
awk '
BEGIN { printf "%-15s %-15s %s\n", "Host 1", "Host 2", "Total Bytes" }
NR>2 { printf "%-15s %-15s %11s\n", , , }
' file
根据需要调整 output-field 宽度。
BEGIN
块用于打印输出header行。NR > 2
确保跳过输入 header 行。printf
与 field-width 说明符一起使用创建 column-aligned 输出。- a
-
在宽度说明符之前表示 left-aligned 输出(例如,%-15s
;没有它,值为 right-aligned(例如,%11s
)
- a
在 Perl 中:
tshark | perl -lane 'print join "\t", ($F[0], $F[2], $F[8])'
-a
选项将标准输入的每一行拆分为一个名为 @F
的数组。列号与数组索引号不对应,因为默认情况下 -a
按 space 拆分。如果你愿意,你可以用 -F
设置分隔符。
-F
也有助于使 headers 正确对齐,但要跳过未对齐的 headers,请在 print
之前添加 next if $. < 3;
以跳过前两行