在UNIX(IBM AIX)中,我想编写一个bash脚本来grep命令的输出并测试结果。
以下是示例......
/usr/local/bin/myprog --test
Device Mfg: IBM
Product ID: MYPRODUCT123
Product Revision: 384
使用bash,我怎样才能输出输出以便我可以...
我试图将输出传输到" grep -q"在if语句中,但我的结果是次优的,我需要grep查找其工作的确切空间数,并且可能不一致;因此,在测试输出时,最好去除所有空间。
任何提示都将不胜感激。
答案 0 :(得分:1)
假设:
Product ID
总是在Product Revision
Product ID
和Product 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()
)<<<
)构造反馈给我们的变量prod_id
和prod_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