【问题标题】:Detecting whenever a file contains string X but not string Y on different lines检测文件何时在不同行包含字符串 X 但不包含字符串 Y
【发布时间】:2018-07-08 07:30:48
【问题描述】:

问题:

我想确保某个字符串出现在文件中,并且另一个字符串出现在文件中。如果两个条件都满足,命令应该会产生一些输出。

这是我开始的:

我有一个 cronjob,它会定期下载带有 curl 的网页。 每当某个文本 ("inStock':'True") 出现在该网页的一行中时,我希望得到通知。这部分很简单,效果很好。这是我使用的 cronjob:

curl --silent --cookie "myStore=true; storeSelected=131; ipp=25; SortBy=match; rearview=501552" http://www.microcenter.com/product/501552/AIY_VISION_KIT | grep "inStock':'True"

因为这是作为 cronjob 运行的,所以每当“grep”产生任何输出(例如“'inStock':'True',”)时,我都会收到一封电子邮件。

现在又出现了一个问题:如果文本(“此产品不再可用”)出现在网页的另一行上,我不想毕竟要通知。

有什么好的解决办法吗?不一定是 grep,awk 或 perl 也可以。

这是一个示例文件example.txt,我们可以使用它来代替特定的网页和 curl:

This product is no longer available
'inStock':'True',

所以如果我跑

cat example.txt | grep "inStock: 'true"

它会输出

inStock: 'true'

无论文件中的其他行是什么。我想要的是一个命令(或多个命令),如果文件中的另一行包含文本“此产品不再可用”,则不会产生输出。

【问题讨论】:

  • 请在你的问题更清楚,因为它根本不清楚。
  • 查看How to Ask,然后更新您的问题以包含缺少的minimal reproducible example,以便人们可以帮助您。
  • 我更改了问题以包含我的具体问题。而且我有一个不太好的示例解决方案。
  • 尽管如此,您仍然没有提供缺失的样本输入和预期输出。您需要一个工具,其输入是 curl 的输出,其输出是 some output 以放入电子邮件中。因此,请向我们展示一个简洁、可测试的示例,其中包含 curl 的输出示例(即您要编写的工具的输入)以及您希望该工具在给定该输入的情况下产生的输出。
  • @EdMorton 好的,我提供了一个示例文件,而不是依赖 curl。

标签: bash shell curl awk grep


【解决方案1】:

我想出了这个 awk 脚本,我用curl 将网页导入。这有点难看,所以我希望我能从其他人那里得到更好的答案。

所以我希望字符串“不再可用”不存在,但我确实希望“inStock”行存在。我不知道它们会以什么顺序出现在文件中。

这是脚本:

awk '/no longer available/ { a=1 } /inStock/ { b=1} END{ if(!a && b) { print("conditions matched")} }'

我想使用多行 grep 匹配也是一种选择。它可能会占用大量内存。由于我不知道字符串在网页中出现的顺序,所以也会很复杂。

【讨论】:

  • 您拥有的是正确的方法。如果有问题,您可以在a=1 之后添加; exit 以提高效率。
  • 好主意。它仍将执行 END 块,但不再需要处理其余的输入。
  • 对。您提到了进行多行 grep 匹配的可能性 - 没有这样的事情,虽然您可以使用 awk 以各种方式做到这一点,但您是对的,它可能会占用大量内存,而且当您已经拥有的东西很简单时,真的没有意义、高效、便携等。
  • Here 是多行 grep 的示例。它不适用于所有版本的 grep,但 gnu grep(这是我使用的)支持它并且可以广泛使用。
  • 啊,一个 GNU 主义。我不知道是谁在破解 GNU grep 但我希望他们能齐心协力——这完全没用,然后他们投入 -P 并声明它是“高度实验性的”(说真的——参见手册页) 所以当它核心转储时,他们可以说“啊,很好”,然后当有一个名为“find”的非常好的工具可以执行此操作时,他们会添加选项来查找文件。他们已经把 GNU grep 变成了一个大而复杂的废话,完全违背了每个工具都做好一件事的 UNIX 方法。
猜你喜欢
  • 2018-09-06
  • 2019-04-22
  • 2020-09-01
  • 2016-05-06
  • 2013-10-26
  • 1970-01-01
  • 2020-02-14
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多