我在格式上有多个结果
10.3.2.1.in-addr.arpa name hostname我想删除中间部分".in-addr.arpa“,并将IP地址反转到1.2.3.10。用一个简单的bash班轮就可以了吗?提前谢了,我从几个小时开始就试着做这件事,而且有点卡住了。
发布于 2020-12-08 17:54:01
使用perl:
perl -pe 's/(\d+)\.(\d+)\.(\d+)\.(\d+)\.in-addr\.arpa/$4.$3.$2.$1/g' < input它比标准的sed等价物少一点冗长,也更容易读懂:
d='\([0-9]\{1,\}\)'
LC_ALL=C sed "s/$d\.$d\.$d\.$d\.in-addr\.arpa/\4.\3.\2.\1/g" < input这些将所有出现的....in-addr.arpa替换为... (其中是一个或多个十进制数字的任何序列),其他所有内容都保持不变。
发布于 2020-12-08 17:56:53
$ awk '{split($1,p,"."); $1=p[4]"."p[3]"."p[2]"."p[1]} 1' file
1.2.3.10 name hostname发布于 2020-12-08 17:59:59
另一种perl方法:
$ perl -lane '@ip=split(/\./,$F[0]); $F[0]=join(".",reverse(@ip[0..3])); print "@F"' file
1.2.3.10 name hostname注意,这假设行的前4个.-separated元素是IP地址。
-lane:-a使perl像awk一样工作,在空格上分割每一行输入,并将结果保存在数组@F中。-l为每个print调用添加一个换行符(并从输入行中移除尾随的换行符),-n的意思是“逐行读取输入并将-e给出的脚本应用于每一行”。@ip=split(/\./,$F[0]):获取第一个字段($F[0])并将其拆分到.上,将输出保存在数组@ip中。$F[0]=join(".",reverse(@ip[0..3]));:这有几个部分。首先,join(CHAR, ARRAY)将使用字符CHAR将数组元素连接到字符串中。在这里,我们将传递@ip数组的前4个元素(索引0到3),所以所有内容都会传递到示例中的非数字,因此连接将生成IP。接下来,reverse会反转它。最后,我们将结果保存为$F[0]。print "@F":在前面的步骤之后,@F数组现在包含我们想要的内容,所以我们打印它。如果您只想从输入文件的所有行中删除字符串.in-addr.arpa的第一次出现,然后反转IP,您可以这样做:
$ perl -pe 's/\.in-addr\.arpa//; s/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/$4.$3.$2.$1/' file
1.2.3.10 name hostnamehttps://unix.stackexchange.com/questions/623488
复制相似问题