脚本Shell:grep特定行 - 提取特定字符串 - 将它们放在一个文件中

时间:2015-04-30 10:01:57

标签: linux bash shell sed grep

从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的一个实例并将它们放在一个文件中。

有人可以帮我解决这个问题吗?

3 个答案:

答案 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地址),然后对它们进行排序,删除重复项。