LinuxКак сделать

Как использовать Linux cat и tac Commands

Искусство окна терминала на рабочем столе Linux
Фатмавати Ахмад Заенури / Shutterstock.com

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

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

Команда кота

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

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

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

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

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

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

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

  кот poem1.txt 

cat poem1.txt в окне терминала

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

содержимое poem1.txt в окне терминала

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

  кот poem1.txt poem2.txt 

cat poem1.txt poem2.txt в окне терминала

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

содержимое poem1.txt и poem2.txt в окне терминала

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

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

  кошка poem1.txt poem2.txt |  Меньше 

кошка poem1.txt poem2.txt | меньше в окне терминала

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

содержание poem1.txt и poem2.txt меньше в терминальном окне

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

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

  cat -n poem1.txt 

cat -n poem1.txt в окне терминала

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

содержимое poem1.txt с пронумерованными строками в окне терминала

Не нумеруйте пустые строки

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

  cat -b poem1.txt 

cat -b poem1.txt в окне терминала

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

пронумерованные строки пропускаются; l; ines в окне терминала

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

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

содержимое файла с последовательными пустыми строками в окне терминала

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

  cat -s poem1.txt 

cat -b poem1.txt в окне терминала

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

Несколько пустых строк игнорируются в окне терминала

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

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

  cat -T poem1.txt 

cat -T poem1.txt в терминальной вдове

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

содержимое ofpoem1.txt с вкладками, отображаемыми в окне терминала

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

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

  кот -E poem1.txt 

cat -T poem1.txt в окне терминала

Концы строк представлены символом «$».

содержимое poem1.txt с окончанием строки отображается в окне терминала

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

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

  cat poem1.txt poem2.txt> jabberwocky.txt 

cat poem1.txt poem2.txt> jabberwocky.txt в окне терминала

давайте используем cat чтобы проверить наш новый файл:

  кот jabberwocky.txt 

кот jabberwocky.txt в окне терминала

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

содержимое jabberwocky.tx в окне терминала

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

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

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

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

  cat first_verse.txt >> jabberwocky.txt 

cat first_verse.txt >> jabberwocky.txt в окне терминала

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

  кот jabberwocky.txt 

кот jabberwocky.txt в окне терминала

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

содержимое jabberwocky.txt в окне терминала

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

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

  cat> my_poem.txt 

cat> my_poem.txt в окне терминала

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

  cat my-poem.txt 

Низкокачественная собачка в оконечном окне

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

Tac Command

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

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

  tac my_poem.txt 

tac my_poem.txt в окне терминала

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

my_poem.txt перечислен в обратном порядке в окне терминала

Использование TAC с STDIN

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

  нолики 

TAC работает с STDIN в окне терминала

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

вывод из TAC с использованием стандартного ввода в окне терминала

Использование TAC с файлами журналов

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

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

  tac / var / log / syslog |  голова -1 

tac / var / log / syslog | голова -1 в окне терминала

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

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

последняя запись из системного журнала в окне терминала

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

Последний трюк, у которого есть рукава, — красота.

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

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

  меньше logfile.dat 

меньше лог файла в окне терминала

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

верхняя часть лог-файла в окне терминала

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

нижняя часть лог-файла в окне терминала

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

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

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

  tac logfile.dat |  Меньше 

tac logfile.dat | меньше в окне терминала

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

обратный лог файл меньше в окне терминала

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

tac на помощь.

  tac -b -r -s ^ = SEQ. + [0-9] + * $ logfile.dat |  Меньше 

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 . На первый взгляд, это немного странно. Но когда вы вглядываетесь под поверхность, появляется неожиданная сила, которую вы можете использовать в своих интересах.

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

Похожие посты
Как сделать

Как получить возмещение за покупки в iTunes или App Store

Как сделать

Поверхностное перо не работает? Вот как это исправить

Как сделать

Как настроить и использовать Fire TV Recast

Как сделать

Как изменить рингтон по умолчанию на вашем iPhone