繁体   English   中英

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

[英]Removing specific lines from file using bash script

我有一个包含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”的那些行。

只需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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM