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

Script Shell: grep specific lines - extract specific strings - put them on a file

从 appache2 accesslog.log 文件我试图 grep 有这个字符串的行:"GET /kiosk/kioskconf.txt HTTP/1.1"

为此,我使用命令:

grep "GET /kiosk/kioskconf.txt HTTP/1.1"

效果很好。例如:

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\([^ ]*\).*//p'

显示:

.25x.22x.5x

但我不会将整个 ip 和每个不同 ip 的一个实例放在一个文件中。

有人可以帮我整理一下吗?

听起来你应该使用 awk:

awk '/GET \/kiosk\/kioskconf\.txt HTTP\/1\.1/ && !seen[]++ { print  }' file

只要模式匹配但 IP 地址不在数组 seen 中,就会打印第一个字段 </code>。它还会增加 <code>seen[] 的值,因此下次出现相同的 IP 时,条件的第二部分将为 false,并且不会打印该行。

/.在正则表达式模式中有特殊含义,必须进行转义。

您可以使用 sort | uniq 命令获取唯一值。

你可以试试

grep "GET /kiosk/kioskconf.txt HTTP/1.1" | cut -f1 | sort -u

这将只删除 grep 输出中除第一个 space 分隔字段以外的所有字段(即 IP 地址),然后对它们进行排序,删除重复项。