Ich habe einen Befehl, der Folgendes zurückgibt:
id1="172" id2="17" id3="136" id4="5" id5="0" />
id1="172" id2="17" id3="128" id4="2" id5="0" />
id1="172" id2="17" id3="128" id4="4" id5="0" />
id1="172" id2="17" id3="128" id4="6" id5="0" />
Die ersten vier IDs stellen zusammen eine IP-Adresse dar (z. B. 172.17.136.5
für die erste Zeile).
Ich möchte das oben genannte an einen Analysebefehl weiterleiten, der eine einzelne Zeichenfolge mit allen durch Leerzeichen getrennten IP-Adressen ausgibt.
Für das obige Beispiel:
myVariable="172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6"
Wie kann ich das machen?
Antwort1
awk
Am einfachsten geht das mit einem Befehl:
your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}'
Um es als Variable festzulegen, verwenden Sie die Befehlsersetzung:
myVariable="$(your-command | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"
-F
Setzt das Trennzeichen für das Eingabefeld (standardmäßig ein beliebiges Leerzeichen) auf einen benutzerdefinierten Wert, in diesem Fall ein doppeltes Anführungszeichen ( "
).
-v
ermöglicht Ihnen das Festlegen awk
von Variablen.
OFS
ist das Ausgabefeldtrennzeichen, standardmäßig ein einzelnes Leerzeichen. Wir setzen es auf einen Punkt.
ORS
ist die AusgabeaufzeichnenTrennzeichen, standardmäßig eine neue Zeile. Wir setzen es auf ein Leerzeichen.
Dann drucken wir das 2., 4., 6. und 8. Feld für jede Zeile der Eingabe.
Beispielausgabe:
$ cat temp
id1="172" id2="17" id3="136" id4="5" id5="0" />
id1="172" id2="17" id3="128" id4="2" id5="0" />
id1="172" id2="17" id3="128" id4="4" id5="0" />
id1="172" id2="17" id3="128" id4="6" id5="0" />
$ myVariable="$(cat temp | awk -F\" -v OFS=. -v ORS=' ' '{print $2, $4, $6, $8}')"
$ echo "$myVariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6
$
Antwort2
myvariable=$(yourmysterycommand |
sed -e 's/id1=//;
s/id5=.*//;
s/"//g;
s/id.=/./g;
s/[[:blank:]]\+//g' |
paste -sd' ')
Das ist ein Einzeiler, der zur besseren Lesbarkeit jedoch mit zusätzlichen Zeilenumbrüchen und Einrückungen neu formatiert wurde.
$ echo "$myvariable"
172.17.136.5 172.17.128.2 172.17.128.4 172.17.128.6
Der sed
Befehl entfernt die Zeichenfolge id1=
, dann id5=
und alles Folgende, entfernt dann alle Anführungszeichen ( "
), ändert alle Vorkommen von id.=
in ein Literal .
und entfernt schließlich alle Leerzeichen (Leerzeichen und/oder Tabulatoren) aus der Zeile.
Der paste
Befehl verbindet die Zeilen mit einem Leerzeichen als Trennzeichen.
Übrigens wäre es eine bessere Lösung, das Programm zu reparieren, das IP-Adressen in solch einem nutzlosen und dummen Format druckt. Ein Oktett in einer IP-Adresse ist keine Art „ID“.