对于sub / gsub,AWK返回数字而不是字符串

时间:2017-11-23 08:43:39

标签: awk

我正在解析命令的输出,例如:

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等。

2 个答案:

答案 0 :(得分:4)

gsubsub都在您的代码中工作。

这两个函数将进行替换,并返回计数,进行了多少次替换。 (不是替换后的字符串)。

因此1之前的BP-...来自gsub1之间的::来自sub()

答案 1 :(得分:1)

要突出显示答案,只需在替换变量后再次使用它:

echo foo-default | awk '{ sub("-default", "", $1); printf "(%s)", $1 }'
(foo)