Erstellen Sie eine IP-Zeichenfolge mithilfe der Bash-Befehlszeile

Erstellen Sie eine IP-Zeichenfolge mithilfe der Bash-Befehlszeile

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.5fü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

awkAm 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}')"

-FSetzt das Trennzeichen für das Eingabefeld (standardmäßig ein beliebiges Leerzeichen) auf einen benutzerdefinierten Wert, in diesem Fall ein doppeltes Anführungszeichen ( ").

-vermöglicht Ihnen das Festlegen awkvon Variablen.

OFSist das Ausgabefeldtrennzeichen, standardmäßig ein einzelnes Leerzeichen. Wir setzen es auf einen Punkt.

ORSist 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 sedBefehl 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 pasteBefehl 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“.

verwandte Informationen