运行命令时,我得到 10 行输出。我想将第 2-4-6-8-10 行放入一个数组中。
每次运行命令时,顺序都会发生变化,因此我需要一次性执行此操作。我曾尝试运行我的命令并挑选出第 2 行,然后再次运行并挑选出第 4 行等,但由于顺序发生了变化,因此这不起作用:
value1=$(my_command |sed '2q;d')
value2=$(my_command |sed '4q;d')
value3=$(my_command |sed '6q;d')
value4=$(my_command |sed '8q;d')
value5=$(my_command |sed '10q;d')
MY_ARRAY=("${value1}" "${value2}" "${value3}" "${value4}" "${value5}")
答案1
readarray
在bash
shell 和 GNU中使用sed
:
readarray -t my_array < <( my_command | sed '1~2d' )
内置函数readarray
将行读入数组中。这些行是从进程替换中读取的。进程替换中的命令sed
将仅输出读取的每隔一行my_command
(也可以写入sed '1!n;d'
,或sed -n 'n;p'
与标准一样sed
)。
在 GNU 中sed
,该地址对从 line 开始的每一行n~m
进行寻址。为了方便起见,这是对标准的 GNU 扩展。m
n
sed
该my_command
命令只会被调用一次。
测试:
$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10