【问题标题】:Bash: Parameter expansion end of line characterBash:参数扩展行尾字符
【发布时间】:2015-10-19 04:38:36
【问题描述】:

我有一个遵循这种格式的命令输出(尽管有更多数据):

192.168.3.158:63402  <-> 192.168.3.1:boe-cms        0         0       1      1054       1      1054     2.000015920         0.0000
192.168.3.226:45873  <-> 192.168.2.117:boe-cms       0         0       1      1054       1      1054     2.000015840         0.0000
192.168.3.39:20224   <-> 192.168.3.55:boe-cms       0         0       1      1054       1      1054     2.000015760         0.0000
192.168.3.19:16442   <-> 192.168.2.102:boe-cms       0         0       1      1054       1      1054     2.000015680         0.0000
192.168.3.81:boe-cms <-> 192.168.3.78:4948          1      1054       0         0       1      1054     2.000015600         0.0000
192.168.3.158:8073   <-> 192.168.2.128:boe-cms       0         0       1      1054       1      1054     2.000015520         0.0000
192.168.3.247:powwow-client <-> 192.168.2.247:boe-cms       0         0       1      1054       1      1054     2.000015440         0.0000
192.168.2.212:boe-cms <-> 192.168.3.145:link         1      1054       0         0       1      1054     2.000015360         0.0000
192.168.3.165:26944  <-> 192.168.2.254:boe-cms       0         0       1      1054       1      1054     2.000015280         0.0000
192.168.2.239:boe-cms <-> 192.168.3.104:6307         1      1054       0         0       1      1054     2.000015200         0.0000
192.168.3.127:64857  <-> 192.168.3.24:boe-cms       0         0       1      1054       1      1054     2.000015120         0.0000
192.168.3.21:boe-cms <-> 192.168.3.103:856          1      1054       0         0       1      1054     2.000015040         0.0000
192.168.3.131:opendeploy <-> 192.168.2.169:boe-cms       0         0       1      1054       1      1054     2.000014960         0.0000

我最终想将 IP 地址解析为两个单独的列表。这应该很简单,但首先我想删除每行中第二个 IP 地址之后的数据。据我所知,我不能将空格视为列,因为它们不是制表符,所以我尝试从 7 个连续空格开始进行参数扩展(这表示 IP 的结束):

str="${str%%"       "*}"

这会忽略行,并导致以下输出:

192.168.3.158:63402  <-> 192.168.3.1:boe-cms

那么我可以将命令更改为仅删除直到行尾,或者还有什么可以做同样的事情?我试过用 '\n' 替换 '*' 没有运气。谢谢!

【问题讨论】:

  • 这种替换不是逐行操作的,这就是为什么你得到你所得到的。它会修剪 first 组(由七个空格组成)之后的所有内容。查看Bash FAQ 001 了解对逐行数据进行操作的方法。第一步是不要将所有内容都塞入一个变量中,这将无济于事(并使某些事情变得更加困难)。

标签: bash networking ip ip-address


【解决方案1】:

您可以使用此 awk 命令与字段分隔符为 : 或空格来获取两个 IP 地址:

awk -F '[: ]+' '{print $1, $4}' file
192.168.3.158 192.168.3.1
192.168.3.226 192.168.2.117
192.168.3.39 192.168.3.55
192.168.3.19 192.168.2.102
192.168.3.81 192.168.3.78
192.168.3.158 192.168.2.128
192.168.3.247 192.168.2.247
192.168.2.212 192.168.3.145
192.168.3.165 192.168.2.254
192.168.2.239 192.168.3.104
192.168.3.127 192.168.3.24
192.168.3.21 192.168.3.103
192.168.3.131 192.168.2.169

如果您从命令中获取输入,请使用:

command | awk -F '[: ]+' '{print $1, $4}'

【讨论】:

  • 谢谢,不过我也在尝试保留端口和冒号。我正在尝试 '{print $1, $2, $4, $5}' 但它不保留冒号,知道如何做到这一点吗?
  • 您希望192.168.3.158:63402 在第一列,192.168.3.1:boe-cms 在第二列吗?
  • 是的,确切地说,我最终试图用这些列填充两个数组,一个用于发送 IP,一个用于接收。
  • 那么你可以使用awk '{print $1, $3}'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
相关资源
最近更新 更多