使用 grep 查找每个模式的第一次出现

使用 grep 查找每个模式的第一次出现

这:

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-123e123as.是匹配任何单个字符的正则表达式运算符。

只会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()仅查找子字符串,我们可以解决上面.匹配任何字符的第一个问题,但不能解决第二个问题。

相关内容