更详细:

更详细:

命令: val=$( echo $text $len|awk '{print substr($0,0,$2)}')

上面的命令工作正常。我只想了解 $0 和 $2 所取的值。我知道 $0 接受 $text 的值,$2 接受 $len 的值。但是 1 美元呢?

答案1

  • $0是整行,($text$len
  • $2第二个论点是 ( $len)

看起来substr($0,0,$2) 应该是substr($1,0,$2),但是,如果$len足够小(小于 的实际长度$text),那就没关系。

一方面,请注意:

val=${text:0:$len}

在大多数 shell 中应该可以解决这个问题。

答案2

这是因为awk从 开始计数1,而不是从 开始计数0。第一个块是$1,第二个块是$2,依此类推。$0实际上是您通过管道输入的整条线awk,所有块都在一起。

更详细:

好的,首先我假设您在 shell 中运行该东西,例如bash,并且该部分val=$( echo $text $len|awk '<awk-script>')由 shell 解释,并且只是{print substr($0,0,$2)}实际的awk脚本。

现在,让我们看一下 awk ( man awk) 的联机帮助页:

awk 实用程序应表示记录中的第一个字段$1、第二个字段$2,依此类推。该符号$0应指整个记录[...]。

substr(s, m[, n ])
返回从 位置 开始、从 开始编号的           最多2 个n字符的子字符串。如果省略,或者指定的字符数多于字符串中剩余的字符,则子字符串的长度应受字符串长度的限制。sm1nns

因此,首先请注意, 的长度参数的编号substr也以 开头1,因此最好使用substr($0,1,$2)代替substr($0,0,$2)

$text因此,您通过管道输入的第一个块(在您的示例中)awk是一个字符串,第二个“块”($len在您的示例中)需要是一个整数,描述有多少个字符所有的块在一起,从第一个字符开始,你想要返回。

好的,现在尝试:

echo ABCDEFGHIJKLMNOPQRSTUVWXYZ 2 | awk '{print substr($0,1)}'

给出

ABCDEFGHIJKLMNOPQRSTUVWXYZ 2

满的输入。

echo ABCDEFGHIJKLMNOPQRSTUVWXYZ 2 | awk '{print substr($1,1)}'

给出

ABCDEFGHIJKLMNOPQRSTUVWXYZ

即完整的第一个块。

所以

echo ABCDEFGHIJKLMNOPQRSTUVWXYZ "${len}" | awk '{print substr($0,1,$2)}'

将给出 的第一个$len字符ABCDEFGHIJKLMNOPQRSTUVWXYZ "$len",即文本本身$len

如果您只想拥有 的第一个$len字符$text,请尝试

val=$( echo $text $len|awk '{print substr($1,1,$2)}')

即在 awk 脚本中将$0更改为。$1

还要考虑用双引号“转义”shell 参数,即

val="$(echo "$text" "$len" | awk '{print substr($1,1,$2)}')"

通常是人们想要的东西(至少是整个$([...])-thing 和 around周围的引号$text,因为$len你可以跳过它)。

相关内容