linux - 使用 bash 脚本从文件中删除特定行

标签 linux bash sed

我有一个包含 DNS 区域条目的输入文件

; whatever.foo [000000]
$ORIGIN whatever.foo.
$TTL 8400
@       IN      SOA     ns1.whatever.foo.      admin.whatever.foo. (
2017101913 ; serial number
                    21600                    ; refresh
                    8400                     ; retry
                    1209600                 ; expire
                    8400                    ; ttl
                    )

xxx           IN    A    000.000.000.000
something-xxx IN    A    000.000.000.000
other-xxx     IN    A    000.000.000.000
else.xxx      IN    A    000.000.000.000

yyy           IN    A    000.000.000.001
something-yyy IN    A    000.000.000.001
other-yyy     IN    A    000.000.000.001
else.yyy      IN    A    000.000.000.001

如何删除属于 xxx 子域的条目?

输出应该是

; whatever.foo [000000]
$ORIGIN whatever.foo.
$TTL 8400
@       IN      SOA     ns1.whatever.foo.      admin.whatever.foo. (
2017101913 ; serial number
                    21600                    ; refresh
                    8400                     ; retry
                    1209600                 ; expire
                    8400                    ; ttl
                    )

yyy           IN    A    000.000.000.001
something-yyy IN    A    000.000.000.001
other-yyy     IN    A    000.000.000.001
else.yyy      IN    A    000.000.000.001

我希望它在 bash 脚本中,这样我就可以调用例如

delete_domain.sh xxx

谢谢。

最佳答案

一种方式:

测试文件:

$ cat file
xxx           IN    A    000.000.000.000
else.xxx      IN    A    000.000.000.000
something-xxx IN    A    000.000.000.000
other-xxx     IN    A    000.000.000.000
abc           IN    A    000.000.000.000
$

模式文件:

$ cat patterns
xxx
something-xxx
other-xxx
else.xxx
$

Awk 选项:

$ awk 'NR==FNR{a[$1];next}!(($1 in a) && $2=="IN" && $3=="A")' patterns file
abc           IN    A    000.000.000.000
$

首先我们将所有要删除的模式加载到关联数组 a 中。然后在处理测试文件时,只打印第一列不是模式的一部分,第二列是“IN”,第三列是“A”的那些行。

关于linux - 使用 bash 脚本从文件中删除特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46827026/

相关文章:

linux - sudoers 文件 linux 中的注释行

regex - sed 模式为 "1.2"、 "1.2.3"、 "1.2.3.4"、 "1.2.3.4.5"、 …

linux - 通过bash查找特定文件的数量

linux - 将 bash 变量作为模式传递给 awk

bash - 用于从区域中删除空格的 SED 脚本

bash - 如何保持两个文件夹自动同步?

linux - 写入要求输入密码的标准输入

linux - 查找文件夹和子文件夹中所有文件的替代方法

linux - 选择linux上两个版本的gcc作为非管理员

c++ - GCC 中的模板实例化与 Visual C++ 不同