2012-10-28 5 views
13

Ho un file di testo di grandi dimensioni, voglio vedere le linee che contengono "time spent" in questo file di testo, utilizzare:Come eseguire il grep di una stringa dopo un numero di riga specificato?

grep -in "time spent" myfile.txt 

Ma sono interessati solo le righe dopo 50000. In uscita che voglio vedere le righe dopo il 50000 e che contengono "tempo trascorso". C'è un modo per fare questo?

risposta

27

È possibile coda, poi grep:

tail -n +50000 myfile.txt | grep -in "time spent" 
+1

che non funziona così bene dal momento che incasina la numerazione della linea – BeniBela

+0

Nota il segno '+'. si sbiadisce inutile ma significa qualcos'altro che tail -n 50000, significa: coda che inizia alla linea 50000 iso lat 50000 lines – gkephorus

4

In alternativa è possibile utilizzare sed. sed può essere utilizzato per simulare grep in questo modo:

sed -n 's/pattern/&/p'

Per impostazione predefinita sed stampe ogni linea anche se si verifica alcuna sostituzione. Le combinazioni di -n e /p fanno sì che sed stampino solo le righe in cui si è verificata una sostituzione. Infine, sostituiamo pattern per & che significa sostituire pattern da solo. Risultato: abbiamo appena imitato grep.

Ora sed può richiedere un intervallo di linee su cui agire. Nel tuo caso:

sed -n '50000,$s/time spent/&/p' myfile.txt

Il formato per specificare l'intervallo è la seguente: start,end Abbiamo appena istruire sed lavorare da linea di 50000 a $ che significa ultima riga.

+7

La risposta accettata è corretta. Si noti che 'tail -n + 2' (tutte le righe che iniziano con la linea 2) è molto diverso da' tail -n 2' (solo le ultime 2 righe). – user113215

+1

Sì, non l'ho capito. Molto buono a sapersi, grazie per indicarlo – neric

+1

Mi piace l'approccio sed. Serve solo un programma, niente pipe. – gkephorus

1

Si potrebbe utilizzare head + grep e il gruppo comandi con {...} in modo che essi condividono lo stesso ingresso:

{ head -n 50000 >/dev/null; grep -i PATTERN; } < infile 

head non consuma l'intero d'ingresso, si ottiene solo le prime 50000 righe e le discariche a /dev/null; le righe rimanenti vengono elaborate da grep.
Se avete bisogno dei numeri di riga anteporre (come con grep -in) si potrebbe usare awk:

awk 'NR>50000 && tolower($0)~/PATTERN/{print NR ": " $0}' infile 
2

risposta per grep tra qualsiasi numero 2 linee:

Using sed and grep: 

sed -n '1,50000p' someFile | grep <your_string>