Come grep una stringa dopo un determinato numero di riga?

Ho un grande file di testo, voglio vedere le righe che contengono "time spent" in questo file di testo, utilizzo:

grep -in "time spent" myfile.txt

Ma mi interessa solo le righe dopo 50000. In uscita voglio vedere righe dopo 50000 e che contengono “tempo trascorso”. C’è un modo per fare questo?

InformationsquelleAutor alwbtc | 2012-10-28

 

4 Replies
  1. 36

    È possibile coda, quindi grep:

    tail -n +50000 myfile.txt | grep -in "time spent"
    
    • che non funziona così bene dato che disturba la linea di numerazione fino
    • Nota il segno’+’. sembra inutile, ma significa qualcosa di diverso tail-n 50000, significa: coda alla linea di partenza 50000 iso lat 50000 righe
  2. 5

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

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

    Per impostazione predefinita sed stampe di ogni linea, anche se non si verifica alcuna sostituzione. Le combinazioni di -n e /p rende sed stampa solo le righe in cui sostituzione si è verificato. Infine, si sostituisce a pattern da & che significa sostituire pattern di per sé. Risultato: abbiamo imitato grep.

    Ora sed può prendere una serie di linee su cui agire. Nel tuo caso:

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

    Il formato per specificare l’intervallo è come segue: start,end
    Abbiamo appena istruire sed lavorare da linea di 50000 per $ che significa ultima riga.

    • Accettato risposta è corretta. Nota che tail -n +2 (tutte le linee che iniziano a linea 2) è molto diverso da tail -n 2 (solo le ultime 2 righe).
    • Sì, ho capito che. Molto buono a sapersi, grazie per segnalarlo
    • Mi piace il sed approccio. Solo un programma senza la necessità di tubo.
    • si consiglia di modificare la prima parte della tua risposta
  3. 4

    Risposta per un grep tra 2 numeri di riga:

    Using sed and grep:
    
    sed -n '1,50000p' someFile | grep < your_string >
    
  4. 1

    Si potrebbe utilizzare head + grep e comandi di gruppo con {...} in modo che condividano lo stesso input:

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

    head non consuma tutta la voce, che ottiene solo il primo 50000 righe e li lancia a /dev/null; le restanti linee sono trattati con grep.

    Se avete bisogno di i numeri di riga anteposto (come con grep -in) si potrebbe utilizzare awk:

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

Lascia un commento