Linux посчитать количество вхождений слова в файле

Обновлено: 07.07.2024

Анализ файлов - неотъемлемая часть работы с ними. Иногда возникает необходимость подсчитать количество строк или слов в тексте. С этой задачей эффективно справляется команда wc Linux.

Утилита устанавливается по умолчанию практически во всех дистрибутивах GNU/Linux. В этой статье рассмотрим её функции и применение на практике.

Синтаксис команды wc

Для запуска утилиты откройте терминал и введите:

Терминал будет ожидать ввода данных. После нажатия комбинации клавиш Ctrl + D командный интерпретатор завершит работу программы и выведет три числа, обозначающих количество строк, слов и байт введённой информации.

Утилита может обрабатывать файлы. Стандартная инструкция выглядит так:

  • wc — имя утилиты;
  • file — название обрабатываемого файла.

Программа также может принимать параметры для анализа отдельных значений. Наиболее используемые из них приведены в таблице ниже:

Параметр Длинный вариант Значение
-c --bytes Отобразить размер объекта в байтах
-m --count Показать количесто символов в объекте
-l --lines Вывести количество строк в объекте
-w --words Отобразить количество слов в объекте

Под объектом следует понимать файл или данные, полученные на стандартный поток ввода.

Команда может обработать несколько файлов, если указать их через пробел или выбрать по шаблону.

Применение команды wc

Обработка стандартного потока ввода с завершением через Ctrl + D:

Команда wc

Согласно анализу, было введено 4 строки, содержащих 5 слов, объёмом в 35 байт.

Перенаправление потока вывода на вход wc:

Перенаправление на wc

Обработка всех файлов с расширением .sh в текущем каталоге:

Обработка bash-скриптов wc

В конце выводится итоговая информация, суммирующая значения для каждого столбца.

Выведем только количество символов и строк двух файлов:

Количество символов и строк wc

Обратите внимание: порядок указания параметров не влияет на итоговый вид информации. Программа всегда выводит данные в виде СТРОК — СЛОВ — БАЙТ (СИМВОЛОВ) [— ФАЙЛ]. Если какой-то параметр будет отсутствовать, его столбец просто проигнорируется, не задевая остальные. Количество символов будет стоять первым, если в команде содержался и вывод байт.

Вывод

Команда wc Linux является эффективным инструментом при анализе файлов в GNU/Linux. Она может обрабатывать как стандартный поток ввода, так и несколько файлов одновременно. Для извлечения конкретных данных используются параметры командной строки.

Текстовые процессоры с графическим пользовательским интерфейсом и приложения для создания заметок имеют индикаторы информации или подробностей для деталей документа, таких как количество страниц, слов и символов, список заголовков в текстовых процессорах, таблица содержания в некоторых редакторах уценки и т. Д. И поиск появление слов или фраз так же просто, как нажатие Ctrl + F и ввод символов, которые вы хотите найти.

Графический интерфейс действительно упрощает все, но что происходит, когда вы можете работать только из командной строки и хотите проверить, сколько раз слово, фраза или символ встречается в текстовом файле? Это почти так же просто, как и при использовании графического интерфейса, если у вас есть правильная команда, и я собираюсь рассказать вам, как это делается.

Предположим, у вас есть файл example.txt , содержащий предложения:

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


Использование только grep -c будет подсчитывать количество строк, содержащих совпадающее слово, вместо общего количества совпадений. Параметр -o указывает grep выводить каждое совпадение в уникальной строке, а затем wc -l указывает wc подсчитывать количество строк. Таким образом определяется общее количество совпадающих слов.

Другой подход - преобразовать содержимое входного файла с помощью команды tr так, чтобы все слова находились в одной строке, а затем использовать grep -c для подсчета этого количества совпадений.


Это как вы проверяете появление слова со своего терминала? Поделитесь с нами своим опытом и дайте нам знать, если у вас есть другой способ выполнить задачу.

grep -c полезен для определения количества встреч строк в файле, но он учитывает каждый случай только один раз в строке. Как посчитать несколько вхождений на строку?

Я ищу что-то более элегантное, чем:

