如何在shell中检查我之前的Linux命令输出的每一行

时间:2014-12-13 10:01:34

标签: shell

我有一个脚本,我使用ssh在远程机器中运行命令,输出如下:

admin@dear:~/>: mccli checkpoint show

0,23000,CLI command completed successfully.

Tag                  Time                       Validated   Deletable    
.................    .......................    .........   .............

cp.20141212170053    2014-12-12 09:00:53 PST    Validated   No    
cp.20141212170337    2014-12-12 09:03:37 PST                No

现在,我必须接受此输出,并且需要在Tag列中为已验证列中具有" "(无条目)的值选择值。这样我就可以使用该标记值执行操作。这里第二行没有验证列下的条目。我会尝试将输出更清晰: 在第一行,

cp.20141212170053 - 1st column value (under Tag)    
2014-12-12 09:00:53 PST - 2nd column value (under Time)    
Validated - 3rd column value (under Validated)    
No - 4th column value (under Deletable)

我尝试将整个输出转换为数组并检查相同的内容。 但是,我无法继续前进。我正在失去完成这项工作的逻辑。

如何检测这些线?

3 个答案:

答案 0 :(得分:0)

您可以使用此awk命令:

mccli checkpoint show | awk -F ' {2,}' '/ PST/ && $(NF-2) != "Validated"{print $1}'
cp.20141212170337
  • 它将输入字段分隔符视为2个或更多空格。
  • 由于时间总是在PST,因此只检查时区名称。

如果您不想检查价值Validated,那么您也可以使用:

awk -F ' {2,}' '/ PST/ && NF<4{print $1}'

答案 1 :(得分:0)

这是做同样事情的sed版本:

mccli checkpoint show | sed -rne '/^(cp.[0-9]+).*Validated.*$/ !{s/^(cp.[0-9]+).*$/\1/p}'

/^(cp.[0-9]+).*Validated.*$/此部分搜索以cp.开头并包含Validated的行。使用!,我们可以在没有该模式的行上运行{s/^(cp.[0-9]+).*$/\1/p}。所以实际上下面的行被处理但它们不是以cp.[0-9]+开头,所以不打印。检查this了解如何使用sed。

0,23000,CLI command completed successfully.

Tag                    Time     Validated   Deletable    
................. ......................  ............  .............
cp.20141212170337    2014-12-12 09:03:37 PST                No

答案 2 :(得分:0)

我不清楚你是否要保留标题行,所以我要丢弃它们(NR> 6)。一些非常简单的解决方案是:

mccli ... | awk 'NR>6 && NF<6'
mccli ... | awk 'NR>6 && !/Validated/'

如果您想保留标题行,请将&&更改为||