Команда cat в Linux – что делает, для чего нужна

Команда cat – одна из самых популярных и часто используемых утилит в операционных системах Linux и Unix-подобных системах. Название команды произошло от английского слова concatenate, что переводится как «объединять» или «сцеплять». Основное назначение утилиты – вывод содержимого файлов в терминал и объединение нескольких файлов в один поток данных.

С помощью cat можно:

  • просматривать содержимое текстовых файлов;
  • объединять несколько файлов;
  • создавать новые файлы;
  • перенаправлять вывод в другой файл;
  • работать со стандартным вводом данных;
  • отображать строки с нумерацией и дополнительными символами;
  • очищать содержимое существующих файлов.

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

Общий синтаксис команды выглядит следующим образом:

cat [опции] файл1 файл2 ...

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

Если файлы не указаны, cat перейдет в режим ожидания ввода данных с клавиатуры.

Что делает команда cat: основные опции

Команда cat в Linux поддерживает различные параметры, расширяющие стандартные возможности вывода. Наиболее используемые опции:

  • -b – нумеровать только непустые строки;
  • -n – нумеровать все строки;
  • -s – удалять повторяющиеся пустые строки;
  • -E – показывать символ $ в конце каждой строки;
  • -T – отображать символы табуляции как ^I;
  • -v – использовать ^ и M- нотацию, кроме LFD и TAB;
  • -A – эквивалент -vET, показывает сразу все непечатаемые символы.

Примеры использования команды cat

Просмотр содержимого файла

Вывод содержимого файла в терминал:

cat file.txt

Просмотр нескольких файлов

Можно вывести содержимое сразу нескольких файлов:

cat file1.txt file2.txt file3.txt

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

Нумерация непустых строк

Для отображения номеров только у строк с данными используется опция -b:

cat -b file.txt

Нумерация всех строк

Чтобы пронумеровать абсолютно все строки, включая пустые:

cat -n file.txt

Удаление повторяющихся пустых строк

Опция -s позволяет убрать подряд идущие пустые строки:

cat -s file.txt

Создание файла через cat

Команда позволяет создать файл и записать в него текст напрямую из терминала:

cat > file.txt

После ввода команды cat в консоли можно печатать текст. Для завершения ввода необходимо нажать сочетание клавиш Ctrl + D.

Объединение файлов

Чтобы объединить содержимое нескольких файлов в новый файл:

cat file1.txt file2.txt > file3.txt

После выполнения команды данные из file1.txt и file2.txt будут записаны в file3.txt.

Добавление данных в конец файла

Для добавления содержимого без перезаписи файла используется оператор >>:

cat file1.txt >> file2.txt

Очистка содержимого файла

Иногда требуется не удалить файл, а полностью очистить его содержимое, сохранив сам файл, права доступа и открытые на него дескрипторы (например, лог, в который пишет работающий процесс). Для этого удобно перенаправить в файл вывод псевдоустройства /dev/null:

cat /dev/null > access.log

После выполнения команды файл access.log останется на месте, но станет пустым. Формально это пример Useless Use of Cat (см. раздел ниже) и cat здесь не нужен. Данный вариант стоит рассматривать как пример, а для очистки содержимого файла лучше использовать команду: 

> access.log

 Обратный вывод файла с помощью tac

В комплекте с cat поставляется «зеркальная» утилита tac – ее название читается задом наперед и отражает суть работы: команда выводит содержимое файла в обратном порядке, начиная с последней строки.

tac file.txt

Важный нюанс – tac читает файл целиком. На больших логах размером в сотни мегабайт это медленно и создает лишнюю нагрузку на диск. Если нужно посмотреть только последние записи лога в обратном порядке, эффективнее сначала отрезать «хвост» через tail, а перевернуть уже его:

tail -n 20 /var/log/syslog | tac

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

Чем cat отличается от less и more

cat – не единственный способ посмотреть содержимое файла. На практике для просмотра часто используют утилиты less и more, и важно понимать разницу между ними.

cat выводит файл целиком в терминал и сразу возвращает управление в командную строку. Это удобно для коротких файлов и для конвейерной обработки (когда вывод передается другой команде через |). Но если открыть через cat файл на десятки тысяч строк, то часть содержимого может выйти за пределы буфера.

more – постраничный просмотрщик. Файл выводится по одному экрану за раз, перелистывание вперед выполняется клавишей Space, построчно – клавишей Enter. Утилита простая, но движение назад по файлу в ней ограничено.

less – более современный и функциональный аналог more. Поддерживает прокрутку в обе стороны (стрелки, Page Up / Page Down), поиск по тексту (/ для поиска вперед, ? – назад), переход в начало (g) и конец (G) файла, а также открывает большие файлы мгновенно, не загружая их целиком в память. Выход из режима просмотра – клавиша q.

Краткое правило выбора: 

  • cat – если файл маленький или вывод нужно передать другой команде;
  • less – если файл большой и его нужно изучить вручную.

Антипаттерн «useless use of cat»

В сообществе Linux существует устойчивое выражение Useless Use of Cat (UUOC) – «бесполезное использование cat». Так называют ситуацию, когда cat применяется только для того, чтобы передать содержимое файла другой команде через конвейер, хотя эта команда сама умеет читать файлы.

Типичный пример антипаттерна:

cat file.txt | grep "ошибка"

Здесь cat лишний, grep (как и большинство классических Unix-утилит – awk, sed, sort, wc и др.) принимает имя файла как аргумент. Корректный вариант:

grep "ошибка" file.txt

Такой запуск:

  • работает быстрее, потому что не порождает лишний процесс;
  • дает grep доступ к имени файла, что важно при поиске сразу в нескольких файлах (имя выводится перед каждой найденной строкой).

cat действительно нужен в конвейере только тогда, когда требуется объединить несколько файлов перед обработкой:

cat file.txt log.txt access.txt | grep "ошибка"

В остальных случаях стоит передавать файл напрямую той утилите, которая его читает.

Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите обсудить эту статью или наши продукты с коллегами по цеху и сотрудниками Beget – ждем вас в нашем сообществе в Telegram.