Come contare le righe in un documento?


1077

Ho linee come queste e voglio sapere quante linee ho effettivamente ...

09:16:39 AM  all    2.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   94.00
09:16:40 AM  all    5.00    0.00    0.00    4.00    0.00    0.00    0.00    0.00   91.00
09:16:41 AM  all    0.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:42 AM  all    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:43 AM  all    0.00    0.00    1.00    0.00    1.00    0.00    0.00    0.00   98.00
09:16:44 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:16:45 AM  all    2.00    0.00    6.00    0.00    0.00    0.00    0.00    0.00   92.00

C'è un modo per contarli tutti usando i comandi linux?


4
Apri il file usando vim, quindi digita g <Ctrl-g>, ti mostrerà il numero di righe, parole, colonne e byte
Luv33preet

31
@ Luv33preet, allora ti ritrovi di nuovo su SO, guardando come uscire da Vim
Skylar Ittner,

5
@SkylarIttner E se hai bisogno di cercare come uscire da Vim, <esc> :q!è l'unica risposta. (Questo è uno scherzo, questo eliminerà tutte le modifiche non salvate - lo scherzo è che se non conosci vim è facile rovinare un file, quindi meglio non salvarlo).
Ryan,

Risposte:


2031

Utilizzare wc:

wc -l <filename>

Questo genererà il numero di righe in <filename>:

$ wc -l /dir/file.txt
3272485 /dir/file.txt

Oppure, per omettere <filename>il risultato utilizzare wc -l < <filename>:

$ wc -l < /dir/file.txt
3272485

Puoi anche reindirizzare i dati a wc:

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63

18
è fantastico !! potresti usare awk per sbarazzarti del nome del file aggiunto al numero di riga in quanto tale:wc -l <file> | awk '{print $1}
CheeHow,

80
Ancora più breve, potresti farlowc -l < <filename>
Tensigh,

5
@ GGB667 puoi anche eliminare il nome del file concat <file> | wc -l
baptx il

14
e con watch wc -l <filename>te puoi seguire questo file in tempo reale. È utile, ad esempio, per i file di registro.
DarkSide,

27
Attenzione che wc -l conta "newline". Se hai un file con 2 righe di testo e un simbolo "newline" tra loro, wc produrrà "1" invece di "2".
Konstantin,

140

Per contare tutte le linee usa:

$ wc -l file

Per filtrare e contare solo le linee con motivo utilizzare:

$ grep -w "pattern" -c file  

Oppure usa -v per invertire la corrispondenza:

$ grep -w "pattern" -c -v file 

Vedi la pagina man di grep per dare un'occhiata agli argomenti -e, -i e -x ...


Stranamente a volte grep -cfunziona meglio per me. Principalmente a causa del wc -lfastidioso prefisso dello spazio di riempimento "feature".
MarkHu,


43

ci sono molti modi. usare wcè uno.

wc -l file

altri includono

awk 'END{print NR}' file

sed -n '$=' file (GNU sed)

grep -c ".*" file

3
Sì, ma wc -l fileti dà il numero di righe E il nome del file per ottenere solo il nome del file che puoi fare:filename.wc -l < /filepath/filename.ext
ggb667

L'uso dell'argomento GNU grep -H restituisce il nome del file e il conteggio. grep -Hc ".*" file
Zlemini,

Ho votato questa soluzione perché wc -lconta i caratteri di nuova riga e non le righe effettive in un file. Tutti gli altri comandi inclusi in questa risposta ti daranno il numero giusto nel caso in cui tu abbia bisogno delle linee.
growlingchaos,

27

Lo strumento wcè il "contatore di parole" nei sistemi operativi simili a UNIX e UNIX, ma è anche possibile utilizzarlo per contare le righe in un file aggiungendo l' -lopzione.

wc -l fooconterà il numero di righe in foo. È inoltre possibile reindirizzare l'output da un programma come questo:, ls -l | wc -lche indicherà quanti file si trovano nella directory corrente (più uno).


3
ls -l | wc -l fornirà effettivamente il numero di file nella directory +1 per la riga delle dimensioni totali. puoi fare ls -ld * | wc -lper ottenere il numero corretto di file.
Joshua Lawrence Austill,

