Поиск по сайту:

Как использовать команду wc в Linux


Подсчет количества строк, слов и байтов в файле полезен, но настоящая гибкость команды Linux wc достигается за счет работы с другими командами. Давайте взглянем.

Что такое команда wc?

Команда wc — это небольшое приложение. Это одна из основных утилит Linux, поэтому ее не нужно устанавливать. Он уже будет на вашем компьютере с Linux.

Вы можете описать то, что он делает, в очень нескольких словах. Он подсчитывает строки, слова и байты в файле или выбранных файлах и выводит результат в окно терминала. Он также может получать входные данные из потока STDIN, что означает, что текст, который вы хотите обработать, может быть передан в него. Именно здесь wc действительно начинает приносить пользу.

Это отличный пример мантры Linux: «Делай одно и делай это хорошо». Поскольку он принимает ввод по конвейеру, его можно использовать в заклинаниях с несколькими командами. Как мы увидим, эта небольшая автономная утилита на самом деле является отличным командным игроком.

Один из способов, которым я использую wc, — это заполнитель в сложной команде или псевдониме, который я придумываю. Если готовая команда потенциально может быть разрушительной и удалять файлы, я часто использую wc в качестве замены реальной, опасной команды.

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

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

Начало работы с туалетом

Самый простой способ использовать wc — передать имя текстового файла в командной строке.

wc lorem.txt

Это заставляет wc сканировать файл, подсчитывать строки, слова и байты и записывать их в окно терминала.

Слова считаются чем-либо, ограниченным пробелами. Являются ли они словами из реального языка или нет, не имеет значения. Если файл не содержит ничего, кроме «frd g lkj», он все равно считается за три слова.

Строки представляют собой последовательности символов, заканчивающиеся либо возвратом каретки, либо концом файла. Неважно, зацикливается ли строка в вашем редакторе или в окне терминала, пока wc не встретит возврат каретки или конец файла, это все равно будет одна и та же строка.

Наш первый пример нашел одну строку во всем файле. Вот содержимое файла «lorem.txt».

cat lorem.txt

Все это считается одной строкой, потому что нет возврата каретки. Сравните это с другим файлом, «lorem2.txt», и с тем, как его интерпретирует wc.

wc lorem2.txt
cat lorem2.txt

На этот раз wc считает 15 строк, потому что в текст вставлены символы возврата каретки, чтобы начать новую строку в определенных точках. Однако, если вы посчитаете строки с текстом в них, вы увидите, что их всего 12.

Остальные три строки — это пустые строки в конце файла. Они содержат только возврат каретки. Несмотря на то, что в этих строках нет текста, была начата новая строка, и поэтому wc считает их таковыми.

Мы можем передать в wc столько файлов, сколько захотим.

wc lorem.txt lorem2.txt

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

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

wc *.txt *.?

Параметры командной строки

По умолчанию wc отображает строки, слова и байты в каждом файле. Это аналогично использованию параметров -l (строки), -w (слова) и -c (байты).

wc lorem.txt
wc -l -w -c lorem.txt

Мы можем указать, какую комбинацию цифр мы хотим видеть.

wc -l lorem.txt

wc -w lorem.txt

wc -c lorem.txt

wc -l -c lorem.txt

Особое внимание следует обратить на последнюю цифру, сгенерированную опцией -c (bytes). Многие ошибочно принимают это за подсчет символов. На самом деле он подсчитывает байты. Количество символов и количество байтов вполне может совпадать. Но не всегда.

Давайте посмотрим на содержимое файла с именем «unicode.txt».

cat unicode.txt

Он состоит из трех слов и символа нелатинского алфавита. Мы позволим wc обработать файл с настройкой по умолчанию байты и сделаем это снова, но запросим символы с -m (символы).

wc unicode.txt
wc -l -w -m unicode.txt

Байтов больше, чем символов.

Давайте посмотрим на шестнадцатеричный дамп файла и посмотрим, что происходит. Параметр -C команды hexdump (канонический) отображает байты в файле в строках по 16, а их простой эквивалент ASCII (если он есть) отображается в конце линия. Если соответствующий символ ASCII отсутствует, вместо него отображается точка «.».

