2012-06-19 9 views
5

è possibile utilizzare grep per abbinare solo le righe con numeri in un intervallo pre-specificato? Ad esempio, desidero elencare tutte le righe con numeri nell'intervallo [1024, 2048] di un registro che contengono la parola "errore".grep partita solo linee in un campo specifico

Vorrei mantenere la funzionalità '-n' vale a dire hanno il numero della linea abbinato nel file.

risposta

5
sed -n '1024,2048{/error/{=;p}}' | paste - - 

Qui /error/ è un modello da corrispondenza e = stampa il numero di riga.

+0

Accetto la risposta perché stampa anche i numeri di riga originali. Non capisco bene il bit con {/ error/{=; p}} potresti spiegarlo per favore? –

+0

/error/è il modello da abbinare nell'intervallo di numero indicato. –

+0

Wow! Ora imparo un nuovo trucco sed! Questo è potente! – Viet

7

Uso sed primo:

sed -ne '1024,2048p' | grep ...

-n dice di non stampare le linee, 'x, y, p' dice righe di stampa xy inclusiva (ha priorità -n)

+0

La ragione per cui credo la soluzione del principe John Wesley è meglio è che stampa anche i numeri di riga originali, mentre qui avrò il loro numero nell'intervallo specificato. Ancora +1. –

3

Awk è un buon strumento per il lavoro:

$ awk 'NR>=1024 && NR<=2048 && /error/ {print NR,$0}' file 

In awk variabile NR contiene il numero di riga corrente e $0 contiene la linea stessa.

I vantaggi con l'utilizzo di awk è che si può facilmente cambiare l'output per visualizzare tuttavia si desidera. Per esempio per separare il numero di riga da linea con due punti seguiti da un TAB:

$ awk 'NR>=1024 && NR<=2048 && /error/ {print NR,$0}' OFS=':\t' file 
Problemi correlati