命令: 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
字符的子字符串。如果省略,或者指定的字符数多于字符串中剩余的字符,则子字符串的长度应受字符串长度的限制。s
m
1
n
n
s
因此,首先请注意, 的长度参数的编号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
你可以跳过它)。