hexdump -C unicode.txt

В ASCII шестнадцатеричное значение 0x20 представляет символ пробела. Если мы сосчитаем три значения слева, мы увидим, что следующее значение является символом пробела. Таким образом, эти первые три значения 0x62, 0x6f и 0x79 представляют буквы в слове «мальчик».

Переходя через 0x20, мы видим еще один набор из трех шестнадцатеричных значений: 0x63, 0x61 и 0x74. Они произносятся как «кошка». Перескакивая через следующий символ пробела, мы видим еще три значения букв в слове «собака». Это 0x64, 0x5f и 0x67.

Сразу за словом «собака» мы видим пробел 0x20 и еще пять шестнадцатеричных значений. Последние два — это возврат каретки, 0x0a.

Остальные три байта представляют нелатинский символ, который мы обвели зеленым. Это символ Unicode, и для его кодирования требуется три байта. Это 0xe1, 0xaf и 0x8a.

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

Получение имен файлов из файла

Есть еще один способ указать имена файлов для wc. Вы можете поместить имена файлов в файл и передать имя этого файла в wc. Он открывает файл, извлекает имена файлов и обрабатывает их, как если бы они были переданы в командной строке. Это позволяет вам хранить произвольную коллекцию имен файлов для повторного использования.

Но есть подвох, и он большой. Имена файлов должны заканчиваться null, а не возвратом каретки. То есть после каждого имени файла должен быть нулевой байт 0x00 вместо обычного байта возврата каретки 0x0a.

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

Вот наш файл, содержащий имена файлов. Открыв его в less, вы увидите странные символы «^@», которые less использует для обозначения нулевых байтов.

less source-files-list.txt

Чтобы использовать файл с wc, нам нужно использовать опцию --files0-from (читать ввод из) и передать имя файла, содержащего имена файлов.

wc ---files0-from=source-files-list.txt

Файлы обрабатываются точно так же, как если бы они были предоставлены в командной строке.

Вход трубопровода в туалет

Гораздо более распространенный, гибкий и продуктивный способ отправки ввода в wc — это передача вывода других команд в wc . Мы можем продемонстрировать это с помощью команды echo.

echo "Count this for me" | wc
echo -e "Count this\nfor me" | wc

Вторая команда echo использует параметр -e (экранированные символы), чтобы разрешить экранированные последовательности, такие как код форматирования новой строки «\n». Это вставляет новую строку, в результате чего wc видит ввод как две строки.

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

find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq

  • find рекурсивно ищет файлы (тип -f), начиная с текущего каталога. rev меняет имена файлов на противоположные.
  • cut извлекает первое поле (-f1), определяя разделитель полей как точку «.» и читая из « front» перевернутого имени файла до первой найденной точки. Теперь мы извлекли расширение файла.
  • rev инвертирует извлеченное первое поле.
  • sort сортирует их в алфавитном порядке по возрастанию.
  • uniq выводит список уникальных записей в окно терминала.

Эта команда выводит список всех уникальных расширений файлов в текущем каталоге и любых подкаталогах.

Если мы добавим параметр -c (счетчик) в команду uniq, он будет подсчитывать вхождения для каждого типа расширения. Но если мы хотим узнать, сколько существует разных уникальных расширений файлов, мы можем убрать wc как последнюю команду в строке и использовать -l (lines) вариант.

find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq | wc -l

И наконец

Вот последний трюк, который wc может сделать для вас. Он сообщит вам длину самой длинной строки в файле. К сожалению, он не говорит вам, какая это линия. Это просто дает вам длину.

wc -L taf.c

Остерегайтесь, однако, что вкладки считаются как восемь пробелов. В моем редакторе в начале этой строки есть три табуляции с двумя пробелами. Его реальная длина составляет 124 символа. Таким образом, заявленная цифра искусственно завышена.

Я бы отнесся к этой функции с большой долей скептицизма. И под этим я подразумеваю не использовать его. Его вывод вводит в заблуждение.

Несмотря на свои причуды, wc — отличный инструмент для использования в конвейерных командах, когда вам нужно подсчитать все виды значений, а не только слова в файле.