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

时间:2017-10-19 09:42:18

标签: 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

感谢。

2 个答案:

答案 0 :(得分:1)

一种方式:

测试文件:

$ 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"第3栏是" A"。

答案 1 :(得分:0)

只需 grep 即可:

grep -E -v 'xxx\s+IN\s+A' file

要摆脱多个空行,将其输入:

cat -s

将它们放在bash脚本中:

$ cat test.sh
#!/bin/bash

grep -E -v 'xxx\s+IN\s+A' $1 | cat -s

并将其命名为:

./test.sh file