2013-09-05 11 views
5

Jestem całkiem nowy dla poleceń grep i sed.Jak można +50.0 być wyodrębnione z Core 0: +50.0°C (high = +80.0°C, crit = +90.0°C) przy użyciu grep lub sed w skrypcie bash?Wyciąg przy użyciu sed lub 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

Czy masz bardziej szczegółowe zasady dotyczące tego, co należy wyodrębnić? Czy zawsze jest tuż po 'Rdzeniu 0:', ale przed '('? –

+0

Po prostu chcę wyodrębnić to, co obecne pomiędzy Rdzeniem 0: i (.Jeśli to możliwe, wyeliminuj dodatkową przestrzeń między Rdzeniem 0: a +50.0 (co jest dynamiczny) –

Odpowiedz

2

Korzystanie grep -oP (PCRE regex):

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

Dzięki ... To działa –

+0

Nie ma za co, cieszę się, że to zadziałało – anubhava

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

Lub alternatywnie, tylko w awk,

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

Oba te elementy wydrukują pole, które wydaje się być poszukiwane, a otaczające białe znaki zostaną usunięte.

+0

'grep -e '^ Core 0:' [input] | awk '{print $ 3}'' drukuje 'urządzenie (crit (adapter krytyczny + 50,0 ° C + 47,0 ° C. "Po prostu potrzebuję +50.0 –

+0

Wygląda na to, że grep nie działa z jakiegoś powodu, a kod awk właśnie działa na wszystkich liniach. dzieje się jednak - oba działają dobrze na mojej maszynie – qaphla

+0

[Nie używaj 'grep | awk' mimo to.] (http://partmaps.org/era/unix/award.html#grep) Po prostu' awk '/^ Core 0:/{print $ 3} 'input' robi to o wiele bardziej elegancko, zwięźle i idiomatycznie – tripleee

2

Użyj grep przekazując flagi Perl regex i używać \K odrzucić porcje un potrzebne linii do lewej

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

Dzięki .. Działa. –

1

Dla dobra kompletności, tutaj jest próbą ustalenia skrypt sed.

sed jest zorientowana na linię, więc twoja próba wydrukuje wszystko, co pasuje do pierwszego wyrażenia (które nigdy by nie pasowało) do następnego wiersza pasującego do drugiego.

(. Tak więc, aby przeformułować, sed -n '/first/,/last/p' file będzie drukować z pierwszej linii w file dopasowanie first i zatrzyma się, gdy znajdzie last na kolejnej linii wejściowych z pliku)

Spróbuj to zamiast:

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

Spowoduje to zastąpienie pierwszego wyrażenia bez niczego. Jeśli wymiana nie nastąpiła, T przeskakuje na koniec skryptu (domyślnie nie robiąc nic, tylko zaczynając od następnej linii wejściowej). W przeciwnym razie mamy dopasowanie, więc zastępujemy również ogon nicością i drukujemy.

... Jednak nie wszystkie dialekty sed mają komendęi niektóre podobno nie lubią skryptów oddzielonych średnikami.