# Практическая работа №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 последних строк файла?


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://antons-organization-1.gitbook.io/administrirovanie-linux/upravlenie-failami/prakticheskaya-rabota-6.-rabota-s-failami-v-unix.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
