Como contar linhas em um documento?

1077

Eu tenho linhas como essas e quero saber quantas linhas realmente tenho ...

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

Existe uma maneira de contar todos eles usando comandos linux?

Alucard
fonte
4
Abrir arquivo usando o vim, digite g <Ctrl-g>, Ela vai mostrar número de linhas, palavras, colunas e bytes
Luv33preet
31
@ Luv33preet então você só se encontra de volta no SO, olhando para cima como para sair vim
Skylar Ittner
5
@ SkylarIttner E se você precisar saber como sair do vim, <esc> :q!é a única resposta. (Isso é uma piada, isso excluirá todas as alterações não salvas - a piada é que, se você não conhece o vim, é fácil bagunçar um arquivo, é melhor não salvá-lo).
21718 Ryan

Respostas:

2031

Use wc:

wc -l <filename>

Isso produzirá o número de linhas em <filename>:

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

Ou, para omitir <filename>o resultado, use wc -l < <filename>:

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

Você também pode canalizar dados para wc:

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63
user85509
fonte
18
isso é ótimo!! que você pode usar awk para se livrar do nome do arquivo anexado ao número de linha como tal:wc -l <file> | awk '{print $1}
CheeHow
80
Ainda mais curto, você poderia fazerwc -l < <filename>
Tensigh 16/05
5
@ GGB667 você também pode se livrar do nome do arquivo comcat <file> | wc -l
baptx 10/02
14
e watch wc -l <filename>você pode acompanhar esse arquivo em tempo real. Isso é útil para arquivos de log, por exemplo.
DarkSide 2/06
27
Cuidado que wc -l conta com "novas linhas". Se você tiver um arquivo com 2 linhas de texto e um símbolo de "nova linha" entre eles, o wc exibirá "1" em vez de "2".
Konstantin
140

Para contar todas as linhas, use:

$ wc -l file

Para filtrar e contar apenas linhas com padrão, use:

$ grep -w "pattern" -c file  

Ou use -v para inverter a correspondência:

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

Consulte a página do manual grep para ver os argumentos -e, -i e -x ...

Lauro Oliveira
fonte
Estranhamente, às vezes, grep -cfunciona melhor para mim. Principalmente devido ao wc -lprefixo de espaço de preenchimento "recurso" irritante.
precisa saber é
75
wc -l <file.txt>

Ou

command | wc -l
John Kugelman
fonte
43

existem muitos caminhos. usando wcé um.

wc -l file

outros incluem

awk 'END{print NR}' file

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

grep -c ".*" file
ghostdog74
fonte
3
Sim, mas wc -l filefornece o número de linhas E o nome do arquivo para obter apenas o nome do arquivo que você pode fazer:filename.wc -l < /filepath/filename.ext
ggb667 22/11
O uso do argumento GNU grep -H retorna o nome do arquivo e a contagem. grep -Hc ".*" file
Zlemini 28/10
Votei nessas soluções porque wc -lconta caracteres de nova linha e não as linhas reais de um arquivo. Todos os outros comandos incluídos nesta resposta fornecerão o número certo, caso você precise das linhas.
growlingchaos
27

A ferramenta wcé o "contador de palavras" nos sistemas operacionais UNIX e UNIX, mas você também pode usá-lo para contar linhas em um arquivo, incluindo o-l opção

wc -l foocontará o número de linhas em foo. Você também pode canalizar a saída de um programa como este:, ls -l | wc -lque informará quantos arquivos estão no diretório atual (mais um).

built1n
fonte
3
ls -l | wc -l realmente fornecerá o número de arquivos no diretório +1 para a linha de tamanho total. você pode fazer ls -ld * | wc -lpara obter o número correto de arquivos.
Joshua Lawrence Austill
24

Se você deseja verificar a linha total de todos os arquivos em um diretório, pode usar find e wc:

find . -type f -exec wc -l {} +
Storen
fonte
21

Use wc:

wc -l <filename>
Vivin Paliath
fonte
15

Se tudo o que você deseja é o número de linhas (e não o número de linhas e o nome estúpido do arquivo retornando):

wc -l < /filepath/filename.ext

Como mencionado anteriormente, eles também funcionam (mas são inferiores por outros motivos):

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
ggb667
fonte
3
Esta resposta foi publicada três anos após a pergunta e está apenas copiando outras. A primeira parte é trivial e a segunda é a resposta de todos que o ghostdog adicionou. Downvoting.
fedorqui 'ASSIM, pare de prejudicar'
4 anos em .. voto negativo. Vamos ver se conseguimos uma década de votos negativos!
Damien Roche
1
Não, você está errado; A resposta do ghostdog não responde à pergunta original. Fornece o número de linhas E o nome do arquivo. Para obter apenas o nome do arquivo, você pode fazer: filename.wc -l </filepath/filename.ext. Foi por isso que postei a resposta. awk, sed e grep são maneiras ligeiramente inferiores de fazer isso. A maneira correta é a que eu listei.
ggb667
8

Use nlassim:

nl filename

De man nl:

Escreva cada arquivo na saída padrão, com os números de linha adicionados. Sem FILE, ou quando FILE for -, leia a entrada padrão.

decimal
fonte
Esta é a primeira resposta que encontrei que funciona com um arquivo que possui uma única linha de texto que não termina em uma nova linha, que wc -linforma como 0. Obrigado.
Scott Joudry
7

Eu tenho usado isso:

cat myfile.txt | wc -l

Prefiro que a resposta aceita, porque não imprime o nome do arquivo e você não precisa awkcorrigi-lo. Resposta aceita:

wc -l myfile.txt

Mas acho que o melhor é a resposta do GGB667:

wc -l < myfile.txt

