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