Когда работаешь с Linux-сервером, постоянно приходится открывать и смотреть разные файлы. Конфиги, логи, скрипты - всего этого накапливается много. И вот тут появляется команда cat, которая стала одним из первых инструментов, которые осваивает любой администратор.
Название cat расшифровывается как "concatenate", то есть объединять. Но по факту большинство людей используют её просто для быстрого просмотра файлов в терминале. Хотя возможностей у неё намного больше - можно и файлы создавать, и склеивать несколько документов в один, и много чего ещё.
Утилита входит в стандартный набор 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:
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.
Найти в файле строки со словом "error":
cat /var/log/syslog | grep -i error
Правда можно обойтись и без cat:
grep -i error /var/log/syslog
Работает одинаково, второй вариант чуть эффективнее.
Посчитать сколько строк в файле:
cat file.txt | wc -l
Или слов:
cat file.txt | wc -w
Или символов:
cat file.txt | wc -c
Отсортировать содержимое:
cat names.txt | sort
Отсортировать и убрать дубли:
cat names.txt | sort | uniq
Заменить текст на лету:
cat file.txt | sed 's/old/new/g'
Все вхождения "old" станут "new".
Вытащить первую колонку из файла:
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, lesshexdump или xxdgrep работает напрямую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:
pipeНе используй cat:
lessvim или nanogrep напрямую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.