Bash:参数扩展行尾字符
Bash: Parameter expansion end of line character
我有一个遵循这种格式的命令输出(尽管有更多数据):
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' 替换 '*' 但没有成功。谢谢!
您可以使用带有字段分隔符 :
或 space 的 awk 命令来获取两个 IP 地址:
awk -F '[: ]+' '{print , }' 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 , }'
我有一个遵循这种格式的命令输出(尽管有更多数据):
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' 替换 '*' 但没有成功。谢谢!
您可以使用带有字段分隔符 :
或 space 的 awk 命令来获取两个 IP 地址:
awk -F '[: ]+' '{print , }' 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 , }'