首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bash,从由点分隔的字符串中切断IP

Bash,从由点分隔的字符串中切断IP
EN

Unix & Linux用户
提问于 2020-12-08 17:34:14
回答 5查看 810关注 0票数 1

我在格式上有多个结果

代码语言:javascript
运行
复制
10.3.2.1.in-addr.arpa name hostname

我想删除中间部分".in-addr.arpa“,并将IP地址反转到1.2.3.10。用一个简单的bash班轮就可以了吗?提前谢了,我从几个小时开始就试着做这件事,而且有点卡住了。

EN

回答 5

Unix & Linux用户

回答已采纳

发布于 2020-12-08 17:54:01

使用perl

代码语言:javascript
运行
复制
perl -pe 's/(\d+)\.(\d+)\.(\d+)\.(\d+)\.in-addr\.arpa/$4.$3.$2.$1/g' < input

它比标准的sed等价物少一点冗长,也更容易读懂:

代码语言:javascript
运行
复制
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替换为... (其中是一个或多个十进制数字的任何序列),其他所有内容都保持不变。

票数 7
EN

Unix & Linux用户

发布于 2020-12-08 17:56:53

代码语言:javascript
运行
复制
$ awk '{split($1,p,"."); $1=p[4]"."p[3]"."p[2]"."p[1]} 1' file
1.2.3.10 name hostname
票数 5
EN

Unix & Linux用户

发布于 2020-12-08 17:59:59

另一种perl方法:

代码语言:javascript
运行
复制
$ 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使perlawk一样工作,在空格上分割每一行输入,并将结果保存在数组@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,您可以这样做:

代码语言:javascript
运行
复制
$ 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 hostname
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/623488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档