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

Опубликовано: 2022-07-23
Ноутбук Linux с приглашением bash
Фатмавати Ачмад Заэнури/Shutterstock.com

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

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

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

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

Как использовать каналы в Linux
СВЯЗАННЫЕ Как использовать каналы в Linux

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

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

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

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

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

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

 wc lorem.txt 

Использование wc с файлом с одной длинной строкой текста

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

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

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

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

 кот лорем.txt 

Содержимое файла одной длинной строкой

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

 туалет lorem2.txt
 кошка lorem2.txt 

Использование wc с файлом с большим количеством строк

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

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

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

 wc lorem.txt lorem2.txt 

Использование wc с двумя файлами

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

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

 туалет *.txt *.? 

Использование wc с подстановочными знаками

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

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

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

Использование wc с параметрами строк, слов и байтов

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

 wc -l лорем.txt

wc -w лорем.txt

wc -c лорем.txt

wc -l -c лорем.txt 

Использование wc с комбинациями параметров

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

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

 кошка unicode.txt 

Содержимое файла, содержащего нелатинский символ

Он состоит из трех слов и символа нелатинского алфавита. Мы позволим wc обработать файл с параметром bytes по умолчанию и сделаем это снова, но запросим символы с параметром -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 .

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

СВЯЗАННЫЕ С: Что такое кодировки символов, такие как ANSI и Unicode, и чем они отличаются?

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

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

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

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

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

 меньше исходных файлов-list.txt 

Файл меньшего размера, содержащий нулевые байты

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

 wc ---files0-from=исходный-файлы-список.txt 

wc обрабатывает файл с именами файлов, оканчивающимися нулем

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

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

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

 echo "Посчитайте это для меня" | Туалет
 echo -e "Посчитайте это\nдля меня" | Туалет 

Использование эха для отправки ввода в wc

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

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

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

Список уникальных расширений в текущем дереве каталогов

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

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

 найти ./* -тип f | оборот | вырезать -д'.' -f1 | оборот | сортировать | уникальный | туалет -л 

Добавление wc для подсчета уникальных расширений

СВЯЗАННЫЕ С: Как использовать команду Linux cut

И наконец

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

 wc -L таф.с 

Получение длины самой длинной строки в файле с помощью wc

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

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

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

СВЯЗАННЫЕ: 37 важных команд Linux, которые вы должны знать