如何实现检测文件含指定字符串X且不含Y时输出内容?
解决方案:满足双条件的文本检测命令
我来给你几个实用的方案,完美适配你的cron任务需求——只有当网页包含inStock':'True且不包含This product is no longer available时才输出内容(这样cron才会触发邮件通知),否则无输出:
方法1:用grep + Shell条件判断(简单直观)
这个方法逻辑清晰,适合快速修改现有脚本:
curl https://your-target-url.com | if ! grep -q "This product is no longer available"; then grep "inStock':'True"; fi
逻辑说明:
grep -q:静默匹配,只返回状态码不输出内容,用来检查是否存在不可用文本! grep -q ...:表示如果没有找到不可用文本,才执行后面的grep "inStock':'True"- 只有当双条件都满足(无不可用文本 + 有库存标记)时,才会输出匹配到的
inStock行,否则无输出
方法2:用awk一次性处理(高效省资源)
如果网页内容较大,awk只需要遍历一次内容,比两次grep更高效:
curl https://your-target-url.com | awk '{ # 标记是否出现不可用文本 if (/This product is no longer available/) { unavailable = 1 } # 标记是否找到库存标记 if (/inStock'\''True/) { instock = 1 } } END { # 最后判断双条件,满足则输出自定义内容(也可以输出匹配行) if (instock && !unavailable) { print "Product is in stock and available!" } }'
优势:
- 不管
inStock和不可用文本是否在同一行,都能准确判断全局状态 - 可以自定义输出内容,比如输出更明确的提示语,方便邮件里快速看结果
方法3:用perl处理全局匹配(灵活强大)
perl的全局匹配能力可以轻松处理整个网页内容:
curl https://your-target-url.com | perl -0777 -ne 'print "In stock and available!\n" if /inStock'\''True/ && !/This product is no longer available/'
说明:
-0777:让perl把整个输入内容当作一个单一字符串处理(避免行匹配的局限)- 直接用逻辑判断同时检查两个条件,满足则输出内容
测试验证
用你的example.txt测试时,执行如下命令应该无任何输出:
cat example.txt | # 替换成上面任意一种方法的命令部分
内容的提问来源于stack exchange,提问作者neuhaus
相关产品推荐
相关产品推荐

