从appache2 accesslog.log文件我试图grep有这个字符串的行:"GET /kiosk/kioskconf.txt HTTP/1.1"
为此,我使用命令:
grep "GET /kiosk/kioskconf.txt HTTP/1.1"
哪个工作正常。 e.g:
19x.25x.22x.5x - - [27/Apr/2015:14:15:50 +0200] "GET /kiosk/kioskconf.txt HTTP/1.1"
有这样的多行,我在每行的开头提取到一个文件只是IP。我也不想在文件中有相同的Ip。 我使用它来提取ip,但它不完整。
sed -n 's/.*194\([^ ]*\).*/\1/p'
显示:
.25x.22x.5x
但是我不会使用整个ip而只是每个不同ip的一个实例并将它们放在一个文件中。
有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
听起来你应该使用awk:
awk '/GET \/kiosk\/kioskconf\.txt HTTP\/1\.1/ && !seen[$1]++ { print $1 }' file
只要模式匹配,就打印第一个字段$1
,但IP地址不在数组seen
中。它还会增加seen[$1]
的值,因此下次发生相同的IP时,条件的第二部分将为false,并且不会打印该行。
/
和.
在正则表达式模式中具有特殊含义,因此必须对它们进行转义。
答案 1 :(得分:0)
您可以使用sort | uniq
命令获取唯一值。
答案 2 :(得分:0)
你可以尝试
grep "GET /kiosk/kioskconf.txt HTTP/1.1" | cut -f1 | sort -u
这将只删除grep
输出中的第一个空格分隔字段(即IP地址),然后对它们进行排序,删除重复项。