2016-06-21 13 views
1

Ich versuche, einen Wert aus einem Informationsblock zu bekommen.Extrahieren einer Zahl in einer Zeile mit sed

Ich erstelle die folgende Ausgabe:

RSSI: -21 
RSSI: -12 
RSSI: -13 
RSSI: -13 
RSSI: -16 
RSSI: -13 

mit folgendem Befehl ein:

hcidump -a | egrep 'RSSI|bdaddr' | grep -A1 --no-group-separator 'bdaddr XX:XX:XX:XX:XX' | egrep 'RSSI' 

Aber ich mag nur den Wert am Ende bekommen angezeigt werden. Aber ich bin mit dem richtigen Muster zu kämpfen, fand ich im Internet viele Hinweise, aber nicht eine, die, zum Beispiel funktioniert:

sed 's/RSSI: //' 

Ferner möchte ich wissen, ob es wie ein glatter Weg meines Befehl auf das ist oben, weil es bei jedem | erscheint Die Ausgabe wird langsamer, als würde sie einen Puffer füllen, bevor sie die Werte ausgibt.

PS: Ich möchte diesen Befehl in C mit der Funktion system() verwenden, gibt es eine Option, um den Wert in einer C-Variable gespeichert werden? nur die zweite Spalte, wenn man bedenkt ein Leerzeichen als Spaltenbegrenzer

cut -d' ' -f2 myfile 

erhalten Sie folgende Ausgabe:

Antwort

2

geben Sie diesem einen Versuch

hcidump -a |.. whatever...:XX:XX'|grep -Po 'RSSI:\s+\K.*' 

oder

hcidump -a |.. whatever...:XX:XX'|awk '/RSSI/{print $2}' 
+0

beide Versionen funktionieren perfekt. – DaPole

2

Keine Notwendigkeit für sed, können Sie cut verwenden.

Edit: Leerzeichen am Anfang jeder Zeile in Meinedat, tun dies zuerst zu löschen:

sed -i 's/^ *//' myfile 
+0

es bei mir nicht funktioniert, aber der Grund, warum ich Leerzeichen vor RSSI vergessen zu erwähnen. – DaPole

+1

Bitte sehen Sie meine bearbeitete Antwort. – dr01

0

Oder, wenn Sie variable Anzahl von Zwischenräume haben, können Sie Folgendes verwenden:

rev myfile | cut -d' ' -f1 | rev

+0

die zwei rev s machen keinen Sinn. da du 'cut -fx' benutzt hast, kannst du einfach das 2. Feld nehmen ... – Kent

+0

Aber was ist, wenn die Eingabe etwas wie 'RSSI: -21' enthält, d. h. mehrere Leerzeichen dazwischen? Es wird dann nicht die letzte Nummer zurückgeben. – daemon12

+0

Wenn das der Fall ist, drücken Sie entweder die Leerzeichen (zB durch tr) oder verwenden Sie ein anderes Werkzeug als cut (z. B. awk). Ich werde nicht wählen, rev und rev zurück. Es war vielleicht der langsamste Weg. – Kent