模式匹配特殊字符并显示模式之间的内容

模式匹配特殊字符并显示模式之间的内容

我的 apache 日志格式如下

192.168.10.1 <"www.mytest.com"> <-"-"-> <--“192.168.10.90"--> [2020-07-10 03:35:46 PDT] >1008< 2470 3006 "https" <---"GET /content/landingpage.css HTTP/1.1"---> >>200<< 2447 <<"https://www.mytest.com/en/video-landing.html?sessionid=156833130903879801B5H7">> <<-"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"->> "-" <<--"-"-->> "-" <<---"-"--->> <<<"-">>>

我需要运行命令来获取 >>xxx<< 之间的值,即 httpd 状态代码。

我使用了下面的组合,但没有任何效果。

cat access_log | awk -F '[>>]' '{print $2}'

cat access_log | awk -F '">"|^>|>$' '{print $2}'

awk '/\>\>/,/\<\</' access_log

awk '/\^>\>/,/\<\<$/' access_log

谨致问候,KJ

答案1

尝试:

awk -F '>>|<<' '{print $2}' access.log

这将字段分隔符设置为任何一个 >>或。这<<意味着>>xxx<<之前被视为字段分隔符>>xxx之后<<xxx视为字段分隔符。

在您的示例输入中,这将产生200

$ awk -F '>>|<<' '{print $2}' access.log 
200

答案2

如果所需数量介于第一组>>和之间,<<且由数字组成(例如端口号),则可以使用sed基本 REGEX,如下所示:

sed 's/^.*>>\([0-9]*\)<<.*$/\1/1' access.log

或者使用扩展的 REGEX(如果你sed支持的话),例如

sed -E 's/^.*>>([0-9]+)<<.*$/\1/1' access.log

>>ERE 要求和之间出现一个或多个数字<<,但使用 BRE 它将匹配零个或多个数字。

在这两种情况下,/1正常替换形式末尾的指定它应该与模式的第一次出现匹配。

使用您的输入access.log,两者都返回:

200

相关内容