> For the complete documentation index, see [llms.txt](https://antons-organization-1.gitbook.io/administrirovanie-linux/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://antons-organization-1.gitbook.io/administrirovanie-linux/upravlenie-failami/prakticheskaya-rabota-6.-rabota-s-failami-v-unix.md).

# Практическая работа №6. Работа с файлами в UNIX

*Цель работы:* знакомство с командной строкой UNIX, командами по работе с файловой системой и командами обработки текстовых файлов.

*Изучаемые команды:* [cat](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-cat), [cd](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-cd), [cp](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-cp), [cut](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-cut), [echo](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-echo), [find](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-find), [grep](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-grep), [head](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-head), [ln](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-ln), [ls](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-ls), [mkdir](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-mkdir), [mv](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-mv), [paste](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-paste), [pwd](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-pwd), [sort](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-sort), [tail](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-tail), [tar](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-tar), [touch](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-touch), [uniq](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-uniq), [wc](https://uneex.org/static/AltDocs_unix_base_admin/ch02s02.html#def-cmd-wc)

#### &#x20;Знакомство с каталогами UNIX

Здесь будет освещено знакомство с командами UNIX, изучение файловой системы и базовых каталогов, создание рабочей среды в домашнем каталоге пользователя для выполнения всех последующих команд.

*Начальные условия:* Командная строка после входа в систему.

1. Получить имя текущего каталога с помощью команды **pwd**:

   ```
   user@desktop ~ $ pwd
   /home/user/
   ```
2. Перейти в корневой каталог с помощью команды **cd /**:

   ```
   user@desktop ~ $ cd /
   user@desktop / $ pwd
   /
   ```

   Отметить, как изменилось строка приглашения.
3. Посмотреть содержимое корневого каталога с помощью команды **ls**:

   ```
   user@desktop / $ ls
   bin   dev  home  mnt  proc  sbin  tmp  var
   boot  etc  lib   opt  root  sys   usr
   ```
4. Сравнить с использованием «раскрашенного» вывода команды **ls -F --color**:

   ```
   user@desktop / $ ls -F --color
   bin/   dev/  home/  mnt/  proc/  sbin/  tmp/  var/
   boot/  etc/  lib/   opt/  root/  sys/   usr/
   ```

   Директории отмечаются синим цветом и знаком «/» после имени.
5. Посмотреть содержимое домашнего каталога с помощью команды **ls -F --color \~**:

   ```
   user@desktop / $ ls -F --color ~
   user@desktop / $
   ```

   Возможно, домашний каталог пуст.
6. Вернуться в домашний каталог с помощью **cd** без параметров:

   ```
   user@desktop / $ cd
   user@desktop ~ $
   ```
7. Создать директорию `test` с помощью команды **mkdir test**:

   ```
   user@desktop ~ $ mkdir test
   ```
8. Посмотреть обновлённое содержимое домашнего каталога **ls -F --color**:

   ```
   user@desktop ~ $ ls -F --color
   test/
   ```
9. Создать поддиректорию `subtest` в директории `test` командой **mkdir test/subtest**:

   ```
   user@desktop ~ $ mkdir test/subtest
   ```
10. Посмотреть содержимое домашнего каталога и его подкаталогов с помощью ключа рекурсивного просмотра *`-R`* в команде **ls -F --color -R**:

    ```
    user@desktop ~ $ ls -F --color -R
    .:
    test/
    test:
    subtest/

    test/subtest:
    ```

#### Изучение типов файлов в UNIX <a href="#shell-scenario-filetypes" id="shell-scenario-filetypes"></a>

Тут рассматриваются типы файлов в UNIX: простые файлы, директории, ссылки. Изучаются команды создания и копирования файлов. Показывается разница между жесткими и символическими ссылками, между копированием и переносом файла.

*Начальные условия:* Командная строка. Директория test после предыдущего сценария.

1. Cоздать пустой файл с помощью команды **touch test/first.txt**:

   ```
   user@desktop ~ $ touch test/first.txt
   user@desktop ~ $ ls -F --color test/                
   first.txt  subtest/
   ```
2. Добавить строку текста в конец файла с помощью команды **echo "Hello, world" >> test/first.txt** и перенаправления вывода:

   ```
   user@desktop ~ $ echo "Hello, world" >> test/first.txt
   ```
3. Посмотреть содержимое файла с помощью команды **cat test/first.txt**:

   ```
   user@desktop ~ $ cat test/first.txt
   Hello, world
   user@desktop ~ $
   ```
4. Посмотреть расширенную информацию о каталоге, используя ключ *`-l`* команды **ls**. **ls -F --color -l test**:

   ```
   user@desktop ~ $ ls -F --color -l test
   итого 4
   -rw-r--r--  1 user users 13 Окт 15 20:48 first.txt
   drwxr-xr-x  2 user users 48 Окт 13 21:33 subtest/
   ```
5. Добавить псевдоним командной оболочки, чтобы сократить размер команды, с помощью команды **alias ls='ls -F --color -l'**:

   ```
   user@desktop ~ $ alias ls='ls -F --color -l'
   user@desktop ~ $ ls test
   итого 4
   -rw-r--r--  1 user users 13 Окт 15 20:48 first.txt
   drwxr-xr-x  2 user users 48 Окт 13 21:33 subtest/
   ```
6. Посмотреть глубже на директорию `test`, используя ключи *`-a`* и *`-i`*. **ls -a -i test**

   ```
   user@desktop ~ $ ls -a -i test
   итого 7
   drwxr-xr-x   3 user users  104 Окт 15 20:49 ./
   drwx------  67 user users 3352 Окт 15 20:42 ../
   -rw-r--r--   1 user users   13 Окт 15 20:48 first.txt
   drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/
   ```

   Первый столбец – номера индексных узлов файловой системы. Третий столбец – число жёстких ссылок файла.
7. Перейти в каталог `test` с помощью команды **cd test**

   ```
   user@desktop ~ $ cd test
   ```
8. Скопировать файл с помощью команды **cp first.txt copy1.txt**:

   ```
   user@desktop test $ cp first.txt copy1.txt
   user@desktop test $ ls -a -i 
   итого 11
   5522107 drwxr-xr-x   3 user users  136 Окт 15 20:54 ./
   384269 drwx------  67 user users 3352 Окт 15 20:42 ../
   5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
   5937954 -rw-r--r--   1 user users   13 Окт 15 20:48 first.txt
   6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/
   ```

   Новый файл имеет свой собственный индексный узел.
9. Переименовать файл с помощью команды **mv first.txt orig.txt**. **mv first.txt orig.txt**:

   ```
   user@desktop test $ mv first.txt orig.txt
   user@desktop test $ ls -a -i
   итого 11
   5522107 drwxr-xr-x   3 user users  128 Окт 15 20:59 ./
   384269 drwx------  67 user users 3352 Окт 15 20:42 ../
   5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
   5937954 -rw-r--r--   1 user users   13 Окт 15 20:48 orig.txt
   6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/
   ```

   Отметим, что изменилось только имя файла, все остальные атрибуты остались прежними.
10. Создать жёсткую ссылку командой **ln orig.txt copy2.txt**:

    ```
    user@desktop test $ ln orig.txt copy2.txt
    user@desktop test $ ls -a -i
    итого 15
    5522107 drwxr-xr-x   3 user users  160 Окт 15 21:00 ./
    384269 drwx------  67 user users 3352 Окт 15 20:42 ../
    5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
    5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 copy2.txt
    5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 orig.txt
    6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/
    ```

    Добавилась ещё одна ссылка на тот же файл, число ссылок увеличилось на 1.
11. Создать символическую ссылку командой **ln -s orig.txt orig.lnk**:

    ```
    user@desktop test $ ln -s orig.txt orig.lnk
    user@desktop test $ ls -a -i
    итого 15
    5522107 drwxr-xr-x   3 user users  184 Окт 15 21:18 ./
    384269 drwx------  67 user users 3352 Окт 15 21:02 ../
    5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
    5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 copy2.txt
    5938189 lrwxrwxrwx   1 user users    8 Окт 15 21:18 orig.lnk -> orig.txt
    5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 orig.txt
    6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/
    ```

    Новый файл имеет новый индексный узел и размер, равный имени файла `orig.txt`.
12. Сравним содержимое файлов при обращении к ним по имени:

    ```
    user@desktop test $ cat orig.txt
    Hello, world
    user@desktop test $ cat copy2.txt
    Hello, world
    user@desktop test $ cat orig.lnk
    Hello, world
    ```

    К одним и тем же данным можно обратиться через жесткую или символическую ссылку.

#### Поиск системных журналов <a href="#shell-scenario-find" id="shell-scenario-find"></a>

Изучается команда поиска файлов и директорий.

*Начальные условия:* Командная строка, директория test после прошлого сценария.

1. Перейти в каталог `test` с помощью команды **cd test**:

   ```
   user@desktop ~ $ cd test
   ```
2. Вывести список всех файлов и директорий в текущей директории, включая содержимое поддиректорий с помощью команды **find**:

   ```
   user@desktop ~ $ find
   .
   ./orig.lnk
   ./orig.txt
   ./subtest
   ./copy1.txt
   ./copy2.txt
   ```
3. Найти все файлы и дериктории в текущей директории и ее поддиректориях, которые начиняются на «o» с помощью команды **find -name "o\*"**:

   ```
   user@desktop ~ $ find -name "o*"
   ./orig.lnk
   ./orig.txt
   ```
4. Найти все файлы и дериктории в директории `/etc` и ее поддиректориях, которые начиняются на «o» с помощью команды **find /etc -name "o\*"**:

   ```
   user@desktop ~ $ find /etc -name "o*"
   /etc/apm/other.d
   /etc/joe/syntax/ocaml.jsf
   /etc/opt
   /etc/ppp/options-pptp
   /etc/ppp/options-pppoe
   /etc/ppp/options
   /etc/ssl/openssl.cnf
   /etc/dpkg/origins
   /etc/pam.d/other
   /etc/texmf/tex/plain/config/omega.ini
   ```
5. Найти все обычные файлы в директории `/etc` и ее поддиректориях, которые начинаются на «o» с помощью команды **find /etc -name "o\*" -a -type f**:

   ```
   user@desktop ~ $ find /etc -name "o*" -a -type f
   /etc/joe/syntax/ocaml.jsf
   /etc/ppp/options-pptp
   /etc/ppp/options-pppoe
   /etc/ppp/options
   /etc/ssl/openssl.cnf
   /etc/pam.d/other
   /etc/texmf/tex/plain/config/omega.ini
   ```
6. Найти все обычные файлы в директории `/var/` и ее поддиректориях, заканчивающиеся на «log»:

   ```
   user@desktop ~ $ find /var -name "*log" -a -type f
   find: /var/lib/mysql: Permission denied
   find: /var/lib/samba/private: Permission denied
   ...
   /var/log/emerge.log
   /var/log/lastlog
   /var/log/faillog
   /var/log/Xorg.0.log
   ```

   Список найденных файлов может быть слишком большим и для его просмотра можно воспользоваться «прокруткой» терминала с помощью клавиш **Shift**+**PgUp** и **Shift**+**PgDn**
7. Исключить вывод сообщений об ошибках (например, «Permission denied») с помощью перенаправления вывода ошибок в специальное устройство `/dev/null`. Для этого ввести команду **find /var -name "\*log" -a -type f 2>/dev/null**

   ```
   user@desktop ~ $ find /var -name "*log" -a -type f  2>/dev/null
   /var/log/emerge.log
   /var/log/lastlog
   /var/log/faillog
   /var/log/Xorg.0.log
   ```
8. Создать директорию `logs` с помощью команды **mkdir test/logs**:

   ```
   user@desktop ~ $ mkdir test/logs
   ```
9. Скопировать найденные файлы в локальную директорию с помощью параметра *`-exec`* команды find. Для этого ввести команду **find /var -name "\*log" -a -type f -exec cp {} test/logs/  \\; 2>/dev/null**

   ```
   user@desktop ~ $ find /var -name "*log" -a -type f -exec cp {} test/logs/ \; 2>/dev/null
   user@desktop ~ $ ls test/logs
   итого 789
   -rw-r-----  1 user users 601033 Окт 16 18:37 emerge.log
   -rw-r--r--  1 user users 292292 Окт 16 18:37 lastlog
   -rw-r--r--  1 user users  37383 Окт 16 18:37 Xorg.0.log
   ```

   Были скопированы все файлы, права на чтение которых у нас есть.

#### Архивирование и деархивирование файлов и директорий <a href="#shell-scenario-arch" id="shell-scenario-arch"></a>

Здесь изучается команда архивирования файлов и директорий. Командная строка, директория test после прошлого сценария.

*Начальные условия:*

1. Перейти в домашнюю директорию с помощью команды **cd**:

   ```
   user@desktop test $ cd
   user@desktop ~ $
   ```
2. Создать архив с именем `test.tar.gz` с применением сжатия, содержащий директорию `test` с помощью команды **tar -czf test.tar.gz test**:

   ```
   user@desktop ~ $ tar -czf test.tar.gz test
   user@desktop ~ $ ls
   drwxr-xr-x   4 user users   208 Окт 16 18:36 test/
   -rw-r--r--   1 user users 79173 Окт 16 18:49 test.tar.gz
   ```
3. Создать новую директорию для содержимого архива командой **mkdir test2**:

   ```
   user@desktop ~ $ mkdir test2
   ```
4. Перейти в новую директорию с помощью команды **cd test2**:

   ```
   user@desktop ~ $ cd test2
   ```
5. Развернуть содержимое архива в текущую директорию с помощью команды **tar -xzf ../test.tar.gz**:

   ```
   user@desktop test2 $ tar -xzf ../test.tar.gz
   ```
6. Убедиться, что содержимое распакованного архива совпадает с оригинальной директорией. Ввести команду **ls -l -F**:

   ```
   user@desktop test2 $ ls -l -F
   итого 0
   drwxr-xr-x  4 user users 208 Окт 16 18:36 test/
   user@desktop test2 $ ls -l -F test
   итого 12
   -rw-r--r--  1 user users  13 Окт 15 20:54 copy1.txt
   -rw-r--r--  2 user users  13 Окт 15 20:48 copy2.txt
   drwxr-xr-x  2 user users 136 Окт 16 18:37 logs/
   lrwxrwxrwx  1 user users   8 Окт 16 18:54 orig.lnk -> orig.txt
   -rw-r--r--  2 user users  13 Окт 15 20:48 orig.txt
   drwxr-xr-x  2 user users  48 Окт 13 21:33 subtest/
   ```

#### Создание новых текстовых файлов <a href="#shell-scenario-text" id="shell-scenario-text"></a>

Тут изучаются команды для создания и модифицирования текстовых файлов. Командная строка.

*Начальные условия:*

1. Ввести команду **echo "One line"**:

   ```
   user@desktop test $ echo "One line"
   One line
   ```

   Данная команда принимает строку в виде аргумента и выводит её на стандартный вывод.
2. Ввести ту же команду, но перенаправить вывод в файл `second.txt` с помощью «>». Ввести команду **echo "One line" > second.txt**:

   ```
   user@desktop test $ echo "One line" > second.txt
   ```
3. Добавить в конец файла `second.txt` строку «A line» с помощью другого перенаправления **echo "A line" >> second.txt**:

   ```
   user@desktop test $ echo "A line" >> second.txt
   ```
4. Вывести содержимое файла с помощью команды **cat second.txt**:

   ```
   user@desktop test $ cat second.txt
   One line
   A line
   ```
5. С помощью команды cat можно создавать многострочные файлы –, если переопределить вывод программы в файл и вводить текст до нажатия **Ctrl**+**D** (конец ввода). Ввести команду **cat >multiline.txt** и набрать текст

   ```
   user@desktop test $ cat >multiline.txt
   Simple text:
   blah-blah-blah
   1 2 3 4 5 6 7 8 9 0

   bye!

   (Ctrl+D)
   user@desktop test $
   ```
6. Убедиться, что содержимое файла совпадает с введённым текстом, включая все переводы строки. Для этого ввести команду **cat multiline.txt**

   ```
   user@desktop test $ cat multiline.txt
   Simple text:
   blah-blah-blah
   1 2 3 4 5 6 7 8 9 0

   bye!
   ```
7. Основным назначением команды cat является объединение файлов, имена которых передаются как аргументы командной строки. Объединить файлы с помощью команды **cat orig.txt second.txt multiline.txt > big.txt**:

   ```
   user@desktop test $ cat orig.txt second.txt multiline.txt > big.txt
   ```
8. Убедиться, что новый файл содержит строки из перечисленных файлов с помощью команды **cat big.txt**:

   ```
   user@desktop test $ cat big.txt
   Hello, world
   One line
   A line
   Simple text:
   blah-blah-blah
   1 2 3 4 5 6 7 8 9 0

   bye!
   ```

#### Разрезание и склеивание файлов <a href="#shell-scenario-cutpaste" id="shell-scenario-cutpaste"></a>

Здесь изучается, как выделять информацию, разбитую на части с помощью специального символа-разделителя (например, пробела или символа :), из файлов и создавать новые структурированные файлы.

*Начальные условия:* Командная строка.

1. Посмотреть содержимое файла `/etc/passwd`, в котором содержится информация о пользователях системы, с помощью команды **cat /etc/passwd**:

   ```
   user@desktop test $ cat /etc/passwd
   root:x:0:0:root:/root:/bin/bash
   bin:x:1:1:bin:/bin:/bin/false
   daemon:x:2:2:daemon:/sbin:/bin/false
   adm:x:3:4:adm:/var/adm:/bin/false
   lp:x:4:7:lp:/var/spool/lpd:/bin/false
   sync:x:5:0:sync:/sbin:/bin/sync
   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
   ...
   ```

   Каждая строка хранит запись об отдельном пользователе. Запись состоит из полей, разделённых символом «:».
2. Выделить первый столбец в каждой записи, установив разделитель в «:», с потощью команды **cat /etc/passwd | cut -f1 -d:**:

   ```
   user@desktop test $ cat /etc/passwd | cut -f1 -d:
   root
   bin
   daemon
   adm
   lp
   sync
   shutdown
   ...
   ```
3. Отсортировать список пользователей по алфавиту с помощью команды **cat /etc/passwd | cut -f1 -d: | sort**:

   ```
   user@desktop test $ cat /etc/passwd | cut -f1 -d: | sort
   adm
   alias
   apache
   at
   bin
   cron
   cyrus
   ...
   ```
4. Выделить седьмой столбец в каждой записи, соответствующий командной оболочке пользователя, с помощью команды **cat /etc/passwd | cut -f7 -d:**

   ```
   user@desktop test $ cat /etc/passwd | cut -f7 -d:
   /bin/bash
   /bin/false
   /bin/false
   /bin/false
   /bin/false
   /bin/sync
   ...
   ```

   Список содержит много повторяющихся строк.
5. Удалить повторяющиеся строки командой **cat /etc/passwd | cut -f7 -d: | uniq**:

   ```
   user@desktop test $ cat /etc/passwd | cut -f7 -d: | uniq
   /bin/bash
   /bin/false
   /bin/sync
   /sbin/shutdown
   /sbin/halt
   /bin/false
   ...
   ```

   Некоторые повторяющиеся строки остались, так как сравниваются только последовательные строки.
6. Добиться полной уникальности, предварительно отсортировав строки с помощью команды sort. Ввести команду **cat /etc/passwd | cut -f7 -d: | sort | uniq**:

   ```
   user@desktop test $ cat /etc/passwd | cut -f7 -d: | sort | uniq
   /bin/bash
   /bin/false
   /bin/sync
   /dev/null
   /sbin/halt
   /sbin/shutdown
   ```
7. Выделить первый и седьмой столбец файла `/etc/passwd` в отдельные файлы. Для этого ввести команды **cat /etc/passwd | cut -f1 -d: > users** и **cat /etc/passwd | cut -f7 -d: > shells**:

   ```
   user@desktop test $ cat /etc/passwd | cut -f1 -d: > users
   user@desktop test $ cat /etc/passwd | cut -f7 -d: > shells
   ```
8. Объединить результаты с помощью команды **paste users shells**:

   ```
   user@desktop test $ paste users shells
   root    /bin/bash
   bin     /bin/false
   daemon  /bin/false
   adm     /bin/false
   lp      /bin/false
   sync    /bin/sync
   ...
   ```

#### Быстрый анализ текстов <a href="#shell-scenario-analysis" id="shell-scenario-analysis"></a>

Изучим команды, которые позволяют провести первичный анализ файла: с чего он начинается, как заканчивается и каков его размер.

*Начальные условия:* Командная строка.

1. Получить число строк в файле `/etc/passwd` с помощью команды **wc -l /etc/passwd** :

   ```
   user@desktop test $ wc -l /etc/passwd
   44 /etc/passwd
   ```
2. Или другим способом: посчитав число слов в созданном ранее файле `users` с помощью команды **cat users | wc -w**:

   ```
   user@desktop test $ cat users | wc -w
   44
   ```
3. Посмотреть первые несколько строк длинного файла с помощью команды **head logs/Xorg.0.log**:

   ```
   user@desktop test $ head logs/Xorg.0.log
   X Window System Version 6.8.2
   Release Date: 9 February 2005
   X Protocol Version 11, Revision 0, Release 6.8.2
   Build Operating System: Linux 2.6.13-gentoo i686 [ELF]
   Current Operating System: Linux thinkpad 2.6.13-gentoo #1 Wed Sep 7 01:03:14 MSD 2005 i686
   Build Date: 08 October 2005
   Before reporting problems, check http://wiki.X.Org
   to make sure that you have the latest version.
   Module Loader present
   ```
4. Аналогично, посмотреть последние несколько строк с помощью команды **tail logs/Xorg.0.log**:

   ```
   user@desktop test $ tail logs/Xorg.0.log
   (II) RADEON(0): [RESUME] Attempting to re-init Radeon hardware.
   (II) RADEON(0): [agp] Mode 0x1f000201 [AGP 0x8086/0x3340; Card 0x1002/0x4c66]
   (II) Mouse1: ps2EnableDataReporting: succeeded
   SetClientVersion: 0 8
   SetGrabKeysState - disabled
   SetGrabKeysState - enabled
   (II) 3rd Button detected: disabling emulate3Button
   SetClientVersion: 0 8
   SetGrabKeysState - disabled
   SetGrabKeysState - enabled
   ```

   Это бывает полезно при просмотре системных журналов – в них самые последние события содержатся в конце файлов.

#### Поиск строк по регулярным выражениям <a href="#shell-scenario-regexp" id="shell-scenario-regexp"></a>

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

*Начальные условия:* Командная строка. Директория test/log с найденными системными журналами.

1. Скопировать файл журнала  rpmpkgs
2. Среди найденных системных журналов посмотреть файл журнала пакетного менеджера rpm с помощью команды **less test/log/rpmpkgs** :

   ```
   user@desktop ~ $ less test/log/rpmpkgs
   ```

   Выйти из *less* можно нажатием клавиши **q**.
3. Найти все предупреждения в журнале: строка, начинающаяся с «(WW)». Для этого ввести команду **grep "^(WW)" test/log/rpmpkgs**:

   ```
   user@desktop ~ $ grep "^(WW)" test/log/XFree86.0.log
   (WW) The directory "/usr/share/fonts/freefonts/" does not exist.
   (WW) The directory "/usr/share/fonts/unifont/" does not exist.
   (WW) The directory "/usr/share/fonts/artwiz/" does not exist.
   ...
   ```
4. Получить все строки, содержащие следующий шаблон: последовательность из 1 или более цифры или буквы, затем символ собаки, затем еще одна последовательность 1 или более цифры или буквы или точки, затем символ точки, затем от двух до четырёх букв (имя домена первого уровня). Также служебный вывод ошибок удаляется (перенаправляется в нулевое устройство). Для этого ввести команду **grep "\[a-zA-z0-9]\\+@\[a-zA-z0-9\\.]\\+\\.\[a-z]\\{2,4\\}" /etc/\* 2>/dev/null**:

   ```
   user@desktop ~ $ grep "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
   /etc/devfsd.conf:# Richard Gooch  <rgooch@atnf.csiro.au>                3-JUL-2000
   /etc/inittab:# Author:  Miquel van Smoorenburg, <miquels@cistron.nl>
   /etc/inittab:# Modified by:  Patrick J. Volkerding, <volkerdi@ftp.cdrom.com>
   ...
   ```

   При работе с несколькими файлами grep по умолчанию использует вывод имени файла перед найденной строкой.
5. Избавиться от имени файла в начале строки с помощью ключа *`-h`*. Ввести команду **grep -h "\[a-zA-z0-9]\\+@\[a-zA-z0-9\\.]\\+\\.\[a-z]\\{2,4\\}" /etc/\* 2>/dev/null**:

   ```
   user@desktop ~ $ grep -h "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
                         # Richard Gooch  <rgooch@atnf.csiro.au>                3-JUL-2000
                         # Author:  Miquel van Smoorenburg, <miquels@cistron.nl>
                         # Modified by:  Patrick J. Volkerding, <volkerdi@ftp.cdrom.com>
                         ...
   ```
6. Для вывода только найденной подстроки используется ключ *`-o`*. Ввести команду **grep -ho "\[a-zA-Z0-9]\\+@\[a-zA-Z0-9\\.]\\+\\.\[a-z]\\{2,4\\}" /etc/\* 2>/dev/null**:

   ```
   user@desktop ~ $ grep -ho "[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
   rgooch@atnf.csiro.au
   miquels@cistron.nl
   volkerdi@ftp.cdrom.com
   ...
   ```
7. Получить все файлы директории `/etc/` с помощью команды **find /etc -type f 2>/dev/null**, игнорируя ошибки:

   ```
   user@desktop ~ $ find /etc -type f 2>/dev/null
   /etc/X11/xorg.conf.example
   /etc/X11/Sessions/kde-3.4
   /etc/X11/Sessions/Xsession
   /etc/X11/chooser.sh
   ...
   ```
8. Для каждого из найденных файлов произвести поиск подстроки «nameserver». Для этого ввести команду **find /etc -type f -exec grep "nameserver" {} \\; 2>/dev/null**:

   ```
   user@desktop ~ $ find /etc -type f -exec grep "nameserver" {} \; 2>/dev/null
   # merge the new nameservers with the other options from the old ...
   grep --invert-match '^nameserver[[:space:]]' $REALRESOLVCONF
   nameserver 10.22.10.20
   ...
   ```
9. Для большего удобства добавить вывод имени файла (ключ *`-H`*) и номера строки (ключ *`-n`*), на которой было найдено совпадение, с помощью команды **find /etc -type f -exec grep -Hn "nameserver" {} \\; 2>/dev/null**:

   ```
   user@desktop ~ $ find /etc -type f -exec grep -Hn "nameserver" {} \; 2>/dev/null
   /etc/ppp/ip-up:24:              # merge the new nameservers with the other optio...
   /etc/ppp/ip-up:26:                      grep --invert-match '^nameserver[[:space...
   /etc/ppp/resolv.conf:1:nameserver 10.22.10.20
   ...
   ```

   Таким образом, команда grep может эффективно использоваться вместе с командой find для нахождения информации в файлах.

#### Задания для самостоятельного выполнения <a href="#id2597863" id="id2597863"></a>

1. Создайте каталог test1 в домашней директории. Сравните время создания системных каталогов /bin, /tmp с каталогом test1.
2. Скопируйте файл /bin/ls в локальную директорию. Посмотрите атрибуты этого файла. Попробуйте запустить его.
3. Создайте в локальной директории символическую ссылку tmplnk на директорию /tmp. Скопируйте несколько файлов в директрию tmplnk.
4. Сравните файлы /dev/tty1 и /dev/hda1. Какой тип они имеют? Чем они отличаются?
5. Найдите все файлы в системе, которые были модифицированы не более суток назад.
6. С помощью одной команды найдите все файлы с расширением .html в директории /usr и скопируйте их в локальную папку htmls.
7. Создайте архив директории /etc и узнайте его размер. Попробуйте создать сжатый архив той же папки. Сравните степень сжатия gzip и bzip2 на этом примере.
8. Создайте текстовый файл a.txt из десяти строк. Узнайте его размер. Создайте новый файл, содержащий в себе файл a.txt четыре раза.
9. С помощью одной команды найдите все файлы с расширением .txt в директории /usr и объедините их в один большой файл big.txt.
10. Получите с помощью одной команды файл, содержащий все числовые идентификаторы пользователей, зарегистрированных в ситсеме.
11. Получите с помощью одной команды строки с 5-ой по 8-ю в файле /proc/cpuinfo, содержащем информацию о процессоре.
12. Придумайте регулярное выражение, соответствующее URL с использованием протокола http. Найдите все строки, содержащие такие URL в файлах директории /etc.
13. С помощью одной команды найдите все файлы с расширениями .txt или .html в директории /usr, в которых содержится слово user.

**Контрольные вопросы**

1. Какие утилиты для архивирования существуют в Linux?
2. Какие основные различия между файловыми системами Ext2, Ext3 и Ext4?
3. Как просмотреть информацию о файловой системе, включая индексные дескрипторы, блоки и размер блока?
4. Как проверить, какие файловые системы уже смонтированы в системе Linux?
5. Какую команду следует использовать для вывода 25 последних строк файла?