24

Se vuoi controllare la linea totale di tutti i file in una directory, puoi usare find e wc:

find . -type f -exec wc -l {} +


15

Se tutto ciò che vuoi è il numero di righe (e non il numero di righe e il nome del file stupido che ritorna):

wc -l < /filepath/filename.ext

Come già accennato, anche questi funzionano (ma sono inferiori per altri motivi):

awk 'END{print NR}' file       # not on all unixes
sed -n '$=' file               # (GNU sed) also not on all unixes
grep -c ".*" file              # overkill and probably also slower

3
Questa risposta è stata pubblicata 3 anni dopo la domanda e ne sta copiando altre. La prima parte è banale e la seconda è tutta la risposta di ghostdog che stava aggiungendo. Downvoting.
fedorqui "SO smettere di danneggiare" il

4 anni dopo ... downvoting. Vediamo se riusciamo a ottenere una serie di downvote lunga un decennio!
Damien Roche,

1
No, hai torto; La risposta di ghostdog non risponde alla domanda originale. Ti dà il numero di righe E il nome del file. Per ottenere solo il nome file è possibile eseguire: nomefile.wc -l </filepath/filename.ext. Ecco perché ho pubblicato la risposta. awk, sed e grep sono tutti modi leggermente inferiori per farlo. Il modo corretto è quello che ho elencato.
ggb667,

8

Usa nlcosì:

nl filename

Da man nl:

Scrivi ogni FILE nell'output standard, con i numeri di riga aggiunti. Senza FILE o quando FILE è -, leggere l'input standard.


Questa è la prima risposta che ho trovato che funziona con un file che ha una singola riga di testo che non termina in una nuova riga, che wc -lriporta come 0. Grazie.
Scott Joudry,

7

Sto usando questo:

cat myfile.txt | wc -l

Lo preferisco alla risposta accettata perché non stampa il nome file e non è necessario utilizzarlo awkper risolverlo. Risposta accettata:

wc -l myfile.txt

Ma penso che la migliore sia la risposta di GGB667:

wc -l < myfile.txt

Probabilmente lo userò da ora in poi. È leggermente più corto del mio modo. Sto mettendo su il mio vecchio modo di farlo nel caso qualcuno lo preferisca. L'output è lo stesso con questi due metodi.


3
il primo e l'ultimo metodo sono gli stessi. l'ultimo è migliore perché non

5

Sopra sono il metodo preferito ma il comando "cat" può anche essere utile:

cat -n <filename>

Ti mostrerà l'intero contenuto del file con i numeri di riga.


5

Ho visto questa domanda mentre cercavo un modo per contare più righe di file, quindi se vuoi contare più righe di un file .txt puoi farlo,

cat *.txt | wc -l

funzionerà anche su un file .txt;)


5

wc -l non conta le righe.

Sì, questa risposta potrebbe essere un po 'in ritardo alla festa, ma non ho ancora trovato nessuno che documenti una soluzione più solida nelle risposte.

Contrariamente alla credenza popolare, POSIX non richiede affatto che i file finiscano con un carattere di nuova riga. Sì, la definizione di una riga POSIX 3.206 è la seguente:

Una sequenza di zero o più caratteri non <newline> più un carattere finale.

Tuttavia, ciò di cui molte persone non sono a conoscenza è che POSIX definisce POSIX 3.195 Linea incompleta come:

Una sequenza di uno o più caratteri non <newline> alla fine del file.

Pertanto, i file senza trascinamento LFsono perfettamente conformi a POSIX.

Se si sceglie di non supportare entrambi i tipi di EOF, il programma non è conforme a POSIX.

Ad esempio, diamo un'occhiata al seguente file.

1 This is the first line.
2 This is the second line.

Indipendentemente dall'EOF, sono sicuro che accetteresti che ci sono due linee. L'hai capito guardando quante linee sono state avviate, non guardando quante linee sono state terminate. In altre parole, come per POSIX, questi due file hanno entrambi la stessa quantità di righe:

1 This is the first line.\n
2 This is the second line.\n
1 This is the first line.\n
2 This is the second line.

