cat и tac
Вывести файл, склеить несколько файлов, пронумеровать строки, показать невидимые символы
cat (от concatenate — «сцепить») читает файлы по очереди и выводит их содержимое подряд. Им смотрят короткие файлы, склеивают несколько файлов в один, создают файл из here-doc и проверяют, нет ли в тексте табуляций, \r и пробелов в конце строк. tac делает то же самое, но выводит строки в обратном порядке — от последней к первой.
Синтаксис
cat [опции] [файл…]
tac [опции] [файл…]
Без файлов или с - вместо имени обе команды читают стандартный ввод. cat a - b выведет a, затем стандартный ввод, затем b.
Опции cat
Нумерация и пустые строки
| Опция | Что делает |
|---|---|
-n | нумеровать все строки, включая пустые |
-b | нумеровать только непустые строки (перекрывает -n) |
-s | схлопнуть несколько пустых строк подряд в одну |
Номер выравнивается вправо в поле шириной 6 символов, после него идёт табуляция. При нескольких файлах нумерация сквозная: она не начинается заново с каждого файла.
Невидимые символы
| Опция | Что делает |
|---|---|
-E | показать конец строки как $: так видны пробелы в конце |
-T | показать табуляцию как ^I |
-v | показать управляющие символы в нотации ^X (\r → ^M, \x01 → ^A), а байты больше 127 — как M-…; перевод строки и табуляцию не трогает |
-A | всё сразу: то же, что -vET |
-e | то же, что -vE |
-t | то же, что -vT |
-u | игнорируется, оставлена для совместимости |
Опции tac
| Опция | Что делает |
|---|---|
-s строка | разделитель «строк» — эта строка вместо перевода строки |
-r | считать разделитель из -s регулярным выражением |
-b | ставить разделитель перед записью, а не после |
Here-doc: создать файл из текста
# переменные и $(…) внутри раскрываются
cat <<EOF > app.conf
host=$HOSTNAME
port=8080
EOF
# слово-ограничитель в кавычках: текст пишется как есть, без подстановок
cat <<'EOF' > script.sh
echo "$HOME"
EOF
# <<- убирает ведущие табуляции (не пробелы!) — удобно внутри if и функций
cat <<-EOF
отступ табуляцией исчезнет
EOF
# дописать в конец файла, а не перезаписать
cat <<EOF >> app.conf
debug=false
EOF
Примеры
printf 'one\n\n\n\ttwo \nthree\r\n' > sample.txt
# просто вывести файл
cat sample.txt
# склеить файлы в один (порядок — как в аргументах)
printf 'a\n' > part1; printf 'b\n' > part2
cat part1 part2 > all.txt
# номера строк: все / только непустые
cat -n sample.txt
cat -b sample.txt
# убрать лишние пустые строки
cat -s sample.txt
# увидеть табуляции (^I), \r из Windows (^M) и пробелы перед $
cat -A sample.txt
# вставить стандартный ввод между двумя файлами
echo '---' | cat part1 - part2
# последние строки лога — первыми
printf '10:00 start\n10:05 work\n10:10 stop\n' | tac
# tac с другим разделителем
printf 'a,b,c,' | tac -s ,
Подводные камни
cat a b > aмолча теряетa. Оболочка обнуляетaдо запускаcat, в результате в файле окажется толькоb, и ошибки не будет. Пиши в новый файл и потом переименуй.cat f >> fне зацикливается, а падает с ошибкойinput file is output fileи кодом 1.- Последняя строка без перевода строки склеится со следующим файлом. Если
aкончается наbбез\n, тоcat a cвыведетbcодной строкой. Проверить можно черезtail -c1 файл | xxd. tacна такой строке тоже «склеивает»: для ввода1\n2без финального\nвыйдет21\n.-vв локалиC(как в песочнице) показывает кириллицу как мусор видаM-PM-^P, потому что каждый байт UTF-8 больше 127. Для поиска только\rи табуляций это не мешает.<<-убирает только табуляции. Если редактор заменил их пробелами, отступ останется, а закрывающийEOFс пробелами не распознается вовсе — here-doc «съест» остаток скрипта.- Лишний
catв конвейере («useless use of cat»):cat file | grep xработает, но запускает лишний процесс.grep x fileилиgrep x < fileделают то же. Это не ошибка, просто привычка, которую стоит знать; к тому же команда с файлом в аргументах может напечатать его имя и узнать размер. - Не выводи
cat-ом бинарные файлы в терминал: управляющие байты могут сбить настройки терминала. Смотри их через xxd и od илиcat -v. - Большой файл целиком в терминал — неудобно. Для просмотра начала или конца бери head и tail, для листания —
less.
См. также
head и tail · nl · tee · перенаправления · xxd и od · rev