反向打印,无尾标

反向打印,无尾标

我有一个调用 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":".")意思是:如果i1,则使用\n;否则,使用.

相关内容