使用bash如何测试输出?

时间:2017-08-28 22:01:18

标签: bash shell aix

在UNIX(IBM AIX)中,我想编写一个bash脚本来grep命令的输出并测试结果。

以下是示例......

/usr/local/bin/myprog --test

Device Mfg:              IBM
Product ID:              MYPRODUCT123
Product Revision:        384

使用bash,我怎样才能输出输出以便我可以...

  1. 在没有空格的变量中抓取产品ID输出(MYPRODUCT123)。
  2. 测试以确保产品版本= 384而不是空白或不同的值。
  3. 我试图将输出传输到" grep -q"在if语句中,但我的结果是次优的,我需要grep查找其工作的确切空间数,并且可能不一致;因此,在测试输出时,最好去除所有空间。

    任何提示都将不胜感激。

3 个答案:

答案 0 :(得分:1)

假设:

  • Product ID总是在Product Revision
  • 之前
  • Product IDProduct Revision仅在输出中显示一次
  • 不想担心区分大小写
  • awk是可接受的替代品(适用于grep)[即awk}
  • 更容易

提议的bash解决方案:

$ read prod_id prod_rev <<< $(/usr/local/bin/myprog --test | awk  -F: 'tolower($0) ~ /product id|product revision/ {print $2}')

$ echo "prod_id : ${prod_id}"
prod_id : MYPRODUCT123

$ echo "prod_rev : ${prod_rev}"
prod_rev : 384

说明:

  • 管道输出到awk
  • awk配置冒号(:)作为输入字段分隔符(F)
  • tolower($0)将每个输入行转换为全部小写(仅用于不区分大小写的测试)
  • ~ /product id|product revision/ =&gt;对小写输入应用我们的双小写模式
  • 如果该行符合我们的某个模式,则print $2 =&gt;打印(第一个)输入字段分隔符(:)之后的内容;这应该打印原始拼写/大小写完整的值(即,没有应用tolower()
  • 此时我们的输出是一个由两个值组成的字符串,我们将通过here-string(<<<)构造反馈给我们的变量
  • 将值存储在prod_idprod_rev(bash)变量中供以后使用

编辑:

尝试解决有关生成2行输出的awk的评论(如预期的那样),但是bash没有在prod_rev变量中存储值:

read prod_id prod_rev <<< $(/usr/local/bin/myprog --test | awk  -F: 'BEGIN {ORS=" "} tolower($0) ~ /product id|product revision/ {print $2}')

与初始解决方案相同的解释,添加BEGIN/ORS=" "以强制输出放在一行(ORS ==输出记录分隔符=&gt;从默认换行符更改为空格)。 / p>

答案 1 :(得分:0)

如果有帮助,请您试试并告诉我。

value=$(/usr/local/bin/myprog --test | awk -F':| +' '/Product ID:/{val=$NF;next} /Product Revision:/ && NF==4{print val}' Input_file)

说明:创建一个名为value的变量,其值使用$(命令)存储,现在首先运行命令myprog并使用|( pipe)将其输出输出到awk命令作为它的标准输入。

awk命令制作字段分隔符中,将-F':| +'作为:或空格。然后在一行中搜索字符串Product ID:并将其最后一个字段($NF)的值保存到名为val的变量中,使用next将跳过所有next语句。现在提到另一个条件,检查一行是否有Product Revision:在其中,并且它的字段数为4(以确保它是Product Revision值为NOT NULL),如果此条件为TRUE则打印变量值VAL。

执行echo $value时,它应该显示它的值,没有任何空格。我希望这会对你有所帮助。

答案 2 :(得分:0)

awk -F":" '/^Product ID/{id=$2}/^Product Revision/ && $2 == 384{ print id,$2}'  filename