# Работа с командной строкой 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. **Какой командой можно посмотреть конфигурацию сетевых интерфейсов?**