La pagina man è relativamente chiara sul wcconteggio delle nuove righe, con una nuova riga che è solo un 0x0apersonaggio:

NAME
       wc - print newline, word, and byte counts for each file

Quindi, wcnon prova nemmeno a contare quella che potresti chiamare una "linea". L'uso del wcconteggio delle righe può portare a conteggi errati, a seconda dell'EOF del file di input.

Soluzione conforme a POSIX

Puoi usare grepper contare le linee proprio come nell'esempio sopra. Questa soluzione è sia più solida che precisa e supporta tutti i diversi tipi di ciò che potrebbe essere una linea nel tuo file:

$ grep -c ^ FILE

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': Per restituire SOLO i numeri delle cifre .


3

Il reindirizzamento / Piping dell'output del file wc -ldovrebbe essere sufficiente, come il seguente:

cat /etc/fstab | wc -l

che quindi fornirebbe il no. solo di linee.


3

Oppure conta tutte le righe nelle sottodirectory con un modello di nome file (ad es. File di registro con timestamp nel nome del file):

wc -l ./**/*_SuccessLog.csv

2

So che questo è vecchio ma comunque: conta le linee filtrate

Il mio file è simile a:

Number of files sent
Company 1 file: foo.pdf OK
Company 1 file: foo.csv OK
Company 1 file: foo.msg OK
Company 2 file: foo.pdf OK
Company 2 file: foo.csv OK
Company 2 file: foo.msg Error
Company 3 file: foo.pdf OK
Company 3 file: foo.csv OK
Company 3 file: foo.msg Error
Company 4 file: foo.pdf OK
Company 4 file: foo.csv OK
Company 4 file: foo.msg Error

Se voglio sapere quanti file vengono inviati OK:

grep "OK" <filename> | wc -l

O

grep -c "OK" filename

2

conta il numero di righe e memorizza il risultato nella variabile usa questo comando:

count=$(wc -l < file.txt) echo "Number of lines: $count"


1

Come altri hanno detto wc -lè la soluzione migliore, ma per riferimento futuro puoi usare Perl:

perl -lne 'END { print $. }'

$.contiene il numero di riga e il ENDblocco verrà eseguito alla fine dello script.


1
Non funziona:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW,

1
@VeikkoW Funziona per me. Se sei su Windows, si applicano regole di quotazione diverse; ma l'OP ha chiesto di Linux / Bash.
tripleee,

1
perl -lne '}{ print $. 'fa lo stesso.
Tom Fenech,


1

wc -l <filename>

Questo ti darà il numero di righe e il nome del file in output.

Per esempio.

wc -l 24-11-2019-04-33-01-url_creator.log

Produzione

63 24-11-2019-04-33-01-url_creator.log

Uso

wc -l <filename>|cut -d\ -f 1

per ottenere solo il numero di righe nell'output.

Per esempio.

wc -l 24-11-2019-04-33-01-url_creator.log|cut -d\ -f 1

Produzione

63


Qual è il vantaggio di ripetere la risposta accettata (dieci anni)?
Jeb

Perché non sono riuscito a trovare il comando per ottenere solo i numeri di riga nell'output in questo thread.
Harsh Sarohi,

È il secondo esempio nella risposta accettata. wc -l < filename
Jeb

wc -l <nome file> indica il nome file e il numero di righe nell'output.
Harsh Sarohi

No, wc -l < filenameè diverso wc -l filename, il primo utilizza il reindirizzamento e quindi non esiste alcun nome file nell'output, come mostrato nella risposta dell'utente85509
jeb

1

Questa funzione di shell portatile drop-in [ℹ]   funziona come un fascino. Aggiungi il seguente frammento al tuo .bashrcfile (o l'equivalente per il tuo ambiente shell) .

# ---------------------------------------------
#  Count lines in a file
#
#  @1 = path to file
#
#  EXAMPLE USAGE: `count_file_lines $HISTFILE`
# ---------------------------------------------
count_file_lines() {
    local subj=$(wc -l $1)
    subj="${subj//$1/}"
    echo ${subj//[[:space:]]}
}

Questo dovrebbe essere pienamente compatibile con tutte le shell conformi a POSIX oltre a bash e zsh .

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.