Linux Awk跳过空行
我有一个文本文件中的数据。需要转换成一个模板 data.txtLinux Awk跳过空行,linux,vim,awk,Linux,Vim,Awk,我有一个文本文件中的数据。需要转换成一个模板 data.txt * A 11.22.33.44 mail A 11.22.33.44 domain1.com A 11.22.33.44 ftp CNAME domain1.com www CNAME domain1.com domain1.com MX mail.domain1.com * A 55.66.77.88 mail A 55.66.77.88 domain2.c
* A 11.22.33.44
mail A 11.22.33.44
domain1.com A 11.22.33.44
ftp CNAME domain1.com
www CNAME domain1.com
domain1.com MX mail.domain1.com
* A 55.66.77.88
mail A 55.66.77.88
domain2.com A 55.66.77.88
ftp CNAME domain2.com
www CNAME domain2.com
domain2.com MX mail.domain2.com
通过此vim
命令运行它
:g/NS/d | :%s/CNAME/cnamerecord/g | :%s/A/arecord/g | :%s/MX/mxrecord/g
将其更改为:
arecord * 11.22.33.44
arecord mail 11.22.33.44
arecord domain1.com 11.22.33.44
ftp cnamerecord domain1.com
www cnamerecord domain1.com
domain1.com mxrecord mail.domain1.com
arecord * 55.66.77.88
arecord mail 55.66.77.88
arecord domain2.com 55.66.77.88
ftp cnamerecord domain2.com
www cnamerecord domain2.com
domain2.com mxrecord mail.domain2.com
现在我运行一个AWK命令
cat data.txt |
awk '{if ($2 == "arecord") print $2 " " $1 " " $3}
{if ($2 == "cnamerecord") print $2 " " $1 "." $3 " " $3}
{if ($2 == "mxrecord") print $2 " " $1 " " $3}'
输出如下:
arecord * 11.22.33.44
arecord mail 11.22.33.44
arecord domain1.com 11.22.33.44
cnamerecord ftp.domain1.com domain1.com
cnamerecord www.domain1.com domain1.com
mxrecord domain1.com mail.domain1.com
arecord * 55.66.77.88
arecord mail 55.66.77.88
arecord domain2.com 55.66.77.88
cnamerecord ftp.domain2.com domain2.com
cnamerecord www.domain2.com domain2.com
mxrecord domain2.com mail.domain2.com
现在,这里有两个问题:
问题1也是我最头疼的问题:如何保持数据之间的空间。文件中有一个空白行我想保留
问题2(加分):在我的AWK代码中,我希望arecord显示如下:
arecord *.domain1.com 55.66.77.88
arecord mail.domain1.com 55.66.77.88
arecord domain1 55.66.77.88
不是:
最终的理想输出如下所示
arecord *.domain1.com 11.22.33.44
arecord mail.domain1.com 11.22.33.44
arecord domain1.com 11.22.33.44
cnamerecord ftp.domain1.com domain1.com
cnamerecord www.domain1.com domain1.com
mxrecord domain1.com mail.domain1.com
arecord *.domain2.com 55.66.77.88
arecord mail.domain2.com 55.66.77.88
arecord domain2.com 55.66.77.88
cnamerecord ftp.domain2.com domain2.com
cnamerecord www.domain2.com domain2.com
mxrecord domain2.com mail.domain2.com
我必须为150个域名这样做
任何帮助都很好像这样的人吗
cat file
arecord * 11.22.33.44
arecord mail 11.22.33.44
arecord domain1.com 11.22.33.44
ftp cnamerecord domain1.com
www cnamerecord domain1.com
domain1.com mxrecord mail.domain1.com
arecord * 55.66.77.88
arecord mail 55.66.77.88
arecord domain2.com 55.66.77.88
ftp cnamerecord domain2.com
www cnamerecord domain2.com
domain2.com mxrecord mail.domain2.com
awk命令
awk '
/arecord/ && !c {
c=NR+2}
NR==c {
c=0
print $1 " *." $2,$3 "\n" $1" mail." $2,$3 "\n" $0}
/^ftp|^www/{
print $2,$1 "." $3,$3}
/mxrecord/ {
print $2,$1,$3}
!NF {
print ""}
' file
arecord *.domain1.com 11.22.33.44
arecord mail.domain1.com 11.22.33.44
arecord domain1.com 11.22.33.44
cnamerecord ftp.domain1.com domain1.com
cnamerecord www.domain1.com domain1.com
mxrecord domain1.com mail.domain1.com
arecord *.domain2.com 55.66.77.88
arecord mail.domain2.com 55.66.77.88
arecord domain2.com 55.66.77.88
cnamerecord ftp.domain2.com domain2.com
cnamerecord www.domain2.com domain2.com
mxrecord domain2.com mail.domain2.com
更新以摆脱像这样的东西
cat file
arecord * 11.22.33.44
arecord mail 11.22.33.44
arecord domain1.com 11.22.33.44
ftp cnamerecord domain1.com
www cnamerecord domain1.com
domain1.com mxrecord mail.domain1.com
arecord * 55.66.77.88
arecord mail 55.66.77.88
arecord domain2.com 55.66.77.88
ftp cnamerecord domain2.com
www cnamerecord domain2.com
domain2.com mxrecord mail.domain2.com
awk命令
awk '
/arecord/ && !c {
c=NR+2}
NR==c {
c=0
print $1 " *." $2,$3 "\n" $1" mail." $2,$3 "\n" $0}
/^ftp|^www/{
print $2,$1 "." $3,$3}
/mxrecord/ {
print $2,$1,$3}
!NF {
print ""}
' file
arecord *.domain1.com 11.22.33.44
arecord mail.domain1.com 11.22.33.44
arecord domain1.com 11.22.33.44
cnamerecord ftp.domain1.com domain1.com
cnamerecord www.domain1.com domain1.com
mxrecord domain1.com mail.domain1.com
arecord *.domain2.com 55.66.77.88
arecord mail.domain2.com 55.66.77.88
arecord domain2.com 55.66.77.88
cnamerecord ftp.domain2.com domain2.com
cnamerecord www.domain2.com domain2.com
mxrecord domain2.com mail.domain2.com
更新以摆脱
getline
如果将单独的If
语句加入到If..else If..else
中,则可以添加回退以按原样打印所有其他行;这将保留空行(以及任何注释行等):
如果将单独的
If
语句加入到If..else If..else
中,则可以添加回退以按原样打印所有其他行;这将保留空行(以及任何注释行等):
如果没有适当的格式,这不会有多大进展。你能正确格式化吗?如果没有正确的格式化,这不会有多大进展。你能正确格式化吗?这是一个做的工作,它仍然没有把arecords的权利,但它是非常接近我需要的谢谢你是的,我注意到,当测试,太;如果($1==“arecord”),条件可能需要是
…
;我想你会明白的!您不应将cat
与能够读取数据的程序一起使用,如awk
:awk'code'data.txt
。并且它不会按照OP的要求提供输出。没有将domain1.com
添加到*
和mail
这一个做得很好,它仍然没有正确地放置记录,但是它非常接近我需要的东西谢谢,是的,我在测试时也注意到了这一点;如果($1==“arecord”),条件可能需要是…
;我想你会明白的!您不应将cat
与能够读取数据的程序一起使用,如awk
:awk'code'data.txt
。并且它不会按照OP的要求提供输出。未将domain1.com
添加到*
和邮件中