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


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?


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

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


43

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

wc -l file

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

awk 'END{print NR}' file

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

grep -c ".*" file

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передать вывод из программы, подобной этой:, которая скажет вам, сколько файлов находится в текущем каталоге (плюс один).


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

24

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

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


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

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;)


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

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': ТОЛЬКО чтобы вернуть цифры .


3

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

cat /etc/fstab | wc -l

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


3

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

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

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

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 .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.