【问题标题】:Awk, print only patterns that match the regular expressionawk,只打印匹配正则表达式的模式
【发布时间】:2019-12-06 17:33:24
【问题描述】:
  • 例如我有这个字符串:
 10.1.2.194 (197.84.211.148) - - [08/Oct/2015:09:01:44 +0000] "GET /merlin-web-za/web/images/refinements/loader.gif HTTP/1.1" 200 4178 0 1868 "http://www.autotrader.co.za/makemodel/make/chevrolet/model/aveo/caryearrangeszar/2012/search?sort=PriceAsc&locationName=Cape%20Town&latitude=-33.92584&longitude=18.42322&county=Western%20Cape" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" "ajp://10.1.4.66:8009"

我需要修改:

08/Oct/2015:09:01:44 GET /merlin-web-za/web/images/refinements/loader

我如何使用 awk 或 egrep 来做到这一点? - 我尝试了下面的命令,但是第一个命令的结果显示了包含两个跟随模式的完整字符串

awk ' /08/Oct/2015:09:[0-9]{2}:[0-9]{1,2}/ && /GET (/[a-z0-9-]{1,}){1,3}/'

cat file | egrep -o "08/Oct/2015:09:[0-9]{2}:[0-9]{1,}.* GET (/[a-z0-9-]{1,}){1,}"

填补了上述模式之间的空白,结果我可以看到:

08/Oct/2015:09:01:44 +0000] "GET /merlin-web-za/web/images/refinements/loader

这不是我想要得到的

【问题讨论】:

  • 试试awk '{a=$5" "$7" "$8; gsub(/[]["]|\.[^.]*$/, "", a); print a}'
  • 看来你的预期输出需要修改,如果你真的想获得08/Oct/2015:09:01:44 GET /merlin-web-za/web/images/refinements/loader.gif,而不是08/Oct/2015:09:01:44 GET /merlin-web-za/web/images/refinements/loader,请检查并告知

标签: regex linux bash awk grep


【解决方案1】:

你可以使用

awk '{a=$5" "$7" "$8; gsub(/[]["]|\.[^.]*$/, "", a); print a}'

online demo

详情

默认字段分隔符 - 空格 - 用于将行拆分为字段。

  • a=$5" "$7" "$8; - 通过使用空格连接字段 5、7 和 8 创建一个变量
  • gsub(/[]["]|\.[^.]*$/, "", a) - 删除字符串末尾的 []". + 除 . 之外的任何 0+ 字符
  • print a - 打印结果。

但是,您发送给我的文件在第一个括号内包含逗号+空格分隔的 IP 地址。你可以使用

sed -E -n 's/^[^][]*\[([^][[:space:]]+)[^][]*\][ \t]+"([[:alpha:]]+[ \t]+[^[:space:]]+).*/\1 \2/p' access_log > newfile

得到你想要的结果,即time + Get/post +URL

详情

  • ^ - 匹配字符串的开头
  • [^][]* - 除 [] 之外的任何 0 个或多个字符
  • \[ - 一个 [ 字符
  • ([^][[:space:]]+) - 第 1 组:除 ][ 和空格之外的 1+ 个字符
  • [^][]* - 除 [] 之外的任何 0 个或多个字符
  • \] - 一个 ] 字符
  • [ \t]+ - 1+ 个水平空白字符
  • " - 一个 " 字符
  • ([[:alpha:]]+[ \t]+[^[:space:]]+) - 第 2 组:1+ 个字母、1+ 个水平空格,然后是 1+ 个除空格以外的字符
  • .* - 字符串的其余部分。

结果是第 1 组和第 2 组值的串联。

【讨论】:

猜你喜欢
  • 2011-07-29
  • 2014-09-15
  • 2022-10-17
  • 2015-02-24
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
相关资源
最近更新 更多