GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Skript:Wie weist man jede Zeile der Befehlsausgabe Werten in einem Array zu?

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

Linux
  1. Wie weist man die Ausgabe eines Befehls einer Shell-Variablen zu?

  2. Befehlszeilenargumente an Bash-Skript übergeben?

  3. Wie kann man feststellen, ob die Ausgabe eines Befehls oder Shell-Skripts Stdout oder Stderr ist?

  4. Wie füge ich in Bash nach jeder Zeile in einer Datei eine Zeichenfolge hinzu?

  5. Wie kann ich eindeutige Werte aus einem Array in Bash erhalten?

So weisen Sie einer Variablen die Ausgabe eines Linux-Befehls zu

So löschen Sie den BASH-Befehlszeilenverlauf in Linux

So zeigen Sie den Bash-Verlauf ohne Zeilennummern an

So entfernen Sie Zeilen aus einer Datei mit dem Sed-Befehl

Wie bearbeite ich vorherige Zeilen in einem mehrzeiligen Befehl in Bash?

Ein Befehl, um jede Zeile vorwärts und dann rückwärts auszugeben