Поиск по сайту:

Как использовать команды Linux cat и tac


Команды cat и tac отображают содержимое текстовых файлов, но в них есть нечто большее, чем кажется на первый взгляд. Погрузитесь немного глубже и изучите некоторые полезные приемы командной строки Linux.

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

Кошачья команда

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

Когда-то — еще в эпоху коммутируемого модема — двоичные файлы часто разбивались на несколько файлов меньшего размера, чтобы упростить загрузку. Вместо того, чтобы загружать один большой файл, вы загружаете каждый файл меньшего размера. Если один файл не удалось загрузить правильно, вы просто снова получите этот файл.

Конечно, вам нужен был способ воссоздать набор файлов меньшего размера обратно в один рабочий двоичный файл. Этот процесс назывался конкатенацией. И вот тут появился cat и откуда он получил свое имя.

Широкополосные и волоконно-оптические соединения привели к тому, что эта особая потребность исчезла — так же, как визгливые звуки телефонных звонков — так что же осталось делать cat сегодня? На самом деле довольно много.

Отображение текстового файла

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

Убедитесь, что файл является текстовым. Если вы попытаетесь вывести содержимое бинарного файла в окно терминала, результаты будут непредсказуемыми. Вы можете получить заблокированный сеанс терминала или что-то похуже.

cat poem1.txt

Содержимое файла стихотворения1.txt отображается в окне терминала.

Это только половина знаменитого стихотворения. Где остальное? Здесь есть еще один файл с именем стихотворение2.txt. Мы можем заставить cat отображать содержимое нескольких файлов с помощью одной команды. Все, что нам нужно сделать, это перечислить файлы по порядку в командной строке.

cat poem1.txt poem2.txt

Это выглядит лучше; теперь у нас есть все стихотворение.

Использование кота с меньшими затратами

Стихотворение все на месте, но оно пронеслось мимо окна слишком быстро, чтобы прочитать первые несколько стихов. Мы можем направить вывод из cat в less и прокручивать текст вниз в своем собственном темпе.

cat poem1.txt poem2.txt | less

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

Нумерация строк в файле

У нас может быть нумерация строк в файле по мере его отображения. Для этого мы используем параметр -n (число).

cat -n poem1.txt

Строки нумеруются так, как они отображаются в окне терминала.

Не нумеровать пустые строки

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

cat -b poem1.txt

Теперь текстовые строки нумеруются, а пустые строки пропускаются.

Не показывать несколько пустых строк

Если в файле есть секции последовательных пустых строк, мы можем попросить cat игнорировать все пустые строки, кроме одной. Посмотрите на этот файл.

Следующая команда заставит cat отображать только одну пустую строку из каждой группы пустых строк. Для этого нам нужна опция -s (squeeze-blank).

cat -s poem1.txt

Это никак не влияет на содержимое файла; он просто изменяет способ, которым cat отображает файл.

Показать вкладки

Если вы хотите узнать, вызваны ли пробелы пробелами или табуляциями, вы можете узнать это с помощью параметра -T (show-tabs).

cat -T poem1.txt

Вкладки представлены символами «^I».

Отображение концов линий

Вы можете проверить наличие пробелов в конце, используя параметр -E (show-ends).

cat -E poem1.txt

Концы строк обозначаются символом «$».

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

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

cat poem1.txt poem2.txt > jabberwocky.txt

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

cat jabberwocky.txt

Наш новый файл содержит содержимое двух других файлов.

Добавление текста в существующий файл

Это лучше, но на самом деле это не вся поэма. Последний стих отсутствует. Последний куплет в «Бармаглоте» такой же, как и первый куплет.

Если у нас есть первый стих в файле, мы можем добавить его в конец файла Jabberwocky.txt, и у нас будет полное стихотворение.

В следующей команде мы должны использовать >>, а не просто >. Если мы используем один >, мы перезаписываем файл jabberwocky.txt. Мы не хотим этого делать. Мы хотим добавить текст внизу.

cat first_verse.txt >> jabberwocky.txt

Проверим содержимое файла jabberwocky.txt:

cat jabberwocky.txt

И, наконец, все части стихотворения вместе.

Перенаправление стандартного ввода

Вы можете перенаправить ввод с клавиатуры в файл с помощью cat. Все, что вы вводите, перенаправляется в файл, пока вы не нажмете Ctrl+D. Обратите внимание, что мы используем один >, потому что хотим создать файл (или перезаписать его, если он существует).

