我的 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