Команда Linux Cat: значение и использование

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

Что такое команда Linux Cat?

Несмотря на свое название, команда Linux Cat не имеет ничего общего с кошками. На самом деле, эта команда делает нечто вполне обыденное: команда Linux Cat читает содержимое файлов и выводит его в командную строку. Название происходит от термина «concatenate» — подробнее об этом ниже.

Давайте рассмотрим основную схему вызова команды Linux Cat. Как вы можете видеть, сначала мы пишем «cat», затем опции, а затем имя или пути к файлу(ам) для вывода:

cat [options] <file name(s)>

Команда Linux Cat является частью «GNU Core Utilities» (Coreutils), которая представляет собой набор основных команд командной строки. Coreutils является «Свободным и открытым программным обеспечением» (FOSS) и доступен почти во всех дистрибутивах Linux. Кроме того, команда Linux Cat доступна в macOS и Windows при использовании «Подсистемы Windows для Linux» (WSL/WSL2).

Совет

Вы можете узнать, доступна ли Linux Cat в вашей системе, сделав следующее: Откройте командную строку и выполните команду «which cat». Если команда Linux Cat доступна в вашей системе, отобразится путь к двоичному файлу cat (например, «/bin/cat»). Если отображается сообщение об ошибке, значит, команда Linux cat недоступна в вашей системе.

Параметры команды Linux Cat

Как и большинство команд командной строки, Linux Cat при вызове управляется необязательными параметрами. Эти параметры следуют за именем команды. Следует отметить, что они чувствительны к регистру. Обычно для большинства опций существует два варианта написания:

1. Краткая форма: -, например, «cmd -h».

Краткая форма не имеет большого смысла. Вместо этого несколько опций могут быть объединены в одну, например, «ls -la» вместо «ls -l -a». Краткая форма хорошо подходит для быстрой работы с известными командами в командной строке.

2. Длинная форма: —, например, «cmd -help».

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

В таблице ниже перечислены основные опции команды Linux Cat:

Опция Объяснение
-h, —help Показать справку по команде Linux Cat
-n Количество строк вывода
-s Объединить несколько пустых строк в одну
-b Нумеровать все строки вывода, кроме пустых строк
-v Вывод невидимых символов
-e Аналогично -v, включая маркер конца строки
-t Как -v, включая маркер табуляции
-et Комбинация -e и -t; вывод всех невидимых символов

Что означает concatenate?

Название команды Linux Cat происходит от слова «concatenate», которое само по себе происходит от латинского термина «catena», означающего цепь. Конкатенация — это важная концепция в информатике. Этот термин описывает нанизывание или соединение элементов схожих контейнерных структур данных. Большинство языков позволяют объединять несколько массивов или строк в один массив или строку. В этом случае отдельные элементы конкатенированных контейнеров объединяются в новый контейнер с сохранением последовательности.

Вот простой пример в псевдокоде, в котором мы передаем функции Cat несколько строк, которые объединяются в одну строку:

cat("Peter ", "and ", "Paul") -> "Peter and Paul"

Команда Linux Cat концептуально делает то же самое: как элементы, она обрабатывает строки, сгруппированные внутри файлов.

В разных языках программирования используются разные символы для оператора конкатенации строк. Рассмотрим несколько примеров из популярных языков программирования. Во всех случаях результатом конкатенации является строка «Петр и Павел»:

Оператор Язык(и) Пример
+ Java, JavaScript, Python Петр + «и» + » Павел»
. PHP, Perl Петр . «и» . » Павел»
.. Lua Петр … «и» … » Павел»
~ Ветка Петр ~ «и» ~ » Павел»
& VisualBasic Peter & «and» & » Paul»

В некоторых языках, в частности в Python, этот же оператор используется для конкатенации других контейнерных структур данных, таких как списки:

# Concatenate lists 
[1, 2, 3] + [45, 56, 67]
# -> [1, 2, 3, 45, 56, 67]
# mind you NOT:
# [[1, 2, 3], [45, 56, 67]]

# Concatenate tuples
(1, 2) + (33, 44)
# -> (1, 2, 33, 44)

Язык статистики «R» представляет собой интересный случай, поскольку он не знает оператора конкатенации. Вместо него используется функция «c()». Угадайте, что означает «c»! Правильно: «concatenate». Следующий код показывает вложенную конкатенацию нескольких значений:

