Как считать строки в документе?

1078

У меня есть такие строки, и я хочу знать, сколько строк у меня на самом деле ...

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

Есть ли способ подсчитать их все с помощью команд Linux?

Alucard
источник
4
Откройте файл, используя vim, затем напечатайте g <Ctrl-g>, он покажет вам количество строк, слов, столбцов и байтов
Luv33preet
31
@ Luv33preet, тогда ты просто возвращаешься на SO, разыскиваешь, как выйти из vim
Скайлар Иттнер
5
@SkylarIttner И если вам нужно посмотреть, как выйти из vim, <esc> :q!это единственный ответ. (Это шутка, она удалит все несохраненные изменения - шутка в том, что если вы не знаете vim, то легко испортить файл, поэтому лучше не сохранять его).
Райан

Ответы:

2032

Используйте wc:

wc -l <filename>

Это выведет количество строк в <filename>:

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

Или, чтобы исключить <filename>из результата использования wc -l < <filename>:

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

Вы также можете передать данные в wc:

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63
user85509
источник
18
это замечательно!! вы можете использовать awk, чтобы избавиться от имени файла, добавляемого к номеру строки, следующим образом:wc -l <file> | awk '{print $1}
CheeHow
80
Еще короче, вы могли бы сделатьwc -l < <filename>
Тенси
5
@ GGB667 вы также можете избавиться от имени файла с помощьюcat <file> | wc -l
baptx
14
и watch wc -l <filename>вы можете следить за этим файлом в режиме реального времени. Это полезно для файлов журнала, например.
DarkSide
27
Помните, что wc -l считает "переводы строки". Если у вас есть файл с 2 строками текста и одним символом «новой строки» между ними, wc выведет «1» вместо «2».
Константин
140

Для подсчета всех строк используйте:

$ wc -l file

Для фильтрации и подсчета только строк с использованием шаблона:

$ grep -w "pattern" -c file  

Или используйте -v, чтобы инвертировать совпадение:

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

Смотрите страницу руководства grep, чтобы взглянуть на аргументы -e, -i и -x ...

Лауро Оливейра
источник
Как ни странно, иногда это grep -cработает лучше для меня. Главным образом из-за wc -lнадоедливого префикса пробела.
MarkHu
75
wc -l <file.txt>

Или

command | wc -l
Джон Кугельман
источник
43

Есть много способов. использование wcодин.

wc -l file

другие включают

awk 'END{print NR}' file

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

grep -c ".*" file
ghostdog74
источник
3
Да, но wc -l fileдает вам количество строк И имя файла, чтобы получить только имя файла, которое вы можете сделать:filename.wc -l < /filepath/filename.ext
ggb667
Используя GNU аргумент grep -H возвращает имя файла и количество. grep -Hc ".*" file
Злемини
Я проголосовал за это решение, потому что wc -lсчитает символы новой строки, а не фактические строки в файле. Все остальные команды, включенные в этот ответ, дадут вам правильный номер, если вам нужны строки.
рычание
27

Этот инструмент wcявляется «счетчиком слов» в UNIX и UNIX-подобных операционных системах, но вы также можете использовать его для подсчета строк в файле, добавив эту -lопцию.

wc -l fooбудет считать количество строк в foo. Вы также можете ls -l | wc -lпередать вывод из программы, подобной этой:, которая скажет вам, сколько файлов находится в текущем каталоге (плюс один).

built1n
источник
3
ls -l | wc -l на самом деле даст вам количество файлов в каталоге +1 для общего размера строки. Вы можете сделать, ls -ld * | wc -lчтобы получить правильное количество файлов.
Джошуа Лоуренс Остил
24

Если вы хотите проверить общую строку всех файлов в каталоге, вы можете использовать find и wc:

find . -type f -exec wc -l {} +
Storen
источник
21

Используйте wc:

wc -l <filename>
Вивин Палиат
источник
15

Если вам нужно только количество строк (а не количество строк и глупое имя файла, которое возвращается):

wc -l < /filepath/filename.ext

Как упоминалось ранее, они также работают (но уступают по другим причинам):

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
источник
3
Этот ответ был опубликован через 3 года после того, как был задан вопрос, и он просто копирует другие. Первая часть тривиальна, а вторая - добавлен ответ всего призрака . Downvoting.
Федорки "ТАК прекратить вредить"
4 года спустя. Давайте посмотрим, сможем ли мы получить десятилетнюю полосу пониженных голосов!
Дэмиен Роше
1
Нет, вы не правы; Ответ ghostdog не отвечает на первоначальный вопрос. Это дает вам количество строк и имя файла. Чтобы получить только имя файла, вы можете сделать: filename.wc -l </filepath/filename.ext. Вот почему я разместил ответ. awk, sed и grep - это несколько худшие способы сделать это. Правильный путь - тот, который я перечислил.
ggb667
8

Используйте nlкак это:

nl filename

От man nl:

Запишите каждый ФАЙЛ в стандартный вывод с добавлением номеров строк. Без ФАЙЛА, или когда ФАЙЛ - -, читайте стандартный ввод.

десятичный
источник
Это первый ответ, который я нашел, который работает с файлом, который имеет одну строку текста, которая не заканчивается новой строкой, которая wc -lотображается как 0. Спасибо.
Скотт Джудри
7

Я использовал это:

cat myfile.txt | wc -l

Я предпочитаю его принятому ответу, потому что он не печатает имя файла, и вам не нужно его использовать, awkчтобы это исправить. Принятый ответ:

