Цель занятия: знакомство с командной строкой UNIX, командами по работе с файловой системой и командами обработки текстовых файлов.
Изучаемые команды: cat, cd, cp, cut, echo, find, grep, head, ln, ls, mkdir, mv, paste, pwd, sort, tail, tar, touch, uniq, wc
В этом сценарии будет освещено знакомство с командами UNIX, изучение файловой системы и базовых каталогов, создание рабочей среды в домашнем каталоге пользователя для выполнения всех последующих команд.
Начальные условия: Командная строка после входа в систему.
Получить имя текущего каталога с помощью команды pwd:
user@desktop ~ $ pwd /home/user/
Перейти в корневой каталог с помощью команды cd /:
user@desktop ~ $ cd / user@desktop / $ pwd /
Отметить, как изменилась строка приглашения.
Посмотреть содержимое корневого каталога с помощью команды ls:
user@desktop / $ ls bin dev home mnt proc sbin tmp var boot etc lib opt root sys usr
Сравнить с использованием «раскарашенного» вывода команды ls -F --color:
user@desktop / $ ls -F --color bin/ dev/ home/ mnt/ proc/ sbin/ tmp/ var/ boot/ etc/ lib/ opt/ root/ sys/ usr/
Диретории отмечаются синим цветом и знаком «/» после имени.
Посмотреть содержимое домашнего каталога с помощью команды ls -F --color ~:
user@desktop / $ ls -F --color ~ user@desktop / $
Возможно, домашний каталог пуст.
Вернуться в домашний каталог с помощью cd без параметров:
user@desktop / $ cd user@desktop ~ $
Создать директорию test
с помощью
команды mkdir test:
user@desktop ~ $ mkdir test
Посмотреть обновлённое содержимое домашнего каталога ls -F --color:
user@desktop ~ $ ls -F --color test/
Создать поддиректорию subtest
в
директории test
командой mkdir test/subtest:
user@desktop ~ $ mkdir test/subtest
Посмотреть содержимое домашнего каталога и его подкаталогов с помощью ключа
рекурсивного просмотра -R
в команде
ls -F --color -R:
user@desktop ~ $ ls -F --color -R .: test/ test: subtest/ test/subtest:
В этом сценарии рассматриваются типы файлов в UNIX: простые файлы, директории, ссылки. Изучаются команды создания и копирования файлов. Показывается разница между жесткими и символическими ссылками, между копированием и переносом файла.
Начальные условия: Командная строка. Директория test после предыдущего сценария.
Cоздать пустой файл с помощью команды touch test/first.txt:
user@desktop ~ $ touch test/first.txt user@desktop ~ $ ls -F --color test/ first.txt subtest/
Добавить строку текста в конец файла с помощью команды echo "Hello, world" >> test/first.txt и перенаправления вывода:
user@desktop ~ $ echo "Hello, world" >> test/first.txt
Посмотреть содержимое файла с помощью команды cat test/first.txt:
user@desktop ~ $ cat test/first.txt Hello, world user@desktop ~ $
Посмотреть расширенную информацию о каталоге, используя
ключ -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/
Добавить псевдоним командной оболочки, чтобы сократить размер команды, с помощью команды 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/
Посмотреть глубже на директорию 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/
Первый столбец – номера индексных узлов файловой системы. Третий столбец – число жёстких ссылок файла.
Перейти в каталог test
с помощью команды cd test
user@desktop ~ $ cd test
Скопировать файл с помощью команды 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/
Новый файл имеет свой собственный индексный узел.
Переименовать файл с помощью команды 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/
Отметим, что изменилось только имя файла, все остальные атрибуты остались прежними.
Создать жёсткую ссылку командой 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.
Создать символическую ссылку командой 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
.
Сравним содержимое файлов при обращении к ним по имени:
user@desktop test $ cat orig.txt Hello, world user@desktop test $ cat copy2.txt Hello, world user@desktop test $ cat orig.lnk Hello, world
К одним и тем же данным можно обратиться через жесткую или символическую ссылку.
В этом сценарии изучается команда поиска файлов и директорий.
Начальные условия: Командная строка, директория test после прошлого сценария.
Перейти в каталог test
с помощью команды cd test:
user@desktop ~ $ cd test
Вывести список всех файлов и директорий в текущей директории, включая содержимое поддиректорий с помощью команды find:
user@desktop ~ $ find . ./orig.lnk ./orig.txt ./subtest ./copy1.txt ./copy2.txt
Найти все файлы и дериктории в текущей директории и ее поддиректориях, которые начиняются на «o» с помощью команды find -name "o*":
user@desktop ~ $ find -name "o*" ./orig.lnk ./orig.txt
Найти все файлы и дериктории в директории /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
Найти все обычные файлы в директории /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
Найти все обычные файлы в директории /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
Исключить вывод сообщений об ошибках (например, «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
Создать директорию logs
с помощью команды
mkdir test/logs:
user@desktop ~ $ mkdir test/logs
Скопировать найденные файлы в локальную директорию с помощью параметра
-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
Были скопированы все файлы, права на чтение которых у нас есть.
В этом сценарии изучается команда архивирования файлов и директорий. Командная строка, директория test после прошлого сценария.
Начальные условия:
Перейти в домашнюю директорию с помощью команды cd:
user@desktop test $ cd user@desktop ~ $
Создать архив с именем 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
Создать новую директорию для содержимого архива командой mkdir test2:
user@desktop ~ $ mkdir test2
Перейти в новую директорию с помощью команды cd test2:
user@desktop ~ $ cd test2
Развернуть содержимое архива в текущую директорию с помощью команды tar -xzf ../test.tar.gz:
user@desktop test2 $ tar -xzf ../test.tar.gz
Убедиться, что содержимое распакованного архива совпадает с оригинальной директорией. Ввести команду 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/
В этом сценарии изучаются команды для создания и модифицирования текстовых файлов. Командная строка.
Начальные условия:
Ввести команду echo "One line":
user@desktop test $ echo "One line" One line
Данная команда принимает строку в виде аргумента и выводит её на стандартный вывод.
Ввести ту же команду, но перенаправить вывод в
файл second.txt
с помощью «>». Ввести
команду echo "One line" > second.txt:
user@desktop test $ echo "One line" > second.txt
Добавить в конец файла second.txt
строку «A
line» с помощью другого перенаправления echo "A line" >>
second.txt:
user@desktop test $ echo "A line" >> second.txt
Вывести содержимое файла с помощью команды cat second.txt:
user@desktop test $ cat second.txt One line A line
С помощью команды 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 $
Убедиться, что содержимое файла совпадает с введённым текстом, включая все переводы строки. Для этого ввести команду 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!
Основным назначением команды cat является объединение файлов, имена которых передаются как аргументы командной строки. Объединить файлы с помощью команды cat orig.txt second.txt multiline.txt > big.txt:
user@desktop test $ cat orig.txt second.txt multiline.txt > big.txt
Убедиться, что новый файл содержит строки из перечисленных файлов с помощью команды 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!
В данном сценарии изучается, как выделять информацию, разбитую на части с помощью специального символа-разделителя (например, прообела или символа :), из файлов и создавать новые структурированные файлы.
Начальные условия: Командная строка.
Посмотреть содержимое файла /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 ...
Каждая строка хранит запись об отдельном пользователе. Запись состоит из полей, разделённых символом «:».
Выделить первый столбец в каждой записи, установив разделитель в «:», с потощью команды cat /etc/passwd | cut -f1 -d::
user@desktop test $ cat /etc/passwd | cut -f1 -d: root bin daemon adm lp sync shutdown ...
Отсортировать список пользователей по алфавиту с помощью команды cat /etc/passwd | cut -f1 -d: | sort:
user@desktop test $ cat /etc/passwd | cut -f1 -d: | sort adm alias apache at bin cron cyrus ...
Выделить седьмой столбец в каждой записи, соответствующий командной оболочке пользователя, с помощью команды 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 ...
Список содержит много повторяющихся строк.
Удалить повторяющиеся строки командой 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 ...
Некоторые повторяющиеся строки остались, так как сравниваются только последовательные строки.
Добиться полной уникальности, предварительно отсортировав строки с помощью команды 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
Выделить первый и седьмой столбец файла /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
Объединить результаты с помощью команды 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 ...
В данном сценарии изучаются команды, которые позволяют провести первичный анализ файла: с чего он начинается, как заканчивается и каков его размер.
Начальные условия: Командная строка.
Получить число строк в файле /etc/passwd
с помощью команды wc -l /etc/passwd :
user@desktop test $ wc -l /etc/passwd 44 /etc/passwd
Или другим способом: посчитав число слов в созданном ранее
файле users
с помощью команды cat users | wc -w:
user@desktop test $ cat users | wc -w 44
Посмотеть первые несколько строк длинного файла с помощью команды 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
Аналогично, посмотеть последние несколько строк с помощью команды 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
Это бывает полезно при просмотре системных журналов – в них самые последние события содержатся в конце файлов.
В данном сценарии рассматривается практическое использование регулярных выражений для поиска по текстовым файлам.
Начальные условия: Командная строка. Директория test/log с найденными системными журналами.
Среди найденных системных журналов посмотреть файл журнала загрузки
графичской системы XFree86.0.log
с помощью команды
less test/log/XFree86.0.log:
user@desktop ~ $ less test/log/XFree86.0.log
Выйти из просмоторщика можно нажатием клавиши q.
Найти все предупреждения в журнале: строка, начинающаяся с «(WW)». Для этого ввести команду grep "^(WW)" test/log/XFree86.0.log:
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. ...
Получить все строки, содержащие следующий шаблон: последовательность из 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 по умолчанию использует вывод имени файла перед найденной стокой.
Избавиться от имени файла в начале строки с помощью ключа
-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> ...
Для вывода только найденной подстроки используется
ключ -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 ...
Получить все файлы директории /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 ...
Для каждого из найденных файлов произвести поиск подстроки «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 ...
Для большего удобства добавить вывод имени файла
(ключ -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 для нахождения информации в файлах.