这:
cat /var/log/apache2/other_vhosts_access.log |grep -m 1 123.123.123.123
给我第一次出现的 IP 123.123.123.123。
但是如何获得IP1第一次出现的情况和IP2 第一次出现和IP3第一次出现和...?
这显然行不通,但它给出了这样的想法:
cat /var/log/apache2/other_vhosts_access.log |grep -m 1 123.123.123.123 AND 124.124.124.124 AND 125.125.125.125
答案1
我将使用 awk 来执行此操作(假设 ip 是第一列):
awk '!seen[$1]++ && $1 ~ /123.123.123.123|124.124.124.124|125.125.125.125/' /var/log/apache2/other_vhosts_access.log
答案2
请注意,这grep '123.123.123.123'
不会给您第一次出现的情况123.123.123.123
知识产权,但是123.123.123.123
匹配 on123.123.123.123
但也匹配的模式的1234123-123e123
as.
是匹配任何单个字符的正则表达式运算符。
只会123\.123\.123\.123
匹配 on123.123.123.123
但请注意,也会匹配23\.123\.123\.1
。另请参阅用于固定字符串匹配-F
的选项。grep
在这里,我会这样做:
awk '
!ips_seen {ip[$0]; n++; next}
{
found = 0
for (i in ip)
if (index($0, i)) {
found = 1
delete ip[i]
n--
}
}
found
!n {exit}' ips.txt ips_seen=1 input.txt
其中ips.txt
包含 IP 地址列表,每行一个。
请注意,我们会注意如果一行包含多个 IP,它仍然只打印一次。
通过使用index()
仅查找子字符串,我们可以解决上面.
匹配任何字符的第一个问题,但不能解决第二个问题。