wc -l myfile.txt

Но я думаю, что лучший ответ GGB667:

wc -l < myfile.txt

Я, вероятно, буду использовать это с этого момента. Это немного короче, чем я. Я придерживаюсь своего старого способа сделать это в случае, если кто-то предпочитает это. Вывод одинаков с этими двумя методами.

Баттл Буткус
источник
3
первый и последний метод одинаковы. последний лучше, потому что он не порождает дополнительный процесс
5

Выше приведен предпочтительный метод, но команда «cat» также может быть полезна:

cat -n <filename>

Покажет вам все содержимое файла с номерами строк.

Йог
источник
5

Я видел этот вопрос, когда искал способ подсчета нескольких строк в файлах, поэтому, если вы хотите подсчитать несколько строк в файле .txt, вы можете сделать это,

cat *.txt | wc -l

он также будет работать на одном файле .txt;)

talsibony
источник
5

wc -l не считает строки.

Да, этот ответ может быть немного опоздал на вечеринку, но я пока не нашел никого, кто документировал бы более надежное решение в ответах.

Вопреки распространенному мнению, POSIX вообще не требует, чтобы файлы заканчивались символом новой строки. Да, определение строки POSIX 3.206 выглядит следующим образом:

Последовательность из нуля или более не <newline> символов плюс завершающий символ.

Однако многие люди не знают, что POSIX также определяет POSIX 3.195 Incomplete Line как:

Последовательность из одного или нескольких не <newline> символов в конце файла.

Следовательно, файлы без трейлинга LFидеально совместимы с POSIX.

Если вы решите не поддерживать оба типа EOF, ваша программа не будет POSIX-совместимой.

В качестве примера, давайте посмотрим на следующий файл.

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

Независимо от EOF, я уверен, что вы согласитесь, что есть две линии. Вы поняли это, посмотрев, сколько строк было запущено, а не посмотрев, сколько строк было завершено. Другими словами, согласно POSIX, эти два файла имеют одинаковое количество строк:

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.

Страница wcсправочника относительно ясна о подсчете новых строк, при этом новая строка является просто 0x0aсимволом:

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

Следовательно, wcдаже не пытается посчитать то, что вы могли бы назвать «линией». Использование wcдля подсчета строк может очень хорошо привести к ошибочным подсчетам, в зависимости от EOF вашего входного файла.

POSIX-совместимое решение

Вы можете использовать grepдля подсчета строк, как в примере выше. Это решение является более надежным и точным, и оно поддерживает все возможные варианты строки в вашем файле:

$ grep -c ^ FILE
Chiru
источник
4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': ТОЛЬКО чтобы вернуть цифры .
AechoLiu
источник
3
wc -l file.txt | cut -f3 -d" "

Возвращает только количество строк

Умур Контачи
источник
3

Перенаправление / передача выходного файла файла wc -lдолжно быть достаточно, как показано ниже:

cat /etc/fstab | wc -l

который затем предоставит нет. только линий.

tk3000
источник
3

Или подсчитайте все строки в подкаталогах с шаблоном имени файла (например, файлы журнала с метками времени в имени файла):

wc -l ./**/*_SuccessLog.csv
jwebuser
источник
2

Я знаю, что это старый, но все же: считать отфильтрованные строки

Мой файл выглядит так:

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

Если я хочу знать, сколько файлов отправлено, хорошо:

grep "OK" <filename> | wc -l

ИЛИ

grep -c "OK" filename
Диего Фернандо Вильярроэль Диас
источник
2

подсчитать количество строк и сохранить результат в переменной, используя эту команду:

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

Константин Ф
источник
1

Как говорили другие, wc -lэто лучшее решение, но для дальнейшего использования вы можете использовать Perl:

perl -lne 'END { print $. }'

$.содержит номер строки и ENDблок будет выполнен в конце скрипта.

Маджид Азими
источник
1
Не работает:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW
1
@VeikkoW работает на меня. Если вы работаете в Windows, применяются другие правила цитирования; но ОП спросил о Linux / Bash.
трипл
1
perl -lne '}{ print $. 'делает то же самое.
Том Фенек
1

Я только что сделал программу для этого (с 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
источник
4
Разве это не похоже на использование F16 для уничтожения сорняков в саду?
Баттл Буткус
1

wc -l <filename>

Это даст вам количество строк и имя файла в выводе.

Например.

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

Вывод

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

использование

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

чтобы получить только количество строк в выводе.

Например.

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

Вывод

63

Суровые Сарохи
источник
Где выгода повторения принятого (десятилетнего) ответа?
Джеб
Потому что я не смог найти команду, чтобы получить только номера строк в выводе в этой теме.
Суровая Сарохи
Это второй пример в принятом ответе. wc -l < filename
Джеб
wc -l <filename> дает имя файла, а также количество строк в выводе.
Суровая Сарохи
Нет, wc -l < filenameотличается wc -l filename, в первую перенаправлением использует и то нет никакого файла на выходе, как показано в ответ от user85509
Джеб
1

Эта встроенная функция переносной оболочки [ℹ]   работает как шарм. Просто добавьте следующий фрагмент в ваш .bashrcфайл (или эквивалент для вашей оболочки) .

# ---------------------------------------------
#  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:]]}
}

Это должно быть полностью совместимо со всеми POSIX-совместимыми оболочками в дополнение к bash и zsh .

blizzrdof77
источник