Я знаю, grep это указано, но для всех ack , кто использует , ответ просто ack -ch <pattern> .

grep's -o будет выводить только совпадения, игнорируя строки; wc можно их посчитать

Это также будет соответствовать «иглам» или «многоигольным иглам».
Только отдельные слова:

Обратите внимание, что для этого требуется GNU grep (Linux, Cygwin, FreeBSD, OSX). @Geek \ b соответствует границе слова, \ B соответствует НЕ границе слова. Ответ выше был бы более правильным, если бы он использовал \ b на обоих концах. Для подсчета вхождений в каждой строке используйте параметр grep -n и uniq -c . grep -no '\ <needle \>' file | uniq -c @jameswarren uniq удаляет только смежные идентичные строки, которые вам нужно sort перед подачей, uniq если вы еще не уверены, что дубликаты всегда будут соседними.

Если у вас есть GNU Grep (всегда на Linux и Cygwin, иногда в других местах), вы можете рассчитывать выходные строки из grep -o : grep -o needle | wc -l .

С Perl, вот несколько способов, которые я нахожу более элегантными, чем ваш (даже после исправления ).

При использовании только инструментов POSIX одним из подходов, если это возможно, является разбиение ввода на строки с одним соответствием перед передачей его в grep. Например, если вы ищете целые слова, то сначала превратите каждый несловарный символ в новую строку.

В противном случае, нет стандартной команды для выполнения этой конкретной части обработки текста, поэтому вам нужно переключиться на sed (если вы мазохист) или awk.

Вот более простое решение, использующее sed и grep , которое работает со строками или даже регулярными выражениями, но не работает в нескольких угловых случаях с закрепленными шаблонами (например, оно находит два вхождения ^needle или \bneedle в needleneedle ).

Обратите внимание, что в приведенных выше заменах sed я имел \n в виду перевод строки. Это стандартно в части шаблона, но в тексте замены, для переносимости, используется замена на обратную косую черту для новой строки \n .

grep -c полезен для определения количества строк в файле, но он учитывает только каждый раз один раз в строке. Как подсчитать множественные вхождения в строке?

Я ищу что-то более элегантное, чем:

grep's -o выводит только совпадения, игнорируя строки; wc может подсчитать их:

Это также будет соответствовать «иглам» или «многоуровневому».
Только отдельные слова:

Если у вас есть GNU grep (всегда на Linux и Cygwin, иногда в другом месте), вы можете подсчитать выходные строки из grep -o : grep -o needle | wc -l .

С Perl, вот несколько способов, которые я нахожу более элегантными, чем ваши (даже после того, как он фиксированной ).

При использовании только инструментов POSIX один подход, если это возможно, состоит в том, чтобы разделить входные данные на строки с одним совпадением, прежде чем передавать его в grep. Например, если вы ищете целые слова, сначала переверните каждый символ без слова в новую строку.

В противном случае стандартная команда не будет выполнять этот конкретный бит обработки текста, поэтому вам нужно обратиться к sed (если вы мазохист) или awk.

Вот более простое решение, использующее sed и grep , который работает для строк или даже по отдельности, но не работает в нескольких угловых случаях с привязанными шаблонами ( например, он находит два вхождения ^needle или \bneedle в needleneedle ).

Обратите внимание, что в приведенных выше методах sed я использовал \n для обозначения новой строки. Это стандартно в части шаблона, но в заменяющем тексте, для переносимости, замените обратную косую черту-новую строку для \n .

Другое решение, использующее awk и needle в качестве разделителя полей:

Если вы хотите совместить needle , за которым следует пунктуация, измените разделитель полей соответственно i.e.

Или используйте класс: [^[:alnum:]] , чтобы охватить все неабсолютные символы.

Если, как и я, вы действительно хотели "оба: каждый раз один раз", (это на самом деле "или два раза"), то это просто:

и проверьте вывод 2 .

Преимущество этого подхода (если ровно один раз , что вы хотите) заключается в том, что он легко масштабируется.

В вашем примере выводится только количество вхождений в строке, а не общее количество в файле. Если это то, что вы хотите, что-то вроде этого может работать:

Читайте также: