Come posso formattare il mio output grep per mostrare i numeri di riga alla fine della riga e anche il numero di hit?


378

Sto usando grep per abbinare la stringa in un file. Ecco un esempio di file:

example one,
example two null,
example three,
example four null,

grep -i null myfile.txt ritorna

example two null,
example four null,

Come posso restituire le linee abbinate insieme ai loro numeri di riga in questo modo:

  example two null, - Line number : 2
  example four null, - Line number : 4
  Total null count : 2

So che -c restituisce le linee abbinate totali, ma non so come formattarlo correttamente per aggiungerlo total null countin primo piano e non so come aggiungere i numeri di riga.

Cosa posso fare?

Risposte:


600

-n restituisce il numero di riga.

-iè per ignore-case. Da utilizzare solo se non è necessario il confronto dei casi

$ grep -in null myfile.txt

2:example two null,
4:example four null,

Combina con awkper stampare il numero di riga dopo la corrispondenza:

$ grep -in null myfile.txt | awk -F: '{print $2" - Line number : "$1}'

example two null, - Line number : 2
example four null, - Line number : 4

Utilizzare la sostituzione dei comandi per stampare il conteggio null totale:

$ echo "Total null count :" $(grep -ic null myfile.txt)

Total null count : 2

posso formattarlo aggiungendo i numeri di riga dopo anziché prima con:?
Londra,

la tua soluzione sembra a posto ma ricevi un erroreawk95: syntax error at source line context is >>> ' <<< missing } awk95: bailing out at source line 1
Londra,

scusate il passaggio a Linux ora funziona :) era la versione di Windows non così buona
Londra,

1
... i cavalieri che dicono -niche è così che ricordi questo trucco
santiago arizti,

59

Usa -no --line-number.

Scopri man grepmolte più opzioni.


3
il nuovo utente di Linux è pigro di leggere la pagina man. Ma se usano abbastanza Linux, ci saranno abituati :) È super utile :)
Dzung Nguyen,

19
Non sempre pigro, (ma a volte), spesso è che un nuovo utente Linux ha difficoltà a comprendere una pagina man. (Possono sembrare criptici)
TecBrat il

a volte la pagina man può richiedere molte pagine. E questo è difficile da leggere tutti
Eugen Konkov,

7

utilizzare grep -n -i null myfile.txtper generare il numero di riga davanti a ogni corrispondenza.

Non credo che grep abbia un interruttore per stampare il conteggio delle linee totali abbinate, ma puoi semplicemente convogliare l'output di grep in wc per ottenere questo:

grep -n -i null myfile.txt | wc -l

3
-c stamperà le linee totali abbinate
dpatchery,

Hai ragione. Sfortunatamente sopprime anche l'output normale.
jhenninger,

7

Oppure usa awkinvece:

awk '/null/ { counter++; printf("%s%s%i\n",$0, " - Line number: ", NR)} END {print "Total null count: " counter}' file

4

greptrova le righe e genera i numeri di riga, ma non ti permette di "programmare" altre cose. Se vuoi includere testo arbitrario e fare altre "programmazioni", puoi usare awk,

$ awk '/null/{c++;print $0," - Line number: "NR}END{print "Total null count: "c}' file
example two null,  - Line number: 2
example four null,  - Line number: 4
Total null count: 2

O solo usando la shell (bash / ksh)

c=0
while read -r line
do
  case "$line" in
   *null* )  (
    ((c++))
    echo "$line - Line number $c"
    ;;
  esac
done < "file"
echo "total count: $c"

3

o in perl (per completezza ...):

perl -npe 'chomp; /null/ and print "$_ - Line number : $.\n" and $i++;$_="";END{print "Total null count : $i\n"}'


1

Pensavo solo che avrei potuto aiutarti in futuro. Per cercare più stringhe e numeri di riga di output e sfogliare l'output, digitare:

egrep -ne 'null|three'

mostrerò:

2:example two null,  
3:example three,  
4:example four null,   

egrep -ne 'null|three' | less

visualizzerà l'output in una sessione meno

HTH Jun

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.