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}'
见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个或更多字符\[
-一个[
char ([^][[:space:]]+)
-组1:除]
,[
和空格[^][]*
-[
和]
以外的任何0个或更多字符\]
-一个]
char [ \t]+
-1+水平空格字符"
-一个"
char ([[:alpha:]]+[ \t]+[^[:space:]]+)
-组2:1+个字母,1+水平空格,然后是除空格.*
-字符串的其余部分。 结果是组1和2值的串联。
关于regex - Awk,仅打印与正则表达式匹配的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59217849/