Когда работаешь с Linux-сервером, постоянно приходится открывать и смотреть разные файлы. Конфиги, логи, скрипты - всего этого накапливается много. И вот тут появляется команда cat, которая стала одним из первых инструментов, которые осваивает любой администратор.
Название cat расшифровывается как "concatenate", то есть объединять. Но по факту большинство людей используют её просто для быстрого просмотра файлов в терминале. Хотя возможностей у неё намного больше - можно и файлы создавать, и склеивать несколько документов в один, и много чего ещё.
Что делает cat
Утилита входит в стандартный набор GNU coreutils, так что присутствует во всех дистрибутивах по умолчанию. Основные задачи:
- Вывести содержимое файла на экран.
- Склеить несколько файлов воедино.
- Создать новый файл прямо из командной строки.
- Дописать что-то в конец существующего файла.
- Пронумеровать строки в документе.
- Убрать лишние пустые строки.
Звучит просто, но когда разберешься во всех нюансах, понимаешь насколько это мощный инструмент для повседневной работы.
Базовое использование
Синтаксис максимально простой:
cat [опции] [файл...]
Самый частый вариант - просто показать файл:
cat filename.txt
Вот и всё. Содержимое выводится в терминал, можешь сразу посмотреть что там внутри.
Просмотр файлов
Начнем с самого распространенного применения - когда нужно быстро глянуть что внутри файла.
Один файл
Допустим, нужно посмотреть файл hosts:
cat /etc/hosts
Или проверить конфигурацию nginx:
cat /etc/nginx/nginx.conf
Логи тоже можно посмотреть:
cat /var/log/syslog
Правда с логами осторожнее - если файл огромный, вся эта портянка текста выльется на экран. Для больших файлов лучше использовать less или tail, об этом чуть позже.
Несколько файлов сразу
Можно указать несколько файлов подряд:
cat file1.txt file2.txt file3.txt
Cat выведет их один за другим, без всяких разделителей. Иногда удобно, когда нужно быстро пробежаться глазами по нескольким конфигам.
Пример из практики - посмотреть все сайты в nginx:
cat /etc/nginx/sites-available/*
Нумерация строк
Часто бывает полезно видеть номера строк. Для этого есть опция -n:
cat -n /etc/passwd
Получится примерно так:
root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologin
Если в файле много пустых строк и не хочется их нумеровать, используй опцию -b:
cat -b file.txt
Она пронумерует только строки с текстом, пустые пропустит.
Создание файлов
Тут начинается интересное. Cat умеет не только читать, но и писать.
Создать файл с клавиатуры
Простой способ быстро создать текстовый файл:
cat > newfile.txt
После этого просто начинаешь печатать текст. Каждая строка с Enter. Когда закончишь, жми Ctrl+D - файл сохранится.
Готово, файл test.txt создан.
Heredoc синтаксис
Когда нужно создать файл со скриптом или конфигом, удобнее использовать heredoc:
cat > config.txt << EOF
server {
listen 80;
server_name example.com;
root /var/www/html;
}
EOF
Всё что между << EOF и EOF попадет в файл. Очень удобно в bash-скриптах, когда нужно налету создавать конфиги.
Пустой файл
Можно создать пустой файл через cat:
cat > empty.txt < /dev/null
Хотя проще через touch:
touch empty.txt
Но вариант с cat тоже работает, знать полезно.
Склейка файлов
Вот ради чего cat и получила своё название - concatenate, объединять.
Соединить два файла
Допустим есть file1.txt и file2.txt, нужно их соединить:
cat file1.txt file2.txt > combined.txt
Всё содержимое первого файла, потом второго - всё это окажется в combined.txt.
Собрать все логи
Частая задача - собрать все логи из директории в один файл:
cat /path/to/logs/*.log > all_logs.txt
Получается один большой файл со всеми логами, удобно для анализа или отправки кому-то.
С разделителями
Если нужно различать где кончается один файл и начинается другой:
cat file1.txt <(echo "---") file2.txt <(echo "---") file3.txt > merged.txt
Между файлами появятся разделители из трёх дефисов.
Дописать в конец
Важный момент - оператор > перезаписывает файл полностью. Если нужно дописать в конец, используй >>:
cat file1.txt >> existing_file.txt
Содержимое file1.txt добавится в конец existing_file.txt, ничего не затрётся.
Полезные опции
Разберем основные флаги команды cat.
-n - нумеровать все строки
cat -n file.txt
-b - нумеровать только непустые строки
cat -b file.txt
-s - схлопнуть несколько пустых строк подряд в одну
cat -s file.txt
Полезно когда в файле куча лишних пустых строк.
-E - показать знак доллара в конце каждой строки
cat -E file.txt
Помогает увидеть где на самом деле заканчиваются строки.
-T - показать табы как ^I
cat -T file.txt
-A - показать вообще все невидимые символы
cat -A file.txt
Покажет и концы строк ($), и табы (^I), и возвраты каретки (^M). Последнее особенно полезно когда файл создавался в Windows.
-v - показать непечатаемые символы, кроме табов и переводов строк
cat -v file.txt
Практический пример - убрать дублирующиеся пустые строки:
cat -s messy_file.txt > clean_file.txt
Или проверить файл на скрытые символы:
cat -A suspicious_file.txt
Большие файлы
Тут у cat есть проблема. Если файл весит несколько гигабайт, команда выплюнет его весь в терминал. Неудобно.
Есть несколько решений.
Вариант первый - использовать less для постраничного просмотра:
cat large_file.log | less
Или вообще без cat:
less large_file.log
Второй вариант - посмотреть только начало через head:
cat large_file.log | head -100
Третий - только конец через tail:cat large_file.log | tail -100
Можно комбинировать, чтобы вытащить кусок из середины:
cat large_file.log | head -1000 | tail -100
Покажет строки с 901 по 1000.
Связка с другими командами
Cat хорошо работает в связке с другими утилитами через pipe.
С grep
Найти в файле строки со словом "error":
cat /var/log/syslog | grep -i error
Правда можно обойтись и без cat:
grep -i error /var/log/syslog
Работает одинаково, второй вариант чуть эффективнее.
С wc
Посчитать сколько строк в файле:
cat file.txt | wc -l
Или слов:
cat file.txt | wc -w
Или символов:
cat file.txt | wc -c
С sort
Отсортировать содержимое:
cat names.txt | sort
Отсортировать и убрать дубли:
cat names.txt | sort | uniq
С sed
Заменить текст на лету:
cat file.txt | sed 's/old/new/g'
Все вхождения "old" станут "new".
С awk
Вытащить первую колонку из файла:
cat data.txt | awk '{print $1}'
Реальные примеры
Несколько сценариев из жизни админа.
Быстро глянуть SSH конфиг:
cat /etc/ssh/sshd_config
Создать конфиг для nginx:
cat > /etc/nginx/sites-available/mysite.conf << EOF
server {
listen 80;
server_name mysite.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host \$host;
}
}
EOF
Собрать логи за несколько дней:
cat /var/log/nginx/access.log.1 /var/log/nginx/access.log > all_logs.txt
Дописать запись в лог:
echo "New entry at $(date)" >> /var/log/myapp.log
Хотя тут cat вообще не нужен, echo справится сам.
Скопировать файл:
cat source.txt > destination.txt
Работает как cp, но через перенаправление.
Проверить кодировку:
cat -v file.txt
Если увидишь странные ^M в конце строк - файл из Windows, надо конвертировать.
Создать bash скрипт:
cat > backup.sh << 'EOF' #!/bin/bash tar -czf backup-$(date +%Y%m%d).tar.gz /home/user/data EOF
chmod +x backup.sh
Кавычки вокруг EOF нужны чтобы переменные не раскрывались сразу.
Альтернативы
В зависимости от задачи, может быть есть команда получше.
Для просмотра файлов:
less- когда файл большой и нужна навигацияmore- простой постраничный просмотрhead- только начало файлаtail- только конецnanoилиvim- если нужно ещё и отредактировать
Для объединения:
cat- простое склеивание текстовых файловpaste- склеить файлы по столбцамjoin- объединить по общему полю
Производительность
Cat работает быстро, но есть нюансы.
Когда cat неэффективен:
- Большие файлы - лучше
head,tail,less - Бинарные файлы - нужен
hexdumpилиxxd - Поиск в файлах -
grepработает напрямую - Редактирование -
sed,awk, редакторы
Есть такое понятие - UUOC, Useless Use of Cat. Бесполезное использование cat.
Неэффективно:
cat file.txt | grep "search"
Эффективно:
grep "search" file.txt
Разница в том, что в первом случае создаётся лишний процесс. Grep умеет сам читать файлы.
То же самое с wc:
Неэффективно:
cat file.txt | wc -l
Эффективно:
wc -l < file.txt
Хотя если честно, для небольших файлов разница незаметна. И вариант с cat часто более понятен новичкам.
Когда использовать cat
Подытожим когда cat подходит, а когда нет.
Используй cat:
- Быстро посмотреть небольшой файл
- Объединить несколько файлов
- Создать простой текстовый файл
- Дописать что-то в конец файла
- Передать файл другой команде через
pipe
Не используй cat:
- Файл огромный - бери
less - Нужно редактировать - открой
vimилиnano - Нужен поиск - используй
grepнапрямую - Бинарный файл - нужен
hexdump
Заключение
Команда cat - один из базовых инструментов Linux. Простая, быстрая, универсальная. Выучил её в первый день работы с терминалом, используешь каждый день годами.
Основное что надо запомнить:
cat file.txt- посмотреть файлcat file1 file2 > merged- склеить файлыcat > newfile- создать новый файлcat -n file.txt- с нумерацией строк- Комбинируй с
grep,wc,sortдля обработки данных
Освоив cat, сразу почувствуете себя увереннее в командной строке.
Дополнительно
Полная документация в man:
man cat
Или краткая справка:
cat --help
Похожие команды которые стоит изучить:
less- постраничный просмотрhead- начало файлаtail- конец файлаtac- вывод в обратном порядкеnl- нумерация строкpaste- объединение по столбцам
Полезные связки команд
Конфиг без комментариев:
cat config.conf | grep -v "^#"
Сортировка без дублей:
cat list.txt | sort | uniq
Подсчёт уникальных строк:
cat file.txt | sort | uniq | wc -l
Замена во всех файлах:
cat *.txt | sed 's/old/new/g'
На этом всё. Теперь вы знаете про cat больше чем 90 процентов пользователей Linux.