我有一个具有以下格式的日志文件:
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
$
所有这些行都按原样被删除。