Як порахувати рядки в документі?


1076

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

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

30
@ Luv33preet тоді ви просто опинитесь на SO, шукаючи, як вийти з vim
Skylar Ittner

5
@SkylarIttner І якщо вам потрібно знайти спосіб виходу з vim, <esc> :q!це єдина відповідь. (Це жарт. Це видалить усі незбережені зміни. Жарт полягає в тому, що якщо ви не знаєте vim, легко зіпсувати файл, тож краще не зберігати його).
Райан

Відповіді:


2030

Використання 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>
Tensigh

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 man, щоб переглянути аргументи -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враховує символи нового рядка, а не фактичні рядки у файлі. Усі інші команди, що входять до цієї відповіді, дадуть вам правильний номер у випадку, якщо вам потрібні рядки.
growlingchaos

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 роки після того, як було поставлено запитання, і це лише копіювання інших. Перша частина - тривіальна, а друга - все , що додала відповідь привида . Схильність
fedorqui 'ТАК перестаньте шкодити'

4 роки на .. пониження. Давайте подивимось, чи зможемо ми досягти десятиліття довгий цикл!
Демієн Рош

1
Ні, ви помиляєтесь; Відповідь привида не відповідає на початкове запитання. Він дає вам кількість рядків ТА ім'я файлу. Щоб отримати лише ім’я файлу, ви можете зробити: filename.wc -l </filepath/filename.ext. Саме тому я і розмістив відповідь. awk, sed і grep - це дещо неповноцінний спосіб зробити це. Правильний шлях - це той, який я перерахував.
ggb667

8

Використовуйте nlтак:

nl filename

Від man nl:

Запишіть кожен ФАЙЛ до стандартного виводу, додавши номери рядків. Якщо файл FILE відсутній, або коли FILE -, прочитайте стандартне введення.


Це перша відповідь, яку я виявив, що працює з файлом, який містить єдиний рядок тексту, який не закінчується в новому рядку, який 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 Неповна лінія як:

Послідовність одного або декількох символів, що не належать <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
jeb

wc -l <ім'я файлу> дає ім'я файлу, а також кількість рядків у висновку.
Суворий Сарохі

Ні, 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.