从特定列中删除包含 IP 范围的行,同时排除范围

从特定列中删除包含 IP 范围的行,同时排除范围

我有一个具有以下格式的日志文件:

Jul 13 21:47:41 192.168.100.254 "user from 192.168.100.101"

我需要删除包含 192.168.xx 范围内的 IP 的所有行,但前提是它们出现在第四列中。

我还需要从 192.168.xx 范围中排除 3 个 IP。让我们称这些为

192.168.125.100
192.168.126.100
192.168.155.240 

如何完成此命令以查找第 4 列 192.168.xx 范围内的所有 IP,并删除除包含 192.168.125.100、192.168.126.100 和 192.168.155.240 的行之外的所有行。

awk '{print $4}' file | grep '192.168' | "remove all found except" | > save back to original file

答案1

尝试:

awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file

例子

考虑这个测试文件:

$ cat file
Jul 13 21:47:41 192.168.100.254 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.125.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.126.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.155.240 "user from 192.168.100.101"
Jul 13 21:47:41 123.456.789.240 "user from 192.168.100.101"

据我了解您的规则,您希望保留除上面第一行之外的所有内容。

$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file
Jul 13 21:47:41 192.168.125.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.126.100 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.155.240 "user from 192.168.100.101"
Jul 13 21:47:41 123.456.789.240 "user from 192.168.100.101"

多行版本

对于那些喜欢将代码分散在多行中的人:

awk '
  {
    f=1
  }

  $4 ~ /^192.168/ {
    f=0
  }

  $4 ~ /192.168.(125.100|126.100|155.240)/ {
    f=1
  }

  f
  ' file

怎么运行的

该代码使用单个变量f。如果要保留一条线,我们设置f=1。否则,f设置为零。

  • f=1

    首先,假设应保留该行。

  • $4 ~ /^192.168/{f=0}

    如果$4以 开头192.168,则将该行标记为我们应该丢失的行。

  • $4 ~ /192.168.(125.100|126.100|155.240)/{f=1}

    对于这三种特殊情况,将该行标记为 keeper:f=1

  • f

    这是 awk 的神秘简写:如果f为真(非零),则打印该行。

额外测试

根据评论,我们将尝试 file2:

$ cat file2
Jul 13 21:47:41 192.168.100.125 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.202.150 "user from 192.168.100.101"
Jul 13 21:47:41 192.168.101.45 "user from 192.168.100.101"

现在,让我们运行我们的命令:

$ awk '{f=1} $4 ~ /^192.168/{f=0} $4 ~ /192.168.(125.100|126.100|155.240)/{f=1} f' file2
$ 

所有这些行都按原样被删除。

相关内容