我正在解析命令的输出,例如:
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]]
第一个子工作符合预期,但失败后的子工作:
awk '{print "block # : " gsub(/\./,"",$1) $2 " :: " sub(/len=/,"a",$3) " :: " $4}'
打印:
block # : 1BP-726162639-172.16.2.40-1425055855614:blk_1724943006_651672912 :: 1 :: Live_repl=3
我不确定为什么会这样。是否可以使用多个潜艇?
在理解了@ ken的答案之后,很明显我需要在开头做替换,然后在打印中使用$ 1 $ 2等。
答案 0 :(得分:4)
gsub
和sub
都在您的代码中工作。
这两个函数将进行替换,并返回计数,进行了多少次替换。 (不是替换后的字符串)。
因此1
之前的BP-...
来自gsub
而1
之间的::
来自sub()
。
答案 1 :(得分:1)
要突出显示答案,只需在替换变量后再次使用它:
echo foo-default | awk '{ sub("-default", "", $1); printf "(%s)", $1 }'
(foo)