通过命令提取文本文件信息 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; 以跳过前两行