c(c(1, 2, 3), c(45, 56, 67))
# -> 1, 2, 3, 45, 56, 67

Как использовать команду Linux Cat на практике?

Фактическое использование команды Linux Cat ограничено. Она следует философии UNIX «делай что-то одно и делай это хорошо». Большинство сценариев использования возникают в результате объединения команды с другими командами. Используются перенаправления стандартного ввода и вывода. В частности, это так называемые трубы и перенаправления. Они предоставляются оболочкой; их использование распространяется на все команды:

Перенаправление Символ Используйте Объяснение    
Труба     cmd1 cmd2 Перенаправление выхода команды cmd1 на вход команды cmd2
Перенаправление ввода < cmd < data Вход команды cmd для чтения из файла data    
Перенаправление вывода > cmd > data Запись вывода команды cmd в файл данных; при необходимости существующий файл будет перезаписан.    
Выходное перенаправление >> cmd >> > data Запись вывода команды cmd в файл данных; при необходимости существующий файл будет расширен.    

Команда Linux Cat часто используется с рядом других команд Linux. Рассмотрим некоторые из наиболее распространенных:

Команда Linux

Объяснение

split

Разделить файл на части; операция может быть отменена с помощью команды Cat

uniq

Удалить строки ввода, которые встречаются более одного раза

сортировать

Сортировка строк ввода в алфавитно-цифровом порядке

голова, хвост

Ограничить вывод строками в начале/конце

Давайте рассмотрим распространенные сценарии использования команды Linux Cat.

Использование Linux Cat для вывода файлов в командной строке

Возможно, самым распространенным использованием Linux Cat является вывод всего содержимого файла в командную строку. Это полезно, когда Вам нужно быстро просмотреть файл. И в отличие от открытия файла в редакторе, вам не нужно беспокоиться о случайном изменении файла. Вот пример вывода файла в командной строке:

cat ./path/to/file.txt

Давайте рассмотрим несколько распространенных сценариев. Представьте, что вы вошли через SSH на сервер, на котором работает WordPress. Вы находитесь в корневом каталоге WordPress и хотите просмотреть содержимое конфигурационного файла «wp-config.php». Следующей команды Linux Cat будет достаточно:

cat wp-config.php

Часто достаточно вывода файла в командной строке. Однако в некоторых случаях мы хотим скопировать содержимое файла в буфер обмена. Кроме того, видимый вывод в командной строке может представлять опасность для конфиденциальных данных. В обоих случаях хорошей идеей будет перенаправить вывод команды Linux Cat в программу, которая записывает данные в буфер обмена. В macOS для этой цели доступен инструмент командной строки «pbcopy»; в Windows с WSL/2 и различных дистрибутивах Linux доступны эквивалентные инструменты, такие как «clip» или «xclip».

Рассмотрим следующий пример копирования нашего открытого ключа SSH для создания репозитория GitHub. Предположим, что ключ с именем «id_rsa.pub» находится в каталоге «.ssh/» в нашей директории пользователя. В macOS мы можем выполнить следующий вызов команды Linux Cat:

cat ~/.ssh/id_rsa.pub > pbcopy

Как следует из названия команды Linux Cat, несколько файлов могут быть объединены и выведены одновременно. Представьте себе списки фруктов, овощей и молочных продуктов, хранящиеся в трех файлах в каталоге «food/». С помощью следующего вызова Linux Cat мы объединим все три списка в один и запишем его в файл «food.txt»:

cat ./food/fruit.txt ./food/veggies.txt ./food/dairy.txt > food.txt

Как обычно в командной строке, мы можем использовать подстановочный знак «*» для выбора всех файлов в каталоге:

