使用 bash 如何测试输出?

Using bash how can I test for output?

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

这是例子...

/usr/local/bin/myprog --test

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

使用 bash,我如何 grep 输出以便我可以...

  1. 在没有空格的变量中获取产品 ID 输出 (MYPRODUCT123)。
  2. 测试以确保 Product Revision = 384 而不是空白或不同的值。

我试图在 if 语句中将输出通过管道传输到 "grep -q",但我的结果不是最优的,我需要 grep 以获取确切的空格数才能正常工作,并且可能不一致;所以最好在测试输出时去掉所有空格。

如有任何提示,我们将不胜感激。

假设:

  • Product ID 总是在 Product Revision
  • 之前
  • Product IDProduct Revision 只在输出中出现一次
  • 不想担心区分大小写
  • awk 是一个可接受的替代品(对于 grep)[即,使用 awk]
  • 会更容易一些

建议的bash解决方案:

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

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

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

解释:

  • 管道输出到awk
  • awk 配置冒号 (:) 作为输入字段分隔符 (F)
  • tolower([=23=]) 将每个输入行转换为全部小写(仅用于不区分大小写的测试)
  • ~ /product id|product revision/ => 将我们的双小写模式应用于小写输入
  • 如果该行与我们的模式之一匹配,则 print => 打印(第一个)输入字段分隔符 (:) 之后的内容;这应该打印其原始 spelling/capitalization 完整的值(即,不应用 tolower()
  • 此时我们的输出是一个包含两个值的字符串,我们将通过此处字符串 (<<<) 构造将其反馈给我们的变量
  • 将值存储在 prod_idprod_rev (bash) 变量中供以后使用

编辑:

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

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

与初始解决方案相同的解释,添加 BEGIN/ORS=" " 以强制将输出放在一行上(ORS == 输出记录分隔符 => 从默认换行符更改为 space).

能否请您尝试关注并告诉我是否有帮助。

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':| +'作为:或space来制作字段分隔符。然后在一行中搜索字符串 Product ID: 并将其最后一个字段 ($NF) 的值保存到名为 val 的变量中,使用 next 将跳过所有 next 语句。现在提到另一个条件,检查一行是否有产品修订:在它里面,它的字段数是 4(以确保它是产品修订值不为空),如果这个条件为真,那么打印变量 val 的值。

当您执行 echo $value 时,它应该向您显示它的价值,而不显示任何 space。希望对你有帮助。

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