2017-06-14 2 views
0

ich diesen Befehl verwenden, 2 Zeilen aus einer Textdatei zu extrahieren:Konnte die Ausgabe des Befehls sed oder awk nicht Variablen zugewiesen werden? drucken sie nur

cat file1 | grep -A7 SECTIONA | grep -E 'Address|BackupAddress' 

Dies erzeugt die beiden Linien unter:

Address host1 port_1 Address 
BackupAddress host2 port_2 BackupAddress 

Ich brauche zuweisen (nicht drucken), um den Host und Port-Spalten zu verschiedenen globalen Variablen, die später im Skript verwendet werden.

hosta="host1" 
porta="port_1" 
hostb="host2" 
portb="port_2" 

Ein Mitglied schlug vor, ich benutze dieses und ich erhalte die gewünschte Ausgabe, aber ich kann nicht die Variablen in der aktuellen Shell verwenden? Wenn ich versuche, sie zu drucken oder zu verwenden, erscheinen sie leer. Ich habe auch eine awk Lösung, um die gewünschte Ausgabe zu erhalten, aber sowohl sed als auch awk Befehle drucken nur die oben genannten und erstellen nicht die Variablen?

sed -n 's/^Address *\([^ ]\+\) *\([^ ]\+\).*/hosta="\1"\nporta="\2"/p; 
s/^BackupAddress *\([^ ]\+\) *\([^ ]\+\).*/hostb="\1"\nportb="\2"/p' file1 

Ich kann all dies umgehen, indem Sie den sed und awk in 4 Abschnitte zu brechen und die gleiche Abfrage 4mal laufen, aber es muss einen besseren Weg geben. Ich kann zum Beispiel so tun:

hosta=`cat file | sed/or/awk command` 
porta=`cat file | sed/or/awk command` 
hostb=`cat file | sed/or/awk command` 
portb=`cat file | sed/or/awk command` 

Wenn ich die Abfrage mit awk oder sed Befehl tun, um den gewünschten Ausgang sie Variablen zugewiesen bekommen zu bekommen, und ich kann die Variablen drucken oder zur Verwendung als Ich mag; aber ich möchte die Abfrage nicht 4 Mal ausführen.

Kann mir jemand bitte helfen

+0

ja Inian 2 Zeilen und 4 Variablen in diesem Fall – theuniverseisflat

+0

Meine Frage war, ob dies der Fall _all_ die Zeit sein könnte? nur zwei Zeilen (oder) kann die Anzahl variieren und _exactly_ 4 Variablen? Eine allgemeinere Lösung kann auf diese Weise erreicht werden. – Inian

+0

Ja, das ist immer der Fall. Die Hostadresse und die Portlinien sind in allen von uns verwendeten Dateien generisch. So gibt es zwei Zeilen, die ich aus den Dateien grep und sie werden immer 4 Variablen enthalten. Hoffe das beantwortet deine Frage – theuniverseisflat

Antwort

0

, dass die Eingabe Überprüfung nicht ungültige Zeichen enthalten, kann der Ausgang als „eval“ ed gleichen werden bezogen. in diesem Fall gesetzt negativer Charakter [^ ] sollte durch einen positiven Zeichensatz ersetzt werden, um Zeichen zu erwarten Übereinstimmen

output=$(sed ...) 
eval "$output" 

oder

eval "$(sed ...)" 

oder

source <(sed ...) 
+0

Sorry, ich verstehe deinen Beitrag nicht. – theuniverseisflat

0

dies der Fall ist alle die Zeit. Die Host-Adresse und Port-Leitungen sind generic über alle Dateien ...

... So gibt es zwei Linien, die ich grep aus den Dateien und sie immer enthält vier Variablen.

die Spezifität der Anwendung gegeben, man konnte:

  • die Datei Scan einmal
  • Speichern Sie die Ergebnisse in eine Variable
  • Parse nur die Variable den Host und Port zuweisen Variablen

Gegeben die Eingabedatei Eingabe. txt, die enthält:

 
Address host1 port_1 Address 
BackupAddress host2 port_2 BackupAddress 

Sie dieses Skript verwenden:

#!/bin/bash 

lines="$(grep -P "Address|BackupAddress" <input.txt)"    #Get the two lines needed 

hosta="$(awk '/^Address/ { print $2 }' <<<"${lines[@]}")"   #Assign $hosta 
porta="$(awk '/^Address/ { print $3 }' <<<"${lines[@]}")"   #Assign $porta 
hostb="$(awk '/^BackupAddress/ { print $2 }' <<<"${lines[@]}")" #Assign $hostb 
portb="$(awk '/^BackupAddress/ { print $3 }' <<<"${lines[@]}")" #Assign $portb 

#Use the results how you like. Here we just echo them back: 

echo "$hosta" 
echo "$porta" 
echo "$hostb" 
echo "$portb" 
Verwandte Themen