Команды cat
и tac
отображают содержимое текстовых файлов, но это больше, чем кажется на первый взгляд. Погрузитесь немного глубже и изучите некоторые полезные приемы командной строки Linux.
Это две простые маленькие команды, часто игнорируемые как слишком простые, чтобы их можно было реально использовать. Но как только вы узнаете, как их можно использовать по-разному, вы поймете, что они вполне способны справиться со своей тяжелой работой, когда дело доходит до работы с файлами.
Команда кота
cat
используется для проверки содержимого текстовых файлов и объединения частей файлов в один большой файл.
Когда-то, еще в эпоху коммутируемого модема, двоичные файлы часто разбивались на несколько файлов меньшего размера, чтобы облегчить загрузку. Вместо того, чтобы загружать один большой файл, вы возвращали каждый файл меньшего размера. Если какой-либо файл не удалось загрузить правильно, вы просто получите этот файл снова.
Конечно, тогда вам нужен был способ восстановить коллекцию небольших файлов обратно в один рабочий двоичный файл. Этот процесс был назван объединением. И вот откуда пришел cat
и откуда он получил свое имя.
Широкополосные и оптоволоконные соединения привели к тому, что эта особая потребность исчезла — так же, как звуки визгливого набора — так что же осталось сделать cat
сегодня? Довольно много на самом деле.
Отображение текстового файла
Чтобы cat
список содержимого текстового файла в окно терминала, используйте следующую команду.
Убедитесь, что файл является текстовым файлом. Если вы попытаетесь отобразить содержимое двоичного файла в окне терминала, результаты будут непредсказуемыми. Вы могли бы закончить с заблокированной терминальной сессией или хуже.
кот poem1.txt
Содержимое файла poem1.txt отображается в окне терминала.
Это только половина знаменитого стихотворения. Где остальное? Здесь есть еще один файл с именем poem2.txt. Мы можем сделать cat
список содержимого нескольких файлов с помощью одной команды. Все, что нам нужно сделать, это перечислить файлы по порядку в командной строке.
кот poem1.txt poem2.txt
Это выглядит лучше; у нас есть целое стихотворение сейчас.
Использование кошки с меньшими затратами
Все стихотворение есть, но оно пролетело мимо окна слишком быстро, чтобы прочитать первые несколько стихов. Мы можем перенаправить вывод из cat
в less
и прокрутить текст вниз в своем собственном темпе.
кошка poem1.txt poem2.txt | Меньше
Теперь мы можем перемещаться вперед и назад по тексту в одном потоке, даже если он содержится в двух отдельных текстовых файлах.
Нумерация строк в файле
Мы можем указать номер строки в файле, как он отображается. Для этого мы используем опцию -n
(число).
cat -n poem1.txt
Строки нумеруются так, как они отображаются в окне терминала.
Не нумеруйте пустые строки
Нам удалось пронумеровать строки с помощью cat
, но подсчитываются и пустые строки между стихами. Чтобы иметь нумерацию строк текста, но игнорировать пустые строки, используйте опцию -b
(number-nonblank).
cat -b poem1.txt
Теперь текстовые строки нумеруются, а пустые строки пропускаются.
Не показывать несколько пустых строк
Если в файле есть разделы последовательных пустых строк, мы можем попросить cat
игнорировать все, кроме одной пустой строки. Посмотри на этот файл.
Следующая команда заставит cat
отображать только одну пустую строку из каждой группы пустых строк. Опция, которая нам нужна для этого, — опция -s
(squeeze-blank).
cat -s poem1.txt
Это никак не влияет на содержимое файла; это только изменяет способ, которым cat
отображает файл.
Отображение вкладок
Если вы хотите узнать, вызваны ли пробелы пробелами или табуляцией, вы можете узнать, используя опцию -T
(show-tabs).
cat -T poem1.txt
Вкладки представлены символами «^ I».
Отображение концов линий
Вы можете проверить наличие пробелов, используя опцию -E
(show-end).
кот -E poem1.txt
Концы строк представлены символом «$».
Объединение файлов
Не имеет смысла сохранять стихотворение в двух файлах, по одной половине в каждом. Давайте объединим их вместе и создадим новый файл со всем стихотворением.
cat poem1.txt poem2.txt> jabberwocky.txt
давайте используем cat
чтобы проверить наш новый файл:
кот jabberwocky.txt
Наш новый файл содержит содержимое двух других файлов.
Добавление текста в существующий файл
Это лучше, но на самом деле это не все стихотворение. Последний стих отсутствует. Последний стих в Jabberwocky такой же, как первый стих.
Если у нас есть первый стих в файле, мы можем добавить его в конец файла jabberwocky.txt, и у нас будет полное стихотворение.
В этой следующей команде мы должны использовать >>
, а не просто >
. Если мы используем один >
мы перезапишем jabberwocky.txt. Мы не хотим этого делать. Мы хотим добавить текст в конец.
cat first_verse.txt >> jabberwocky.txt
Давайте проверим содержимое файла jabberwocky.txt:
кот jabberwocky.txt
И наконец, все части стихотворения вместе.
Перенаправление стандартного ввода
Вы можете перенаправить ввод с клавиатуры в файл, используя cat
. Все, что вы вводите, перенаправляется в файл, пока вы не нажмете Ctrl + D. Обратите внимание, что мы используем одиночный >
потому что мы хотим создать файл (или перезаписать его, если он существует).
cat> my_poem.txt
Мы можем начать печатать, как только мы введем команду. Мы нажимаем Ctrl + D, когда мы закончим. Затем мы можем проверить содержимое нового файла с помощью:
cat my-poem.txt
Этот звук похож на далекую турбину, вероятно, Льюис Кэрролл вращается в могиле на высокой скорости.
Tac Command
tac
похож на cat
, но перечисляет содержимое файлов в обратном порядке .
Давайте посмотрим, что:
tac my_poem.txt
И файл отображается в окне терминала в обратном порядке. В этом случае это не влияет на его литературные достоинства.
Использование TAC с STDIN
Использование tac
без имени файла приведет к тому, что он будет работать с вводом с клавиатуры. Нажатие Ctrl + D остановит фазу ввода, и tac отобразит в обратном порядке все, что вы ввели.
нолики
При нажатии Ctrl + D ввод меняется на противоположный и отображается в окне терминала.
Использование TAC с файлами журналов
Помимо низкокачественных приемов, может ли что-нибудь сделать полезное? Да, оно может. Многие файлы журнала добавляют свои новейшие записи внизу файла. Используя tac
(и, нелогично, head
), мы можем вытолкнуть последнюю запись в окно терминала.
Мы используем tac
чтобы вывести файл системного журнала в обратном порядке и head
его в head
. Говоря head
печатать только первую полученную строку (что благодаря tac
является последней строкой в файле), мы видим последнюю запись в файле системного журнала.
tac / var / log / syslog | голова -1
head
печатает последнюю запись из файла системного журнала и затем завершает работу.
Обратите внимание, что head
печатает только одну строку — как мы и просили — но строка настолько длинная, что оборачивается дважды. Вот почему это выглядит как три строки вывода в окне терминала.
Использование TAC с текстовыми записями
Последний трюк, у которого есть рукава, — красота.
Обычно tac
работает с текстовыми файлами, проходя через них построчно, снизу вверх. Строка — это последовательность символов, оканчивающаяся символом новой строки. Но мы можем сказать tac
для работы с другими разделителями. Это позволяет нам рассматривать «порции» данных в текстовом файле как записи данных.
Допустим, у нас есть файл журнала какой-то программы, который нам нужно просмотреть или проанализировать. Давайте посмотрим на его формат с less
.
меньше logfile.dat
Как мы видим, в файле есть повторяющийся формат. Существуют последовательности из трех строк шестнадцатеричных значений. Каждый набор из трех шестнадцатеричных строк имеет строку метки, которая начинается с «= SEQ», после чего следует последовательность цифр.
Если прокрутить до конца файла, мы увидим, что этих записей много. Финальный номер 865.
Давайте предположим, что по какой-то причине нам нужно работать через этот файл в обратном порядке, запись данных по записи данных. Порядок строк трех шестнадцатеричных строк в каждой записи данных должен быть сохранен.
Отметим, что последние три строки в файле начинаются с шестнадцатеричных значений 93, E7 и B8 в указанном порядке.
Давайте использовать tac
чтобы перевернуть файл. Это очень длинный файл, поэтому мы добавим less
.
tac logfile.dat | Меньше
Это переворачивает файл, но это не тот результат, который нам нужен. Мы хотим, чтобы файл был перевернут, но строки в каждой записи данных должны быть в их первоначальном порядке.
Ранее мы отмечали, что последние три строки в файле начинаются с шестнадцатеричных значений 93, E7 и B8 в указанном порядке. Порядок этих строк был обратным. Кроме того, строки «= SEQ» теперь находятся ниже каждого набора из трех шестнадцатеричных строк.
tac
на помощь.
tac -b -r -s ^ = SEQ. + [0-9] + * $ logfile.dat | Меньше
Давайте разберемся с этим.
Опция -s
(разделитель) сообщает tac
что мы хотим использовать в качестве разделителя между нашими записями. Он говорит tac
не использовать свой обычный символ новой строки, а вместо этого использовать наш разделитель.
Опция -r
(regex) указывает tac
обрабатывать строку-разделитель как регулярное выражение .
Опция -b
(before) заставляет tac
перечислять разделитель перед каждой записью, а не после нее (что является обычной позицией ее разделителя по умолчанию, символа новой строки).
Строка -s
(разделитель) ^=SEQ.+[0-9]+*$
расшифровывается следующим образом:
Символ ^
обозначает начало строки. Далее следует =SEQ.+[0-9]+*$
. Это инструктирует tac
искать каждое вхождение «= SEQ» в начале строки, за которой следует любая последовательность цифр (обозначенная [0-9]
), а затем любой другой набор символов (обозначенный *$
).
Как обычно, мы делаем всё less
.
Наш файл теперь представлен в обратном порядке, где каждая строка метки «= SEQ» указана перед тремя строками шестнадцатеричных данных. Три строки шестнадцатеричных значений находятся в их исходном порядке в каждой записи данных.
Мы можем проверить это просто. Первое значение первых трех шестнадцатеричных строк (которые были последними тремя строками перед обращением файла) соответствуют значениям, которые мы взяли ранее: 93, E7 и B8, в указанном порядке.
Это просто хитрость для однострочных окон терминала.
У всего есть цель
В мире Linux даже самые простые на вид команды и утилиты могут обладать удивительными и мощными свойствами.
Философия проектирования простых утилит, которые хорошо выполняют одну задачу и легко взаимодействуют с другими утилитами, породила некоторые странные маленькие команды, такие как tac
. На первый взгляд, это немного странно. Но когда вы вглядываетесь под поверхность, появляется неожиданная сила, которую вы можете использовать в своих интересах.
Или, как говорит другая философия: «Не презирай змею за то, что у нее нет рогов, ибо кто скажет, что она не станет драконом?»