Parsing 解析日志并在1个命令中输出2个字符串
上面是我要分析的日志项的类型 我喜欢我的命令输出:Parsing 解析日志并在1个命令中输出2个字符串,parsing,awk,grep,logging,Parsing,Awk,Grep,Logging,上面是我要分析的日志项的类型 我喜欢我的命令输出: 178.139.20.52 - - [26/Nov/2011:08:21:13 +0000] "POST /test/LinkTest.cgi?e=PATTERN&t3=0:010015&t4=1322295671:587875&l=178.139.20.174&n=149 HTTP/1.1" 200 17 "-" "BOT/1.26" 你知道如何实现这一目标吗 多谢各位 谢谢你的回答,我将这样做: 178.1
178.139.20.52 - - [26/Nov/2011:08:21:13 +0000] "POST /test/LinkTest.cgi?e=PATTERN&t3=0:010015&t4=1322295671:587875&l=178.139.20.174&n=149 HTTP/1.1" 200 17 "-" "BOT/1.26"
你知道如何实现这一目标吗
多谢各位
谢谢你的回答,我将这样做:
178.139.20.52 PATTERN
使用GNU
sed
这种方法怎么样
cat access_log | grep "LinkTest.cgi" | grep "26\/Nov\/2011" | awk -v FS="[ =&]" '{ print $1,$8 }' | sort -u
使用awk:
“infle”的内容
sed -r 's/^(\S+).*e=([^&]+)&.*/\1 \2/'
我的linux机器中的Awk命令:
178.139.20.52 - - [26/Nov/2011:08:21:13 +0000] "POST /test/LinkTest.cgi?e=PATTERN&t3=0:010015&t4=1322295671:587875&l=178.139.20.174&n=149 HTTP/1.1" 200 17 "-" "BOT/1.26"
结果:
awk 'BEGIN { FS = "=" } { ip = substr( $1, 0, index( $1, " " ) - 1 ); pattern = substr( $2, 0, index( $2, "&" ) - 1 ); printf "%s %s\n", ip, pattern }' infile
使用
awk
注意-如果您的模式
不包含=
、空格
或&
,则此选项有效
awk-vfs=“[=&]”“{print$1,$8}”文件
178.139.20.52 PATTERN
我认为grep不适合这种情况,它只根据模式过滤行。您可以使用
-o
开关仅打印与该模式匹配的文本,但我不知道如何在grep中提取/打印多个子字符串
这个perl单行程序怎么样
perl-ne'm/^\s*(\d++.\d++.\d++.+?\?e=([^&]++)并打印“$1$2\n”
这个问题似乎没有明确说明,因为我们不知道模式中可以包含什么。这是一个起点:
[jaypal:~/Temp] cat file
178.139.20.52 - - [26/Nov/2011:08:21:13 +0000] "POST /test/LinkTest.cgi?e=PATTERN&t3=0:010015&t4=1322295671:587875&l=178.139.20.174&n=149 HTTP/1.1" 200 17 "-" "BOT/1.26"
[jaypal:~/Temp] awk -v FS="[ =&]" '{ print $1,$8 }' file
178.139.20.52 PATTERN
echo‘178.139.20.52模式’(瞧,你的问题没有完全说明。)这一个工作得很好,我确实对文件进行了cat。cat access|u log | grep“LinkTest.cgi”| grep“26\/Nov\/2011”| awk-vfs=“[=&]”“{print$1,$8}”sort-uI认为您可以通过cat
和grep
,只需简单地执行awk-vfs=“[=&]”26\/Nov\/2011/{print$1,$8}访问日志{sort-u
sort-u
或uniq
任何最适合的操作即可,我得到:95.127.96.131 HTTP/1.1“95.169.240.22模式,但我会找出它。你能把那行粘贴在这里,让我看一下吗?
sed -e 's/ .*LinkTest.cgi?e=/ /' -e 's/&.*//'