我正在解析命令的输出,例如:
0. BP-726162639-172.16.2.40-1425055855614:blk_1724943006_651672912 len=39498 Live_repl=3 [DatanodeInfoWithStorage[172.16.2.168:50010,DS-fbfe96c7-82c7-4be3-b056-5a74b3fa2f4b,DISK], DatanodeInfoWithStorage[172.16.2.170:50010,DS-5459e7a0-2874-4a84-b4a4-e7fc84be391f,DISK], DatanodeInfoWithStorage[172.16.2.162:50010,DS-86792af4-6db8-478a-97c7-2b6560f2cc19,DISK]]
Run Code Online (Sandbox Code Playgroud)
第一个子程序按预期工作,但之后的子程序失败:
awk '{print "block # : " gsub(/\./,"",$1) $2 " :: " sub(/len=/,"a",$3) " :: " $4}'
Run Code Online (Sandbox Code Playgroud)
这打印:
block # : 1BP-726162639-172.16.2.40-1425055855614:blk_1724943006_651672912 :: 1 :: Live_repl=3
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会发生这种情况。使用多个潜艇不好吗?
在理解@ken的答案后,很明显我需要在开始时进行替换,然后在打印中使用 $1 $2 等。
两者gsub都sub适用于您的代码。
这两个函数将进行替换,并返回计数,即完成了多少次替换。(不是替换后的字符串)。
所以1beforeBP-...是 from ,s之间的gsub另一个是 from 。1::sub()