我有一个调用 dns 区域的 bash 文件,并且已将fqdn
我需要反向输出的内容通过管道输出。
下面的代码片段做得很好,除了.
最后我得到了一个试验,我不想创建一个导入,csv(逗号分隔符)格式:
... | awk -F'.' '{for (i=NF;i>0;i--){printf $i"."};printf "\n"}'
示例来源:
abc.def,ghi.com
hjd.dhjs.dhuj.oiuehj.ksjdhf.com
期望结果:
com.ghi.def.abc
com.ksjdhf.oiuehj.dhuj.dhjs.hjd
目前结果:
com.ghi.def.abc.
com.ksjdhf.oiuehj.dhuj.dhjs.hjd.
答案1
以下是一种方法:
awk -F'.' '{for (i=NF;i>1;i--){printf $i"."};print $1}'
使用示例:
$ echo abc.def.ghi.com | awk -F'.' '{for (i=NF;i>1;i--){printf $i"."};print $1}'
com.ghi.def.abc
解释:
for (i=NF;i>1;i--){printf $i"."
这将以相反的方向打印各部分,从 (第二个字段)开始
$NF
并停止$2
,每个部分后面都跟一个句点。print $1
这将打印最后部分,不带尾随句点。因为
print
这里使用的是 ,而不是printf
,所以不需要显式换行。
选择
为了多样化,这里是另一种解决方案:
awk -F'.' '{s=""; for (i=NF;i>0;i--){s=s"."$i};print substr(s,2)}'
这使用与原始帖子相同的逻辑:对所有部分进行一次循环。不过,这不是在每个步骤都打印,而是将所需的输出保存到字符串中s
。最后,它会打印s
除了最后一个字符(即多余的句号)之外的内容。
替代使用tac
而不是awk
$ echo abc.def.ghi.com | tr '.' '\n' | tac | tr '\n' '.' | sed 's/\.$/\n/'
com.ghi.def.abc
或者更简单:
$ echo abc.def.ghi.com | tac -s'[.\n]'
abc.def.ghi.com
答案2
您还可以printf
与另一个变量一起使用:每个字段后打印的字符。
$ awk -F"[.,]" '{for (i=NF;i>0;i--) printf "%s%s", $i, (i==1?"\n":".")}' file
com.ghi.def.abc
com.ksjdhf.oiuehj.dhuj.dhjs.hjd
-F"[.,]"
将字段分隔符设置为.
或,
。这样,每个单词将计为不同的字段。(i==1?"\n":".")
意思是:如果i
是1
,则使用\n
;否则,使用.
。