如何从后台进程的输出中执行grep操作以验证结果?
嗨,我来帮你搞定这个问题!根据你给出的脚本和输出场景,咱们可以通过几种实用的方式用grep从应用输出里提取信息做验证,下面具体说说:
方案1:把后台进程输出存到日志文件,事后提取分析
因为你用&把app1和app2放到后台运行,它们的输出可能会直接打到终端或者混在一起,先把输出定向到独立日志文件会更清晰:
修改你的script1.sh:
#!/bin/sh # 将app1的标准输出和错误输出都重定向到app1.log app1 > app1.log 2>&1 & # 同样处理app2的输出 app2 > app2.log 2>&1 &
之后就可以用grep精准提取信息了:
- 提取app1的完整匹配行:
grep -o 'app1 -> ".*"' app1.log
- 如果只想提取引号里的核心内容(比如要验证是不是"App1"),用Perl兼容正则会更方便:
grep -oP 'app1 -> "\K[^"]+' app1.log
这里-o表示只输出匹配到的部分,-P启用Perl正则,\K用来忽略前面的app1 -> ",直接取引号内的字符串。app2的提取方式完全同理,把命令里的app1换成app2就行。
方案2:实时监控输出并做验证
如果不需要等进程结束,想实时捕获输出做验证,可以结合tail -f和grep:
比如启动app1后立刻实时监控:
app1 > app1.log 2>&1 & # 实时跟踪日志并提取目标内容 tail -f app1.log | grep -oP 'app1 -> "\K[^"]+'
只要app1输出了目标内容,终端会立刻显示引号里的字符串,适合需要即时验证的场景。
方案3:处理混合输出的情况
要是不想分开存日志,两个应用的输出都放到同一个文件里,也能分别提取:
修改脚本把所有输出合并到一个日志:
#!/bin/sh # 把app1和app2的输出都定向到combined.log { app1 & app2 & } > combined.log 2>&1 wait # 等待两个进程都运行结束
之后分别提取两个应用的信息:
# 提取app1的内容 grep -oP 'app1 -> "\K[^"]+' combined.log # 提取app2的内容 grep -oP 'app2 -> "\K[^"]+' combined.log
额外技巧:自动完成验证判断
如果要自动验证提取的内容是否符合预期(比如确认app1输出的是"App1"),可以把提取结果和预期值做对比:
# 提取app1的输出内容 app1_result=$(grep -oP 'app1 -> "\K[^"]+' app1.log) # 判断是否符合预期 if [ "$app1_result" = "App1" ]; then echo "✅ App1验证通过!" else echo "❌ App1验证失败,实际输出为:$app1_result" fi
这样就能自动完成验证流程啦。
内容的提问来源于stack exchange,提问作者Sucheta
相关产品推荐
相关产品推荐

