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

Ist*_*van 3 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]]
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 等。

Ken*_*ent 5

两者gsubsub适用于您的代码。

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

所以1beforeBP-...是 from ,s之间的gsub另一个是 from 。1::sub()

  • @Istvan 例如,在`sub(/foo/,"bar",$3)`之后,`$3`已被替换。`$3` 就是你想要的。 (2认同)