具有多行和 Grep 的 Bash 脚本

具有多行和 Grep 的 Bash 脚本

我有一个特定命令的输出,该命令可以提供应用程序在 OS X 系统上被标记为“已使用”的次数。命令是mdls

输出类似于以下内容(已截断)

...
kMDItemLastUsedDate            = 2016-03-15 18:45:00 +0000
kMDItemLogicalSize             = 47225668
kMDItemPhysicalSize            = 57065472
kMDItemUseCount                = 90
kMDItemUsedDates               = (
    "2016-02-02 06:00:00 +0000",
    "2016-02-03 06:00:00 +0000",
    "2016-02-04 06:00:00 +0000",
    "2016-02-05 06:00:00 +0000",
    "2016-02-09 06:00:00 +0000",
    "2016-02-10 06:00:00 +0000",
    "2016-02-11 06:00:00 +0000",
    "2016-02-12 06:00:00 +0000",
    "2016-02-13 06:00:00 +0000",
    "2016-02-14 06:00:00 +0000",
    "2016-02-15 06:00:00 +0000",
    "2016-02-16 06:00:00 +0000",
    "2016-02-17 06:00:00 +0000",
    "2016-02-18 06:00:00 +0000",
    "2016-02-19 06:00:00 +0000",
    "2016-02-20 06:00:00 +0000",
    "2016-02-21 06:00:00 +0000",
    "2016-02-22 06:00:00 +0000",
    "2016-02-23 06:00:00 +0000",
    "2016-02-24 06:00:00 +0000",
    "2016-02-25 06:00:00 +0000",
    "2016-02-26 06:00:00 +0000",
    "2016-02-27 06:00:00 +0000",
    "2016-03-02 06:00:00 +0000",
    "2016-03-05 06:00:00 +0000",
    "2016-03-07 06:00:00 +0000",
    "2016-03-09 06:00:00 +0000",
    "2016-03-10 06:00:00 +0000",
    "2016-03-11 06:00:00 +0000",
    "2016-03-12 06:00:00 +0000",
    "2016-03-13 06:00:00 +0000",
    "2016-03-15 05:00:00 +0000"
)
kMDItemVersion                 = "9.0.3"
...

在这个列表中,我真的只想查看与 相关的特定条目kMDItemUsedDates。我不知道该条目在任何给定系统上可能有多少行,可能是 1 行,也可能是 32 行。

我将如何处理此输出以便能够仅检索与数组相关的日期戳条目数kMDItemUsedDates?值得注意的是,日期戳本身在此命令输出中并不唯一。

答案1

perl -nE '$c++ if m/^kMDItemUsedDates\s+=\s+\(/..m/^\)/; END { say $c - 2 }'

匹配并递增起始行和结束行之间的计数器,然后打印该计数,减去第一行和最后一行包含的计数。向其提供一个或多个文件或标准输入。

答案2

如果输出将通过管道传输,则以下内容可以对所选行进行计数:

sed -n '/kMDItemUsedDates\s*= (/{:1;n;/)/!{p;b1;};}' | wc -l

变体2:

sed '/kMDItemUsedDates\s*= (/,/)/!d;/[()]/d' | wc -l

相关内容