Provavelmente vou usar isso a partir de agora. É um pouco mais curto que o meu caminho. Estou colocando minha maneira antiga de fazê-lo, caso alguém prefira. A saída é a mesma com esses dois métodos.

Buttle Butkus
fonte
3
o primeiro e o último método são os mesmos. o último é melhor porque não gera um processo extra #
5

Acima estão o método preferido, mas o comando "cat" também pode ser útil:

cat -n <filename>

Irá mostrar todo o conteúdo do arquivo com números de linha.

Yogi
fonte
5

Vi essa pergunta enquanto procurava uma maneira de contar várias linhas de arquivos. Portanto, se você quiser contar várias linhas de um arquivo .txt, poderá fazer isso,

cat *.txt | wc -l

também será executado em um arquivo .txt;)

talsibony
fonte
5

wc -l não conta linhas.

Sim, essa resposta pode ser um pouco atrasada para a parte, mas ainda não encontrei ninguém documentando uma solução mais robusta nas respostas.

Ao contrário da crença popular, o POSIX não exige que os arquivos terminem com um caractere de nova linha. Sim, a definição de uma linha POSIX 3.206 é a seguinte:

Uma sequência de zero ou mais caracteres não <newline> mais um caractere final.

No entanto, o que muitas pessoas desconhecem é que o POSIX também define a Linha Incompleta do POSIX 3.195 como:

Uma sequência de um ou mais caracteres não <newline> no final do arquivo.

Portanto, os arquivos sem rastro LFsão perfeitamente compatíveis com POSIX.

Se você optar por não oferecer suporte aos dois tipos de EOF, seu programa não é compatível com POSIX.

Como um exemplo, vamos dar uma olhada no seguinte arquivo.

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

Não importa o EOF, tenho certeza que você concorda que há duas linhas. Você descobriu isso olhando para quantas linhas foram iniciadas, não para quantas linhas foram terminadas. Em outras palavras, conforme o POSIX, esses dois arquivos têm a mesma quantidade de linhas:

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.

A página de manual é relativamente clara sobre a wccontagem de novas linhas, com uma nova linha sendo apenas um 0x0apersonagem:

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

Portanto, wcnem tente contar o que você pode chamar de "linha". Usar wcpara contar linhas pode muito bem levar a contas incorretas, dependendo do EOF do seu arquivo de entrada.

Solução compatível com POSIX

Você pode usar greppara contar linhas, como no exemplo acima. Essa solução é mais robusta e precisa e suporta todos os diferentes tipos de linhas que podem ser no seu arquivo:

$ grep -c ^ FILE
Chiru
fonte
4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': Para retornar os números dos dígitos APENAS .
AechoLiu
fonte
3
wc -l file.txt | cut -f3 -d" "

Retorna apenas o número de linhas

Umur Kontacı
fonte
3

Redirecionar / canalizar a saída do arquivo para wc -ldeve ser suficiente, como o seguinte:

cat /etc/fstab | wc -l

que então forneceria o não. somente de linhas.

tk3000
fonte
3

Ou conte todas as linhas em subdiretórios com um padrão de nome de arquivo (por exemplo, arquivos de log com registros de data e hora no nome do arquivo):

wc -l ./**/*_SuccessLog.csv
jwebuser
fonte
2

Sei que isso é antigo, mas ainda assim: conte linhas filtradas

Meu arquivo se parece com:

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 eu quiser saber quantos arquivos foram enviados, clique em OK:

grep "OK" <filename> | wc -l

OU

grep -c "OK" filename
Diego Fernando Villarroel Diaz
fonte
2

Para contar o número de linhas e armazenar o resultado na variável, use este comando:

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

Konstantin F
fonte
1

Como outros disseram, wc -lé a melhor solução, mas para referência futura você pode usar o Perl:

perl -lne 'END { print $. }'

$.contém o número da linha e o ENDbloco será executado no final do script.

Majid Azimi
fonte
1
Não funciona:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW
1
@VeikkoW Funciona para mim. Se você estiver no Windows, diferentes regras de cotação se aplicam; mas o OP perguntou sobre Linux / Bash.
Tripleee
1
perl -lne '}{ print $. 'faz o mesmo.
Tom Fenech
1

Acabei de criar um programa para fazer isso (com node)

npm install gimme-lines
gimme-lines verbose --exclude=node_modules,public,vendor --exclude_extensions=html

https://github.com/danschumann/gimme-lines/tree/master

Funkodebat
fonte
4
Não é como usar um F16 para matar ervas daninhas de jardim?
Buttle Butkus
1

wc -l <filename>

Isso fornecerá o número de linhas e o nome do arquivo na saída.

Por exemplo.

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

Resultado

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

Usar

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

para obter apenas o número de linhas na saída.

Por exemplo.

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

Resultado

63

Harsh Sarohi
fonte
Onde está o benefício de repetir a resposta aceita (dez anos)?
jeb 6/01
Porque eu não consegui encontrar o comando para obter apenas números de linha na saída neste segmento.
Harsh Sarohi
É o segundo exemplo na resposta aceita. wc -l < filename
jeb 6/01
wc -l <nome do arquivo> fornece o nome do arquivo, bem como o número de linhas na saída.
Harsh Sarohi
Não, wc -l < filenameé diferente wc -l filename, o primeiro redirecionamento usos e então não há qualquer nome de arquivo na saída, como mostrado na resposta de user85509
jeb
1

Essa função de shell portátil suspensa [ℹ]   funciona como um encanto. Basta adicionar o seguinte trecho ao seu .bashrcarquivo (ou o equivalente ao seu 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:]]}
}

Isso deve ser totalmente compatível com todos os shells compatíveis com POSIX, além do bash e zsh .

blizzrdof77
fonte