如何在 Bash 中分析报告类型的数据?

如何在 Bash 中分析报告类型的数据?

在 Bash 中读取以下数据的最佳方式是什么?例如,如果数据像 als -l那么我可以逐行读取并且我在一行中拥有文件的所有详细信息。在这种情况下,我有以下格式的数据,其中每个记录由空行分隔。我只是在寻找基本想法,以便我可以构建对此数据的查询。

      Source:                 test
      Destination:            test2
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    16:45:45
      Mirror Timestamp:       Wed Nov  5 21:00:27 PST 2014
      Base Snapshot:          1573980876tsfr10_vol.550
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     944856 KB
      Last Transfer Duration: 00:01:42
      Last Transfer From:     -

      Source:                 test12
      Destination:            test123
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    10:41:00
      Mirror Timestamp:       Thu Nov  6 03:05:12 PST 2014
      Base Snapshot:          1573980876prd11_vol.1678
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     83982000 KB
      Last Transfer Duration: 03:21:38
      Last Transfer From:     -

      Source:                 abcd
      Destination:            xyz
      Status:                 Idle
      Progress:               -
      State:                  Source
      Lag:                    02:40:52
      Mirror Timestamp:       Thu Nov  6 11:05:20 PST 2014
      Base Snapshot:          (1573980876prd12_vol.912
      Current Transfer Type:  -
      Current Transfer Error: -
      Contents:               -
      Last Transfer Type:     -
      Last Transfer Size:     17520680 KB
      Last Transfer Duration: 01:23:56

基本上,我可以想到的一个选项是循环 15,因为每条记录有 15 个值,并读取每一行,然后查找我正在查询的数据,例如,如果我试图查找“源测试的传输大小”。

答案1

也许,这个 perl 会很有用:它将每个段落读入散列,因此您可以直接按名称引用字段:

perl -00 -F':\s+|\n' -anE '
    %data = @F; 
    say "last transfer of test = ", $data{"Last Transfer Size"}
        if $data{Source} eq "test";
' file
last transfer of test = 944856 KB

-00选项按空行序列将输入拆分为记录。
-F选项将字段分隔符设置为换行符或冒号后跟空格。
-n选项使脚本迭代文件中的所有记录。
-a选项将记录拆分为字段并将它们存储在 @F 数组中。

我假设您在问题中显示的前导空格实际上不在您的文件中。

答案2

使用gawk1(按照格伦·杰克曼的建议记录分隔符):

awk 'BEGIN { RS="" } /\<test\>/ { print $40,$41,$42 }' file
Size: 944856 KB

1. 注意:正则表达式运算符<>Gnu awk 特定

答案3

如果是手动检查,可以使用grep两次:

  • 一次用于使用正确的源名称(对象)。grep "<source/destination name>" -A 15将打印该对象及其所有子字段(15 行)。
  • 第二次查找子字段(对象属性)。grep "<property name>"

例如,在一起时:

$ cat testfile.txt | grep "abcd" -A 15 | grep "Transfer Size"
Last Transfer Size:      17520680 KB

这对于手动检查来说很好,但对于自动化检查,我们需要更多信息。此外,数据库最适合此类查询。

相关内容