在 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
使用gawk
1(按照格伦·杰克曼的建议记录分隔符):
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
这对于手动检查来说很好,但对于自动化检查,我们需要更多信息。此外,数据库最适合此类查询。