2012-02-16 32 views
6

qualcuno può suggerire cosa fare se devo leggere tra due parole chiave comeLeggi le linee tra due parole chiave

*System_Power 
1 
1.2 
1.8 
2 
*System_Terminate 

In questo caso l'asnwer sarebbe

1 
1.2 
1.8 
2 

Ho provato ad utilizzare awk come

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 

dove i dati di cui sopra si trovano da qualche parte nel file di file di salvataggio.

Sarei grato per le vostre correzioni.

risposta

5

Questo funziona per voi:

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

ha funzionato per me, ma io non sono in grado di trovare un modo generale di awking. Ogni volta che ottengo un nuovo formato di soluzione che è abbastanza difficile da digerire. Sto cercando di ottenerlo. –

2

È possibile utilizzare sed per selezionare banalmente il testo tra due linee di corrispondenza, ma questo sarà anche includere le linee corrispondenti stessi ... così abbiamo eliminare in modo esplicito quelle:

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

Awk può anche selezionare il testo tra le linee corrispondenti:

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

... ma come sed questo includerà i terminatori di inizio/fine. È possibile risolvere questo problema con awk, ma penso che si ottiene una soluzione più pulita con sed.

+0

C'è un motivo per cui usi il reindirizzamento invece dei parametri sed/awk? Per me quelli possono essere scritti 'sed ... input' o' awk ... input' senza '<'. – jfg956

+0

No, nessuna ragione. Solo in una specie di umore filtrante. – larsks

1

Ecco un altro:

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

Questo potrebbe funzionare per voi:

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

o questo:

awk '/^\*System_Terminate/{p=0};p;/^\*System_Power/{p=1}' file 
Problemi correlati