2013-09-05 7 views
5

Sono abbastanza nuovo nei comandi grep e sed. Come si può estrarre +50.0 da Core 0: +50.0°C (high = +80.0°C, crit = +90.0°C) usando grep o sed in bash script?Estrai usando sed o 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 Script:

#!/bin/bash 

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

echo $temp 
+0

Avete regole più specifiche su ciò che deve essere estratto? È sempre immediatamente dopo 'Core 0:' ma prima '('? –

+0

Voglio solo estrarre qualsiasi cosa presente tra Core 0: e (. Se possibile eliminare lo spazio extra tra Core 0: e +50.0 (che è dinamico) –

risposta

2

Utilizzando grep -oP (PCRE regex):

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

Grazie .. Funziona. –

+0

Prego, felice che abbia funzionato per te. – anubhava

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

o, in alternativa, solo in awk,

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

Entrambi stamperanno il campo che si sta cercando, eliminando gli spazi bianchi circostanti.

+0

'grep -e '^ Core 0:' [input] | awk '{print $ 3}'' sta stampando 'dispositivo (crit (adattatore per crit + 50.0 ° C + 47.0 ° C.) Ho solo bisogno di +50.0 –

+0

Sembra che il grep non funzioni per qualche motivo, e il codice awk sta scorrendo su tutte le linee. comunque, entrambi funzionano bene sulla mia macchina: – qaphla

+0

[Non usare comunque 'grep | awk'.] (http://partmaps.org/era/unix/award.html#grep) Semplicemente 'awk'/^ L'input di Core 0:/{print $ 3} 'è molto più elegante, succinto e idioma – tripleee

2

Usa grep passando la bandiera perl-regex e utilizzare \K di scartare le parti non necessarie della linea a sinistra della

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

Grazie .. Funziona. –

1

Per completezza, ecco un tentativo di fissare lo script sed.

sed è orientato alla linea, quindi il tuo tentativo dovrebbe stampare da qualsiasi cosa corrisponda alla prima espressione (che non potrebbe mai corrispondere comunque) alla riga seguente che corrisponde alla seconda.

(. Così, per riformulare, sed -n '/first/,/last/p' file stamperà dalla prima riga in file corrispondenza first, e fermarsi quando trova last su una linea di ingresso successiva dal file)

Prova a modificare:

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

Questo sostituirà la prima espressione con niente. Se la sostituzione non si verifica, T salta alla fine dello script (facendo implicitamente nulla, ricominciando da capo con la riga di input successiva). Altrimenti, abbiamo una corrispondenza, quindi sostituiamo anche la coda con niente e stampiamo.

... Tuttavia, non tutti i dialetti sed hanno il comando T e alcuni script apparentemente non mi piace separati da punto e virgola.