2012-02-16 16 views
6

Czy ktoś może sugerować, co zrobić, jeśli mam czytać między dwoma słowami kluczowymi jakCzytaj linii pomiędzy dwoma słowami kluczowymi

*System_Power 
1 
1.2 
1.8 
2 
*System_Terminate 

W tym przypadku asnwer byłoby

1 
1.2 
1.8 
2 

Próbowałem za pomocą awk jak

awk '$0 =="*System_Power"    # start printing when 1st field is *System_Power 
$0 != "*System_Terminate"{    # until reach the *System_Terminate 
print; } ' powerSummary > reportedFailure.k # Read from file powerSummary and pipe to reportedFailure.k 
exit 

gdzie powyższe dane znajdują się gdzieś w środku pliku powerSummary.

Byłbym wdzięczny za poprawki.

Odpowiedz

5

To będzie pracować dla Ciebie:

$ awk '/\*System_Power/{f=1;next}/\*System_Terminate/{f=0}f' infile 
1 
1.2 
1.8 
2 
+0

pracował dla mnie, ale ja nie jestem w stanie znaleźć ogólny sposób awk-ing. Za każdym razem otrzymuję nowy format rozwiązania, który jest dość trudny do strawienia. Próbuję to zdobyć. –

2

Można użyć sed do trywialnie zaznaczyć tekst między dwoma pasującymi liniami, ale będzie to także same linie pasujące ... więc wyraźnie usunąć te:

sed -n '/System_Power/,/System_Terminate/ { 
    /^\*/ d 
    p 
}' < input 

awk można również zaznaczyć tekst między pasującymi liniami:

awk '/System_Power/,/System_Terminate/ {print}' < input 

... ale podobnie jak sed będzie to zawierało terminatory start/koniec. Możesz to naprawić za pomocą awk, ale myślę, że otrzymujesz czystsze rozwiązanie z sed.

+0

Czy istnieje powód, dla którego używasz przekierowania zamiast parametrów sed/awk? Dla mnie można je zapisać jako 'sed ... input' lub' awk ... input' bez '<'. – jfg956

+0

Nie, bez powodu. Po prostu w filigranowym nastroju. – larsks

1

Oto jeszcze jeden:

awk '$1=="*System_Power",$1=="*System_Terminate" {if (!/System*/) print}' in.txt 
1

To może pracować dla Ciebie:

sed '/^\*System_Power/,/^\*System_Terminate/!d;//d' file 

czy to:

awk '/^\*System_Terminate/{p=0};p;/^\*System_Power/{p=1}' file 
Powiązane problemy