使用 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 输出以便我可以...
- 在没有空格的变量中获取产品 ID 输出 (MYPRODUCT123)。
- 测试以确保 Product Revision = 384 而不是空白或不同的值。
我试图在 if 语句中将输出通过管道传输到 "grep -q",但我的结果不是最优的,我需要 grep 以获取确切的空格数才能正常工作,并且可能不一致;所以最好在测试输出时去掉所有空格。
如有任何提示,我们将不胜感激。
假设:
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([=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_id
和 prod_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
在 UNIX (IBM AIX) 中,我想编写一个 bash 脚本来 grep 命令的输出并测试结果。
这是例子...
/usr/local/bin/myprog --test
Device Mfg: IBM
Product ID: MYPRODUCT123
Product Revision: 384
使用 bash,我如何 grep 输出以便我可以...
- 在没有空格的变量中获取产品 ID 输出 (MYPRODUCT123)。
- 测试以确保 Product Revision = 384 而不是空白或不同的值。
我试图在 if 语句中将输出通过管道传输到 "grep -q",但我的结果不是最优的,我需要 grep 以获取确切的空格数才能正常工作,并且可能不一致;所以最好在测试输出时去掉所有空格。
如有任何提示,我们将不胜感激。
假设:
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([=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_id
和prod_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