cat > my_poem.txt

Мы можем начать печатать, как только выдадим команду. Мы нажимаем Ctrl + D, когда закончим. Затем мы можем проверить содержимое нового файла с помощью:

cat my-poem.txt

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

Тактическая команда

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

Давайте посмотрим, что:

tac my_poem.txt

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

Использование tac со стандартным вводом

Использование tac без имени файла заставит его работать с вводом с клавиатуры. Нажатие Ctrl + D остановит фазу ввода, и tac отобразит в обратном порядке все, что вы набрали.

tac

При нажатии Ctrl+D ввод инвертируется и отображается в окне терминала.

Использование tac с лог-файлами

Может ли tac сделать что-нибудь полезное, кроме низкопробных салонных трюков? Да, оно может. Многие файлы журналов добавляют самые новые записи в конец файла. Используя tac (и, как ни странно, head), мы можем вывести последнюю запись в окно терминала.

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

tac /var/log/syslog | head -1

head печатает последнюю запись из файла системного журнала, а затем завершает работу.

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

Использование tac с текстовыми записями

Последняя хитрость tac в рукаве – красота.

Обычно tac работает с текстовыми файлами, проходя через них строка за строкой, снизу вверх. Строка — это последовательность символов, заканчивающаяся символом новой строки. Но мы можем указать tac работать с другими разделителями. Это позволяет нам рассматривать «фрагменты» данных в текстовом файле как записи данных.

Допустим, у нас есть файл журнала какой-то программы, который нам нужно просмотреть или проанализировать. Давайте посмотрим на его формат с помощью less.

less logfile.dat

Как мы видим, файл имеет повторяющийся формат. Есть последовательности из трех строк шестнадцатеричных значений. Каждый набор из трех шестнадцатеричных строк имеет строку метки, которая начинается с «=SEQ», за которой следует последовательность цифр.

Если мы прокрутим файл до конца, то увидим, что таких записей много. Последний имеет номер 865.

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

Обратите внимание, что последние три строки в файле начинаются с шестнадцатеричных значений 93, E7 и B8 в указанном порядке.

Воспользуемся tac, чтобы перевернуть файл. Это очень длинный файл, поэтому мы передадим его в less.

tac logfile.dat | less

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

Ранее мы отмечали, что последние три строки в файле начинаются с шестнадцатеричных значений 93, E7 и B8 именно в таком порядке. Порядок этих строк был обратным. Кроме того, строки «=SEQ» теперь находятся под каждым набором из трех шестнадцатеричных строк.

tac спешит на помощь.

tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less

Давайте сломаем это.

Опция -s (разделитель) сообщает tac, что мы хотим использовать в качестве разделителя между нашими записями. Он сообщает tac не использовать обычный символ новой строки, а вместо этого использовать наш разделитель.

Параметр -r (регулярное выражение) указывает tac обрабатывать строку-разделитель как регулярное выражение.

Параметр -b (before) заставляет tac отображать разделитель перед каждой записи, а не после нее (что является обычной позицией по умолчанию). разделитель, символ новой строки).

Строка -s (разделитель) ^=SEQ.+[0-9]+*$ расшифровывается следующим образом:

Символ ^ обозначает начало строки. Далее следует =SEQ.+[0-9]+*$. Это указывает tac искать каждое вхождение «=SEQ». в начале строки, за которой следует любая последовательность цифр (обозначается как [0-9]), а затем любой другой набор символов (обозначается как *$ ).

Как обычно, мы передаем все в less.

Теперь наш файл представлен в обратном порядке: каждая строка метки «=SEQ» указана перед тремя строками шестнадцатеричных данных. Три строки шестнадцатеричных значений расположены в их исходном порядке в каждой записи данных.

Мы можем проверить это просто. Первое значение первых трех строк шестнадцатеричного числа (которые были последними тремя строками до того, как файл был реверсирован) соответствует значениям, которые мы записали ранее: 93, E7 и B8, именно в таком порядке.

Это настоящий трюк для однострочного окна терминала.

У всего есть цель

В мире Linux даже самые простые на первый взгляд команды и утилиты могут обладать удивительными и мощными свойствами.

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

Или, как говорит другая философия: «Не презирай змею за то, что у нее нет рогов, ибо кто сказал, что она не станет драконом?»

RELATED: Best Linux Laptops for Developers and Enthusiasts