2013-09-05 15 views
5

Ich bin ziemlich neu zu grep und sed Befehle.Wie kann +50.0 extrahiert werden von Core 0: +50.0°C (high = +80.0°C, crit = +90.0°C) mit grep oder sed in Bash-Skript?Extrahieren mit sed oder grep

acpitz-virtual-0 
Adapter: Virtual device 
temp1:  +50.0°C (crit = +89.0°C) 
temp2:  +50.0°C (crit = +89.0°C) 

coretemp-isa-0000 
Adapter: ISA adapter 
Core 0:  +50.0°C (high = +80.0°C, crit = +90.0°C) 
Core 2:  +47.0°C (high = +80.0°C, crit = +90.0°C) 

Bash-Skript:

#!/bin/bash 

temp=`sed -n '/^Core 0:  $/,/^(high/p' ~/Desktop/sensors.txt` 

echo $temp 
+0

Haben Sie genauere Regeln darüber, was extrahiert werden muss? Ist es immer nur direkt nach 'Core 0:', aber vor '('? –

+0

Ich möchte nur das Vorhandensein zwischen Core 0: und (. Wenn möglich, den zusätzlichen Platz zwischen Core 0: und +50.0 (was ist Dynamisch) –

Antwort

2

Mit grep -oP (PCRE regex):

grep -oP 'Core 0: +\K[+-]\d+\.\d+' ~/Desktop/sensors.txt 
+50.0 
+0

Danke .. Es funktioniert .. –

+0

Gern geschehen, froh, dass es für Sie geklappt hat – anubhava

2
grep -e '^Core 0:' [input] | awk '{ print $3 }' 

oder alternativ nur in awk,

awk '{ r = "^Core 0:" } { if(match($0,r)) { print $3 } }' [input] 

Beides druckt das Feld, das Sie suchen, wobei die umgebenden Leerräume eliminiert werden.

+0

'grep -e '^ Kern 0:' [Eingabe] | awk '{print $ 3}'' druckt 'Gerät (crit (crit adapter + 50.0 ° C + 47.0 ° C'. Ich brauche nur +50.0 –

+0

Es sieht so aus als würde der grep aus irgendeinem Grund nicht funktionieren und der awk Code läuft nur über alle Zeilen. Keine Ahnung warum das so wäre passiert aber, beide laufen gut auf meinem Rechner. – qaphla

+0

[Verwenden Sie nicht 'grep | awk sowieso.] (http://partmaps.org/era/unix/award.html#grep) Einfach" awk "/^ Kern 0:/{print $ 3} 'Eingabe' macht das viel eleganter, prägnanter und idiomatisch .. – tripleee

2

Verwendung grep in der Perl-Regex Flagge vorbei und \K verwenden, um die nicht benötigten Teile der Linie nach links

grep -oP '^Core 0:\s+\K\+\d+[.]\d+?' 
+0

Danke .. Es funktioniert. –

1

Der Vollständigkeit halber zu verwerfen, hier ist ein Versuch, Ihre sed Skript zu fixieren.

sed ist zeilenorientiert, so dass Ihr Versuch von allem gedruckt werden würde, das dem ersten Ausdruck (der sowieso nie übereinstimmen würde) mit der folgenden Zeile übereinstimmt, die mit der zweiten übereinstimmt.

(. Also, neu zu formulieren, sed -n '/first/,/last/p' file von der ersten Zeile gedruckt wird in filefirst übereinstimmt, und aufhören, wenn es last auf einer nachfolgenden Eingabezeile aus der Datei findet)

Versuchen Sie stattdessen:

sed -n 's/^Core 0: *//;T;s/ (high.*//p' ~/Desktop/sensors.txt 

Dies wird den ersten Ausdruck durch nichts ersetzen. Wenn das Ersetzen nicht stattgefunden hat, springt T zum Ende des Skripts (implizit nichts tun, nur von der nächsten Eingabezeile aus neu beginnen). Ansonsten haben wir eine Übereinstimmung, also ersetzen wir auch den Schwanz mit nichts und drucken.

... Allerdings haben nicht alle sed Dialekte den Befehl T, und einige scheinen Skripte, die durch Semikolons getrennt sind, nicht zu mögen.

Verwandte Themen