Wenn ich einen Befehl ausführe, erhalte ich 10 Zeilen Ausgabe. Ich möchte die Zeilen 2-4-6-8-10 nehmen und sie in ein Array einfügen.
Jedes Mal, wenn ich meinen Befehl ausführe, ändert sich die Reihenfolge, sodass ich dies auf einmal tun muss. Ich hatte versucht, meinen Befehl auszuführen und Zeile 2 auszuwählen, dann erneut auszuführen und Zeile 4 auszuwählen usw., aber da sich die Reihenfolge ändert, funktioniert dies nicht:
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}")
Akzeptierte Antwort:
Verwenden von readarray in der bash Shell und GNU sed :
readarray -t my_array < <( my_command | sed '1~2d' )
Das eingebaute readarray liest die Zeilen in ein Array ein. Die Zeilen werden aus einer Prozesssubstitution gelesen. Der sed command in der Prozesssubstitution gibt nur jede zweite Zeile aus, die von my_command gelesen wird (und könnte auch sed '1!n;d' geschrieben werden , oder als sed -n 'n;p' mit Standard-sed ).
In GNU sed , die Adresse n~m adressiert jeden m :te Zeile ab Zeile n . Dies ist eine GNU-Erweiterung des Standard-sed , der Einfachheit halber.
Der my_command Befehl wird immer nur einmal aufgerufen.
Testen:
$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10