cat ./food/*.txt > food.txt

Запись текста в файл с помощью команды Linux Cat

Используя упомянутые выше перенаправления вывода, вы можете записать текст в файл с помощью Linux Cat. Это можно сделать тремя способами:

    1. Создать новый файл для ввода текста.
    2. Переписать существующий файл текстом.
    3. Добавить введенный текст в существующий файл.

Давайте рассмотрим эти три сценария. Сначала мы записываем текст из командной строки в несуществующий файл:

  1. Вызвать команду Linux Cat и переслать вывод в несуществующий файл. Команда принимает данные со стандартного ввода до тех пор, пока не будет прочитан символ конца файла («EOF»):
cat > new.txt
  1. Введите нужный текст в командную строку.
  2. Завершите ввод комбинацией клавиш [Ctrl] + [D]. Эта комбинация клавиш соответствует символу конца файла.

Теперь текст содержится в файле «new.txt». Вы можете убедиться в этом, вызвав команду «cat new.txt».

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

  1. Вызовите команду Linux Cat и перенаправьте вывод в существующий файл:

 

cat >> existing.txt
  1. Введите нужный текст в командную строку.
  2. Завершите ввод комбинацией клавиш [Ctrl] + [D].

Если мы используем символ «>» вместо переадресации вывода «>>», существующий файл будет перезаписан введенным текстом. Будьте осторожны с этим, так как предыдущее содержимое файла будет безвозвратно утеряно!

Использование команды Linux Cat для подготовки данных к дальнейшей обработке

Команда Linux Cat часто используется для объединения данных из нескольких файлов. Часто объединенные данные проходят через фильтры, чтобы подготовить их к дальнейшей обработке. Преимущественно она используется, когда схожие данные распределены по нескольким файлам. Каждый файл содержит по одной записи в строке. Например, вспомните списки имен, IP-адресов и т.п.

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

Описанные в нашем примере файлы с актерами «Симпсонов» схематично выглядели бы примерно так:

simpsons-1.txt simpsons-2.txt simpsons-3.txt
Лиза Барт Барт
Мардж Лиза Мэгги
Гомер Гомер Нельсон
Фландерс Милхаус  

Предположим далее, что отдельные текстовые файлы находятся в каталоге «simpsons/». Тогда следующего вызова команды Linux Cat, совмещенного с командами «uniq» и «sort», достаточно для записи списка всех актеров «Симпсонов» в файл «simpsons.txt»:

cat ./simpsons/*.txt | uniq | sort > simpsons.txt

Использование команды Linux Cat для нумерации строк текстового файла

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

С помощью команды Linux Cat нумерация проста. Мы используем опцию «-n» и перенаправление вывода:

cat -n doc.txt > doc.numbered.txt

В описанном сценарии может быть полезно пронумеровать все строки, кроме пустых. Более того, мы объединяем несколько пустых строк в одну. Для этого мы используем комбинацию опций «-s» и «-b»:

cat -sb doc.txt > doc.numbered.txt

Объединение файлов шаблонов с помощью команды Linux Cat

Хорошо известный шаблон из веб-программирования — это сборка документов из готовых частей. Комбинирование так называемых шаблонных частей с уникальными приводит к созданию разнообразных документов с последовательной структурой. Обычно для этого используется PHP с оператором «include» или специальный язык шаблонов, например Twig. Однако этот принцип можно реализовать с помощью команды Cat в Linux.

Предположим, что у нас есть несколько частей шаблона в каталоге «parts/». Верхний и нижний колонтитулы должны быть одинаковыми во всех документах. Структура и содержание верхнего и нижнего колонтитулов определены в файлах «header.html» и «footer.html». Кроме того, в каталоге «main/» находится несколько файлов с фактическим содержанием документов. Готовые документы хранятся в выходном каталоге «www/». Для создания документа достаточно следующего вызова команды Linux Cat:

cat ./parts/header.html ./main/home.html ./parts/footer.html > ./www/index.html

Другой сценарий использования: кодовая база должна быть снабжена текстом лицензии для публикации. Лицензия должна быть вставлена в начало каждого файла кода. Представим себе следующую схему каталога:

  • Файлы исходного кода Python с расширением «.py» в каталоге «src/».
  • Файл лицензии «license.py» в каталоге «inc/».
  • Изначально пустой каталог «dist/» для хранения обработанных файлов.

Мы используем команду Linux Cat внутри цикла for-loop. При каждом проходе цикла один и тот же файл лицензии конкатенируется с одним из файлов исходного кода. Результат записывается в новый файл исходного кода с тем же именем:

for file in ./src/*.py ; do
  cat ./inc/license.py "$file" > "./dist/${file}"
done

Слияние разделенных файлов с помощью команды Linux Cat

В основном Linux Cat используется для обработки обычных текстовых файлов. Однако команда также работает с двоичными файлами. Это полезно для некоторых сценариев. Во-первых, команды Linux «split» или «csplit» можно использовать для повторной сборки файлов, которые были разделены на несколько частей. Вот общий подход:

# Filename of the file to be split
file_name="./path/to/file"
# We explicitly specify the file extension to append it after merging
extension="txt"

# Split original file into 10-kilobyte chunks with prefix “part_”.
split -b 10k "${file_name}.${extension}" part_

# Merge individual pieces into a new file
cat part_* > combined

# Restore original file extension
mv combined "combined.${extension}"

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

# Create test folder on the desktop
mkdir ~/Desktop/cat-test/
# Switch to test folder
cd ~/Desktop/cat-test/

# Public domain cat image from WikiMedia
image=https://upload.wikimedia.org/wikipedia/commons/f/fa/Cat_using_computer.jpg

# Download image with "curl" in two parts
curl -s -r 0-500000 "$image" -o first-half &
curl -s -r 500001- "$image" -o second-half &
wait

# Combine parts and write to JPEG file
cat first-half second-half > image.jpg

Объединение потоков данных с помощью команды Linux Cat

Команда Linux cat может быть использована для объединения потоков данных при обработке видео. Общая схема показана в примере ниже. Сначала мы создаем несколько коротких видеопотоков из изображения JPEG с помощью команды ffmpeg. Затем мы объединяем их в одно непрерывное видео:

# Create a loop from the image
ffmpeg -y -loop 1 -i image.jpg -t 3 
    -c:v libx264 -vf scale=w=800:h=-1 
    still.ts

# Create a fade-in from the image
ffmpeg -y -loop 1 -i image.jpg -t 3 
    -c:v libx264 -vf scale=w=800:h=-1,fade=in:0:75 
    fadein.ts

# Create a fade from the image
ffmpeg -y -loop 1 -i image.jpg -t 3 
    -c:v libx264 -vf scale=w=800:h=-1,fade=out:0:75 
    fadeout.ts

# Combine fade up, loop and fade down
cat fadein.ts still.ts fadeout.ts > video.ts

Когда не следует использовать команду Linux Cat?

Излишнее использование команды Linux cat является хорошо известным «анти-паттерном». Многочисленные статьи описывают этот паттерн, и даже существует «Награда за бесполезное использование Cat». Как правило, Linux Cat следует использовать при объединении нескольких файлов. Обработка одного файла обычно возможна и без cat.

Давайте рассмотрим подход к минимизации ненужного использования команды Linux cat. В сообщениях на форумах и статьях в блогах часто можно заметить следующую картину:

cat example.txt | less

Команда Linux cat используется для чтения одного файла. Вывод передается команде «less» для постраничного отображения содержимого файла. Однако это можно сделать и более простым способом:

less < example.txt

Мы вызываем команду «less» и используем перенаправление ввода оболочки для чтения файла. Но этот подход можно упростить еще больше:

less example.txt

Вместо того чтобы использовать перенаправление ввода, мы передаем команде «less» файл для обработки. Это связано с тем, что почти все команды Linux принимают имя (имена) файла в качестве параметров.

Какие есть альтернативы команде Linux Cat?

Как уже говорилось ранее, команда Linux cat часто используется без необходимости. Для некоторых наиболее распространенных сценариев использования существуют альтернативы. Вот три примера:

Команда Альтернативное использование Пример
меньше / больше Вывод файла/содержимого постранично в командную строку less file.txt, more file.txt
touch Создать новый, пустой файл touch new.txt
echo Записать текст в файл echo «Текст» > file.txt

Какие команды похожи на команду Linux cat?

Существует ряд команд Linux, которые похожи на команду Cat. В качестве небольшой внутренней шутки, названия этих команд часто основаны на Cat. Во-первых, есть команда tac, которая представляет собой cat в обратном направлении. И именно так работает команда tac: точно так же, как Linux Cat, но с обратным выводом. Поэтому, когда команда tac вызывается для одного файла, первой выводится последняя строка, а не первая, как в Cat.

Другая команда с названием, похожим на Linux Cat, — это команда nc, сокращение от «Netcat». Эту команду часто называют «швейцарским армейским ножом для TCP/IP». Вместо того чтобы работать с локальными файлами, как cat, Netcat читает и записывает данные через сетевые соединения. Вы можете узнать больше в нашей статье на эту тему.

Более новой альтернативой команде cat в Linux является команда bat. На странице Github ее называют «клоном cat с крыльями». Команда bat сохраняет базовую функциональность команды Linux cat, но предоставляет некоторые удобные функции. В частности, команда bat добавляет подсветку синтаксиса к выводу файлов исходного кода.

Оцените статью
cdelat.ru
Добавить комментарий