将 sed 与此处字符串 (

将 sed 与此处字符串 (

我使用sedwith<<<read将字符串中的所有单词分配给变量。我所做的是:

read -a A0 <<< $(sed '2q;d' /proc/stat)

因此,sed读取文件的第二行file并立即退出。已读入的行将sed被输入,<<<它会扩展它接收到的输入sed并将read -a结果值分配<<<给数组的元素。以这种方式使用<<<andsed是一个好主意还是有明显的理由反对这种做法,最重要的是,是否有更快的方法来做到这一点?

答案1

可以直接使用数组赋值:

A0=($(sed '2q;d' /proc/stat))

请注意,这会执行通配符:如果命令的输出包含 shell 通配符,则包含通配符的单词将被匹配文件列表(如果有)替换。如果命令的输出可能包含字符之一\[?*,请暂时关闭通配符:

set -f
A0=($(sed '2q;d' /proc/stat))
set +f

这比使用以下方法要快一点read

$ time for i in {1..1000}; do read -a A0 <<< $(sed '2q;d' /proc/stat); done

real    0m2.829s
user    0m0.220s
sys     0m0.480s

$ time for i in {1..1000}; do A0=($(sed '2q;d' /proc/stat)); done

real    0m2.388s
user    0m0.128s
sys     0m0.276s

对于bash4.0 及更高版本,您可以使用mapfile

mapfile -t < <(sed '2q;d' /proc/stat)

mapfile似乎是最慢的:

$ time for i in {1..1000}; do mapfile -t < <(sed '2q;d' /proc/stat); done

real    0m3.990s
user    0m0.104s
sys     0m0.444s

答案2

在我看来,语法似乎太复杂了。我会改用以下内容:

read -a A0 < <( sed '2q;d' /proc/stat )

<<< word当我需要一个命令从变量而不是另一个命令获取输入时,我通常使用该语法。

相关内容