如何逐行读取curl流输出并按匹配的不同关键词执行对应操作
你设想的while循环逐行处理curl输出的方案完全可行,仅需要启动1次curl进程即可完成所有关键词匹配和对应逻辑触发,避免了多进程重复请求接口的资源浪费。
完整可运行脚本示例
#!/bin/bash # 禁用curl输出缓冲,保证日志实时流入后续处理逻辑 curl --no-buffer "https://theurl.events/logs" 2>&1 | while IFS= read -r line do # 按优先级匹配关键词,匹配到后执行对应脚本 if [[ "$line" == *"Error"* ]]; then # 可将当前行内容作为参数传给脚本,在脚本内通过$1读取 ./runbash1.sh "$line" elif [[ "$line" == *"WrongOperation"* ]]; then ./runbash2.sh "$line" elif [[ "$line" == *"WrongButton"* ]]; then ./runbash3.sh "$line" fi done
注意事项
- 必须给curl加
--no-buffer(部分curl版本对应参数为-N)参数,默认curl会累积一定量输出后才会向下游管道传递,会导致日志处理延迟 - 如果要避免误匹配日志data字段里的关键词,可以把匹配规则写得更精准,比如匹配action行的话改为
[[ "$line" == "action=Error,"* ]],只会匹配行首为action=Error,的日志行,不会匹配到data里包含对应关键词的内容 - 如果后续需要新增匹配规则,仅需在循环内新增
elif分支即可,维护成本极低 - 若需要对日志内的字段做更复杂的提取判断,可在判断分支内对
$line做文本切割、正则匹配等操作 - 脚本编写完成后执行
chmod +x log_monitor.sh即可运行,需要后台常驻的话可搭配nohup、systemd等方式托管
内容的提问来源于stack exchange,提问作者olo
相关产品推荐
相关产品推荐

