【问题标题】:grep with regex printing only match带有正则表达式打印的 grep 仅匹配
【发布时间】:2020-03-10 13:44:36
【问题描述】:

0

我制作了我的正则表达式,它在我的正则表达式制作工具上完美运行。但是当我尝试在命令行中使用我的正则表达式时它不起作用,或者至少我似乎无法使用它。

我的正则表达式是:

.*\[(GET|POST|OPTIONS|PUT|DELETE)\].*

无论在哪里,它都匹配调用方法我希望它显示在一个包含所有调用的简单文件中。

我尝试了很多命令,其中之一是:

cat myfile.txt |  awk /'\[(GET|POST|OPTIONS|PUT|DELETE)\]/ {print $1}'

但它返回我第一列,虽然匹配组 1 是方法。

谁能帮帮我?

如果需要,我可以提供一个例子。

例子:

两种可能的输入:

32.45.53.01、32.32.32.543、21.32.54.675、21.32.54.779 161.21.34.56 [10/Mar/2020:13:04:14 +0100] [HTTP/1.1] [GET] [-://yahoo.com/webapp/wcs/stores/servlet/libero/home] 302 - EL=[22ms, -] WAS=[mediaworld_b2c:3213] - WAS=[-] - - [垃圾邮件]

10.40.23.483 10.8.21.321 [10/Mar/2020:15:18:06 +0100] [HTTP/1.1] [GET] [-://google-preprod.test.com/sda/v1/ticrcv /TSY-JKidsahjsdaAO-A-JYVS5gGFxZ8PY8J-GRs0g-GOB2C] 200 108 EL=[17ms, -] WAS=[-] - -

两种情况下的输出都必须是:

获取

【问题讨论】:

  • awk 命令{print $1} 不用于打印第一个匹配项。变量 $1 是 awk 记录拆分产生的第一个字段。

标签: regex grep


【解决方案1】:

不确定我是否理解,但这是你想要的吗?

grep -oE '\[(GET|POST|OPTIONS|PUT|DELETE)\]' myfile.txt

【讨论】:

  • 感谢您的回答。我有点想要这样的东西,但是这个命令不仅仅打印方法。它打印了很多列,我不明白为什么
  • @topolino:请编辑您的问题并添加一些输入行和预期结果。
【解决方案2】:

Toto 的答案似乎符合您的需求。因此,有关信息,在 awk 中 $1 指的是行上的第一个输入字段(如 dawg 指出的那样),并且不支持反向引用。但是,如果您有 GNU awk,那么您可以使用支持附加参数的 match 函数以这种方式存储捕获:

awk 'match($0, /\[(GET|POST|OPTIONS|PUT|DELETE)\]/, a) { print a[1] }' myfile.txt

【讨论】: