通过命令行/脚本提取文本文件信息

时间:2015-03-30 03:09:39

标签: regex string perl awk sed

我想从一个文本块中仅提取某些信息。我非常幸运地向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

3 个答案:

答案 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与字段宽度说明符一起使用创建列对齐输出。
    • a -在宽度说明符之前指示左对齐输出(例如,%-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
  • 用一个空格替换多个空格,用于标记
  • 丢弃前两个标题行
  • 项目第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