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/&.*//'