【问题标题】:Shell Script - UnixShell 脚本 - Unix
【发布时间】:2014-07-01 09:54:16
【问题描述】:
grep "<ValidateXYZResponse" filename.log* | grep -v "<ResponseCode>000<ResponseCode>"

上述命令在 UNIX 中运行良好,其中 grep -v 排除了响应代码为“000”的记录

但是,除了“000”,我还需要排除以下响应代码:“404”、“410”、“403”、“406”

我是 unix shell 脚本的新手。

如果有人知道怎么做,请帮忙。感谢你的帮助。 谢谢。

【问题讨论】:

  • 阅读一些关于正则表达式的基本文档。有一种叫做交替的东西。
  • 这个问题似乎是题外话,因为它是关于不愿意 RTFM。
  • @devnull - 我肯定会学习基础知识。在这里提出问题是因为我必须快速发送一些报告,这是我第一次使用 unix shell 脚本。
  • 仅当您愿意 RTFM 时,它所花费的时间要比收到第一个答案的时间少得多。祝你好运!

标签: regex shell unix


【解决方案1】:

您可以使用(foo|bar|blah) 在正则表达式中实现OR。喜欢:

grep ...|grep -v '<...>\(000\|40[346]\|410\)<...>'

grep ...|grep -vE '<...>(000|40[346]|410)<...>'

关于正则表达式的详细解释:

http://www.regular-expressions.info/alternation.html

【讨论】:

  • 感谢您的回答@Kent!
【解决方案2】:
grep "<ValidateXYZResponse" filename.log* | grep -Pv "<ResponseCode>(?:000|40[346]|410)<ResponseCode>"
  • 中间的(?:000|40[346]|410) 非捕获组给出了要排除的代码列表
  • | 是交替 (OR) 运算符
  • [346] 表示346 的一个字符

【讨论】:

  • grep -P(对于 perl regexen?)是许多 grep 实现不支持的 GNUism。 grep -E 更便携。
  • 感谢您的回答@zx81!