# Работа с командной строкой Linux. Часть вторая. ### Тема: Знакомство с Linux. ##### Цель работы: Научиться: работать в командной строке. ##### Необходимые материалы: Пк с доступом в интернет. Виртуальные машины с Linux Debian и Ubuntu. ## Теоретическая часть ### Работа в командной строке ### Управление текстовым потоком **Студент должен уметь управлять и фильтровать текстовый поток.** :::success Множество файлов в Linux неудобны для восприятия без предварительного форматирования, кроме того процесс обработки текстовой информации часто требует ее форматирования, обрезания, сортировки и т.д. Linux предлагает широкий набор инструментов редактирования текстового вывода, при этом следует заметить что указанные инструменты не затрагивают исходный файл (или текстовый поток), а форматируют его, выдавая полученный результат в консоль или другой файл. ::: **Простой вывод текста (без корректировки содержимого):** Для вывода содержимого файла или объединения нескольких файлов на выводе используется команда cat , например: `сat 1.txt 2.txt > 3.txt` (передать содержимое двух файлов в третий); - Команда **join** объединяет строки нескольких файлов по общему полю и отправляет их на стандартный вывод. - Команда **less** загружает файл постепенно и также отправляет его на вывод (удобно для больших файлов). - Команда **nl** нумерует строки. - Команда **pr** показывает, как содержимое файла будет выглядеть при выводе его на печать. - Команда **paste** вставляет строки из одного файла в другой и отправляет результат на стандартный вывод. - Команда **head** показывает первые строки файла, а **tail** – последние. Например: `head –n 2 /var/log/syslog` (вывести первые две строчки файла); `tail –f /var/log/syslog` (показывать последние строки файла, отображая содержимое в реальный момент времени); - Команда **sort** может отсортировать содержимое файла по какому-нибудь признаку, например: `sort 1.txt` (отсортировать строки по алфавиту); - Команда **wc** позволяет посчитать количество символов и т.д. в текстовом потоке, например: `wc 1.txt` (посчитать количество строк, символов, слов); Для получения справочной информации доступны команды: ```bash! man #справка по команде; file #справка по файлу; whatis #справка по названию; history #вывод истории команд (список хранится в .bash_history); ``` Вывод форматированного текста (с корректировкой содержимого): - Команда **cut** используется для обрезания содержимого файлов на выводе, например: `сut – c 2,3,4,5,10 1.txt` (показывать только символы на указанных позициях: 2,3,4,5,10); - Команда **expand** превращает символы табуляции в несколько пробелов, а **unexpand** наоборот – пробелы в символы табуляции. - Команда **fmt** предназначена для форматирования текста различными способами, например: `fmt 1.txt` (вывести содержимое файла в одну строку); `fmt –w 10 1.txt` (вывести содержимое файла в строки не больше 10 символов каждая); - Команда **od** предназначена для конвертации текста в другой формат, например: `od –c 1.txt` (отобразить в кодировке ASCI); - Команда **tr** предназначена для замены и удаления символов в текстовом потоке, например: `echo "HELLO " | tr – t L l` (заменить " L" на " l" в полученном на вводе тексте); - Команда **split** может разбить файла по каким-либо критериям, например: `split –l 2 1.txt` (разбить содержимое файла по две строчки); - Команда **uniq** предназначена для поиска повторяющихся строк, например: `uniq –u 1.txt` (показать только уникальные строки); - **Sed** – отдельный мощный инструмент, понимающий групповые символы, шаблоны и т.д. Будет рассмотрен немного подробнее в дальнейших урока. Работает, например, так: `sed –e 's/socks/people/' 1.txt` ( заменить в файле слово "socks" на «people"); ### Основные операции с файлами **Студент должен уметь управлять файлами и каталогами при помощи основных команд Linux** :::success Частой задачей администратора в Linux является работа с файлами и каталогами: создание, копирование, перемещение и удаление. Использование групповых символов вместе с инструментами консоли позволяют осуществлять эти действия с максимальной эффективностью. ::: Для создания директорий используется команда **mkdir имя_каталога**, для удаления пустого каталога - **rmdir имя_каталога**. Просмотр содержимого текущей директории – **ls**. Например: ```bash! ls –l #просмотреть содержимое текущего каталога; ls fol #посмотреть содержимого каталогов, имена которых начинаются с fol; ``` Для копирования используется команда cp что_копировать куда_копировать , например: **`cp –R Folder NewFolder`** - скопировать директорию "Folder" со всем содержимым в текущий каталог с именем новой директории "NewFolder"); Для переноса используется команда **mv** что_переносить куда_переносить , например: **`mv file.txt folder_1/`** (перенести " file.txt" в каталог " folder_1» в текущей директории); Для удаления используется команда **rm что_удалить**, например: **`rm –rf folder 1`** (удалить каталог folder_1 вместе с содержимым); Для создания пустого файла, или обновления метки доступа существующего, используется команда **touch имя_файла**, а для получения информации о файле – команда **file имя_файла**. Групповые символы, использующиеся при работе с текстовыми данными: ``` * – любое количество любых символов; ?_ – любой символ;_ ! – не (любой символ кроме указанных); [ac] – a или c; [a - c] – a , b , c ``` Например: ```bash! ls * #(вывести содержимое всех каталогов); ls ?at.txt #(вывести содержимое файла с именем: любая первая буква, остальная часть имени " at.txt"); ls *at.txt #(вывести содержимое файла с именем, оканчивающимся на " at.txt"); ls ![ab] #(вывести содержимое файла или каталога с именем, начинающимся с любых символов, кроме "a" и "b"); ``` Для поиска информации используется команда **find**, например: ```bash! find . -name "\A" #(искать в текущей директории объекты, имеющие в имени символ "A"); find /etc -size -5M #(искать в директории "/etc" объекты размером менее 5 Мб); find . – type l #(искать в текущей директории ссылки); find /usr/share -name '*log*' #поиск в указанной диреректории фалов имеющих в название "log". ``` В среде Linux существует несколько распространённых архиваторов, использующихся для распаковки и упаковки объектов в единый файл: - **сpio** - двоичный архиватор, копирующий информацию в архив и обратно; - **dd** - копирование по блокам; - **gzip и gunzip** - утилита сжатия и восстановления файлов (контейнер одного файла); - **bzip2 и bunzip2** - утилита сжатия и восстановления файлов (контейнер одного файла); - **xz и unxz** - утилита сжатия и восстановления файлов (контейнер одного файла); - **tar** - архиватор (работает с набором файлов и каталогов). Например: - **`find . –name "*.txt" | cpio – o > ./ test. cpio`** (найти в текущей папке все файлы с расширением `".txt"` и упаковать их в архив `test.cpio`, расположив его на уровень выше текущей директории); - **`cpio -id < test . cpio`** (распаковать в текущий каталог архив `"test.cpio"`, создавая при необходимости структуру директорий); - **`dd if =/dev/sdb of = drive.img`** (скопировать носитель `/dev/sdb` в образ `drive.img` , располагающийся в текущей директории); - **`gzip drive.img`** (сжать образ `"drive.img"` до `"drive.img.gz"`, удалив исходный файл); - **`bunzip2 drive.img.bz2`** (распаковать архив `"drive.img.bz2"` в текущий каталог); - **`unxz drive.img.xz`** (распаковать архив " `drive.img.xz`" в текущий каталог); - **`tar cvf arch.tar folder`** (упаковать каталог `folder` в архив `"arch.tar"`). - **`tar –xvf archive.tar `** (распаковать архив `archive.tar`). ### Потоки, конвейеры и перенаправления **Студент должен уметь управлять потоками для обработки текстовых данных** :::success Linux традиционно использует потоки для ввода, вывода и ошибок. Обычно ввод – это клавиатура или файлы, а вывод ошибок и результатов происходит в консоль. Но часто бывает нужно объединить последовательность команд в конвейер, или отправить результат в какой-нибудь файл. ::: Для того чтобы послать на ввод программы некоторые данные используется знак "<", например: **`wc < file 1. txt `** (использовать в качестве ввода для программы wc файл `file.txt`); Для того чтобы послать вывод программы куда-нибудь, кроме стандартного направления, используется знак ">", например: ```bash! ls > list.txt #(перезаписать содержимое файла list.txt результатом команды ls); ls >> list.txt #(дописать в файл list.txt результат команды ls); ``` Для ввода, вывода и ошибок используются следующие обозначения: - Stdin – стандартный ввод программы (обозначение "0"); - Stdout – стандартный вывод программы (обозначение "1"); - Stderr – стандартные ошибки программы (обозначение "2"); Например: ```bash! ls bob 2> error.txt ls bob > result .txt 2> error .txt ``` ## Практическая часть. 1. Создайте пустой файл history. Запишите в этот файл историю выполненных ранее команд без использования редактора. 2. Выведите в консоль содержимое директории. 3. Выведите в консоль содержимое файла history c нумерацией строк. 4. Выведите в консоль с помощью команд первую и последнюю строку файла history. 5. Создайте файл .secret. Выведите в консоль содержимое директории так чтобы увидеть этот файл. 6. Посмотрите справку по команде ip. 7. Посмотрите настройки сетевых интерфейсов с помощью команды ip 8. Выведите с помощью команды less содержимое журнала syslog если его нет возьмете файл /var/log/apt/history.log. 9. Используя команду man прочитайте что делает команда sort. Отсортируйте файл history тремя разными способами. 10. Создайте директорию documents в домашней директории root пользователя. Перейдите в созданную директорию и создайте в ней 3 файла: 1.txt 2.txt 3.txt. Запишите в файл 1.txt свою фамилию в 2.txt свое имя 3.txt свое отчетсво. 11. Создайте архив из созданной раннее директории documents с помощью утилиты tar. Удалите директорию documents. 12. Распакуйте архив в текущию директорию и выведите содержимое папки documents. 13. Выполните команду curl cheat.sh/tar. Что показала эта команда? Выполните команду curl cheat.sh/ls. Создайте пустой файл с названием cheat.sh и запишите туда вывод обоих ранее команд без замены содержимого. 14. Перейдите в директорию /var и выполните поиск файлов с расширением .log. 15. Найдите файл syslog в директории /var/log и скопируйте его в в домошнию директорию пользователя если его нет возьмете файл /var/log/apt/history.log. 16. Переименуйте скопированный файл в system.log. 17. Выведите первые 3 строки файла system.log и удалите его. ## Контрольные вопросы. 1. **С помощью каких команд можно создавать и удалять файлы?** 2. **С помощью какой команды можно перемещаться по директориям в Linux?** 3. **C помощью какой команды можно посмотреть содержимое директории?** 4. **Какими командами можно выводить содержимое файлов в консоль?** 5. **Какой командой можно искать файлы по какому-либо признаку?** 6. **Какой командой можно скопировать файл?** 7. **Какой командой можно переместить файл?** 8. **Какие команды используются для создания архивов?** 9. **Какой командой можно посмотреть конфигурацию сетевых интерфейсов?**