Цель занятия: знакомство с командной строкой UNIX, командами по работе с файловой системой и командами обработки текстовых файлов.
Изучаемые команды: «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы», «Вопросы»
В этом сценарии будет осуществлено знакомство с командами UNIX, изучение файловой системы и базовых каталогов, создание рабочей среды в домашнем каталоге пользователя для выполнения всех последующих команд.
Начальные условия: Командная строка после входа в систему.
Получить имя текущего каталога с помощью команды pwd:
[user@localhost ~]$ pwd /home/user/
Перейти в корневой каталог с помощью команды cd /:
[user@localhost ~]$ cd / [user@localhost /]$ pwd /
Отметить, как изменилась строка приглашения.
Посмотреть содержимое корневого каталога с помощью команды ls:
[user@localhost /]$ ls bin dev home lib mnt proc sbin sys usr boot etc image media opt root srv tmp var
Сравнить с использованием «расширенного» вывода команды ls -F:
[user@localhost /]$ ls -F bin/ dev/ home/ lib/ mnt/ proc/ sbin/ sys/ usr/ boot/ etc/ image/ media/ opt/ root/ srv/ tmp/ var/
Каталоги отмечаются синим цветом и знаком /
после имени.
Посмотреть содержимое домашнего каталога с помощью команды ls ~:
[user@localhost /]$ ls ~ Documents tmp
Домашний каталог содержит набор стандартных каталогов.
Вернуться в домашний каталог с помощью cd без параметров:
[user@localhost /]$ cd [user@localhost ~]$
Создать каталог test
с помощью
команды mkdir test:
[user@localhost ~]$ mkdir test
Посмотреть обновлённое содержимое домашнего каталога ls:
[user@localhost ~]$ ls Documents test tmp
Создать подкаталог subtest
в
каталоге test
командой mkdir test/subtest:
[user@localhost ~]$ mkdir test/subtest
Посмотреть содержимое домашнего каталога и его подкаталогов с помощью ключа
рекурсивного просмотра -R
в команде
ls -R:
[user@localhost ~]$ ls -R .: Documents test tmp ./Documents: ./test: subtest ./test/subtest: ./tmp:
В этом сценарии рассматриваются типы файлов в UNIX: простые файлы, каталоги, ссылки. Изучаются команды создания и копирования файлов. Показывается разница между жесткими и символьными ссылками, между копированием и переносом файла.
Начальные условия: Командная строка. Каталог test после предыдущего сценария.
Cоздать пустой файл с помощью команды touch first.txt:
[user@localhost test]$ touch first.txt [user@localhost test]$ ls first.txt subtest
Добавить в файл строку текста с помощью команды echo и перенаправления вывода: echo "Hello, world" >> first.txt:
[user@localhost test]$ echo "Hello, world" >> first.txt
Посмотреть содержимое файла с помощью команды cat first.txt:
[user@localhost test]$ cat first.txt Hello, world [user@localhost test]$
Посмотреть расширенную информацию о каталоге, используя
ключ -l
команды ls:
[user@localhost test]$ ls -l total 4 -rw-r--r-- 1 user user 13 Feb 14 20:12 first.txt drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest
Добавить псевдоним командной оболочки, чтобы сократить размер команды, с помощью команды alias ls='ls -F -l':
[user@localhost test]$ alias ls='ls -F -l' [user@localhost test]$ ls test total 4 -rw-r--r-- 1 user user 13 Feb 14 20:12 first.txt drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest
Получить более подробную информацию о каталоге test
, используя ключи
-a
, -l
и -i
команды ls:
[user@localhost test]$ ls -a -l -i total 4 1014 drwxr-xr-x 3 user user 100 Feb 14 20:07 ./ 941 drwx------ 8 user user 340 Feb 14 19:28 ../ 1081 -rw-r--r-- 1 user user 13 Feb 14 20:12 first.txt 1015 drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
Первый столбец — номера индексных узлов файловой системы. Третий столбец — число жёстких ссылок на файл.
Скопировать файл с помощью команды cp first.txt copy1.txt:
[user@localhost test]$ cp first.txt copy1.txt [user@localhost test]$ ls -a -l -i total 8 1014 drwxr-xr-x 3 user user 120 Feb 14 20:33 ./ 941 drwx------ 8 user user 340 Feb 14 19:28 ../ 1082 -rw-r--r-- 1 user user 13 Feb 14 20:33 copy1.txt 1081 -rw-r--r-- 1 user user 13 Feb 14 20:12 first.txt 1015 drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
Новый файл имеет свой собственный индексный узел.
Переименовать файл с помощью команды mv first.txt orig.txt. mv first.txt orig.txt:
[user@localhost test]$ mv first.txt orig.txt [user@localhost test]$ ls -a -l -i total 8 1014 drwxr-xr-x 3 user user 120 Feb 14 20:37 ./ 941 drwx------ 8 user user 340 Feb 14 19:28 ../ 1082 -rw-r--r-- 1 user user 13 Feb 14 20:33 copy1.txt 1081 -rw-r--r-- 1 user user 13 Feb 14 20:12 orig.txt 1015 drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
Отметим, что изменилось только имя файла, все остальные атрибуты остались прежними.
Создать жёсткую ссылку командой ln orig.txt copy2.txt:
[user@localhost test]$ ln orig.txt copy2.txt [user@localhost test]$ ls -a -i total 12 1014 drwxr-xr-x 3 user user 140 Feb 14 20:41 ./ 941 drwx------ 8 user user 340 Feb 14 19:28 ../ 1082 -rw-r--r-- 1 user user 13 Feb 14 20:33 copy1.txt 1081 -rw-r--r-- 2 user user 13 Feb 14 20:12 copy2.txt 1081 -rw-r--r-- 2 user user 13 Feb 14 20:12 orig.txt 1015 drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
Добавилась ещё одна ссылка на тот же файл, число ссылок увеличилось
на 1
.
Создать символьную ссылку командой ln -s orig.txt orig.lnk:
[user@localhost test]$ ln -s orig.txt orig.lnk [user@localhost test]$ ls -a -i total 12 1014 drwxr-xr-x 3 user user 160 Feb 14 20:45 ./ 941 drwx------ 8 user user 340 Feb 14 19:28 ../ 1082 -rw-r--r-- 1 user user 13 Feb 14 20:33 copy1.txt 1081 -rw-r--r-- 2 user user 13 Feb 14 20:12 copy2.txt 1083 lrwxrwxrwx 1 user user 8 Feb 14 20:45 orig.lnk -> orig.txt 1081 -rw-r--r-- 2 user user 13 Feb 14 20:12 orig.txt 1015 drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
Новый файл имеет новый индексный узел и размер, равный имени
файла orig.txt
.
Сравним содержимое файлов при обращении к ним по имени:
[user@localhost test]$ cat orig.txt Hello, world. [user@localhost test]$ cat copy2.txt Hello, world. [user@localhost test]$ cat orig.lnk Hello, world.
К одним и тем же данным можно обратиться через жесткую или символьную ссылку.
В этом сценарии изучается команда поиска файлов и каталогов.
Начальные условия: Командная строка, каталог test после прошлого сценария.
Вывести список всех файлов и каталогов в текущем каталоге, включая содержимое подкаталогов, с помощью команды find:
[user@localhost test]$ find . ./orig.lnk ./copy2.txt ./orig.txt ./copy1.txt ./subtest
Найти в текущем каталоге и его подкаталогах все файля и каталоги,
которые начиняются на o
с помощью команды find -name "o*":
[user@localhost test]$ find -name "o*" ./orig.lnk ./orig.txt
Найти все файлы и каталоги в каталоге /etc
и его подкаталогах,
которые начиняются на o
с помощью команды find /etc
-name "o*":
[user@localhost test]$ find /etc -name "o*" find: /etc/tcb: Permission denied find: /etc/default: Permission denied find: /etc/buildreqs: Permission denied ...
Список найденных файлов может быть слишком большим, и для его просмотра можно воспользоваться «прокруткой» терминала с помощью клавиш Shift+PgUp и Shift+PgDn.
Вы увидели множество сообщений об ошибках доступа («Permission denied»), которые можно подавить с помощью перенаправления ошибок следующим образом: find /etc -name "o*" 2>/dev/null
[user@localhost test]$ find /etc -name "o*" 2>/dev/null /etc/modprobe.d/options /etc/modutils.d/oss /etc/net/ifaces/default/fw/options /etc/net/ifaces/default/options ... /etc/pam.d/other /etc/rc.d/init.d/outformat
Найти все каталоги в /etc
, которые
начинаются на o
с помощью команды find /etc -name "o*" -a -type d 2>/dev/null:
[user@localhost test]$ find /etc -name "o*" -a -type d 2>/dev/null /etc/net/options.d /etc/openssh /etc/openssl /etc/opt
Найти все обычные файлы в каталоге /var
и его подкаталогах,
заканчивающиеся на .log
:
[user@localhost test]$ find /var -name "*log" -a -type f 2>/dev/null /var/log/Xorg.0.log /var/log/xdm-error.log /var/log/faillog /var/log/lastlog
Создать каталог logs
с помощью команды
mkdir logs:
[user@localhost test]$ mkdir logs
Скопировать найденные файлы в локальный каталог с помощью параметра
-exec
команды find. Для этого выполнить:
find /var -name "*log" -a -type f -exec cp {} test/logs/ 2>/dev/null:
[user@localhost test]$ find /var -name "*log" -a -type f -exec cp {} logs/ 2>/dev/null \; [user@localhost test]$ ls logs total 48 -rw-r--r-- 1 user user 23521 Feb 14 21:45 Xorg.0.log -rw-r--r-- 1 user user 12048 Feb 14 21:45 faillog -rw-r--r-- 1 user user 146584 Feb 14 21:45 lastlog -rw-r--r-- 1 user user 762 Feb 14 21:45 xdm-error.log
Были скопированы все файлы, права на чтение которых у нас есть.
В этом сценарии изучается команда архивирования файлов и каталогов. Командная строка, каталог test после прошлого сценария.
Начальные условия:
Перейти в домашний каталог с помощью команды cd:
[user@localhost test]$ cd [user@localhost ~]$
Создать архив с именем test.tar.gz
с применением
сжатия, содержащий каталог test
, с помощью команды
tar -czf test.tar.gz test:
[user@localhost ~]$ tar -czf test.tar.gz test [user@localhost ~]$ ls Documents test test.tar.gz tmp
Создать новый каталог для содержимого архива командой mkdir test2:
[user@localhost ~]$ mkdir test2
Перейти в новый каталог с помощью команды cd test2:
[user@localhost ~]$ cd test2
Развернуть содержимое архива в текущий каталог с помощью команды tar -xzf ../test.tar.gz:
[user@localhost test2]$ tar -xzf ../test.tar.gz
Убедиться, что содержимое распакованного архива совпадает с оригинальным каталогом. Выполнить команду ls -l -a -F:
[user@localhost test2]$ ls -l -a -F total 0 drwxr-xr-x 2 user user 140 Feb 14 21:45 test/ [user@localhost test2]$ ls -l -a -F test total 12 drwxr-xr-x 3 user user 160 Feb 14 20:45 ./ drwx------ 8 user user 340 Feb 14 19:28 ../ -rw-r--r-- 1 user user 13 Feb 14 20:33 copy1.txt -rw-r--r-- 2 user user 13 Feb 14 20:12 copy2.txt drwxr-xr-x 2 user user 140 Feb 14 21:45 logs/ lrwxrwxrwx 1 user user 8 Feb 14 20:45 orig.lnk -> orig.txt -rw-r--r-- 2 user user 13 Feb 14 20:12 orig.txt drwxr-xr-x 2 user user 60 Feb 14 19:42 subtest/
В этом сценарии изучаются команды для создания и модифицирования текстовых файлов. Командная строка.
Начальные условия:
Перейти в новый каталог с помощью команды cd ~/test перейдите
в каталог test
:
[user@localhost test2]$ cd ~/test
Ввести команду echo "One line":
[user@localhost test]$ echo "One line" One line
Данная команда принимает строку в виде параметра и выводит её на стандартный вывод.
Ввести ту же команду, но перенаправить вывод в
файл second.txt
с
помощью >
. Команда echo "One line" > second.txt:
[user@localhost test]$ echo "One line" > second.txt
Добавить в конец файла second.txt
строку «A
line» с помощью другого перенаправления echo "A line" >>
second.txt:
[user@localhost test]$ echo "A line" >> second.txt
Вывести содержимое файла с помощью команды cat second.txt:
[user@localhost test]$ cat second.txt One line A line
С помощью команды cat можно создавать многострочные файлы —, если переопределить вывод программы в файл и вводить текст до нажатия Ctrl+D (конец ввода). Ввести команду cat > multiline.txt и набрать текст
[user@localhost test]$ cat > multiline.txt Simple text: blah-blah-blah 1 2 3 4 5 6 7 8 9 0 bye! (Ctrl+D) [user@localhost test]$
Убедиться, что содержимое файла совпадает с введённым текстом, включая все переводы строки. Для этого ввести команду cat multiline.txt
[user@localhost 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@localhost test]$ cat orig.txt second.txt multiline.txt > big.txt
Убедиться, что новый файл содержит строки из перечисленных файлов, с помощью команды cat big.txt:
[user@localhost 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@localhost test]$ cat /etc/passwd root:x:0:0:System Administrator:/root:/bin/bash bin:x:1:1:bin:/:/dev/null daemon:x:2:2:daemon:/:/dev/null adm:x:3:4:adm:/var/adm:/dev/null lp:x:4:7:lp:/var/spool/lpd:/dev/null mail:x:8:12:mail:/var/spool/mail:/dev/null ...
Каждая строка хранит запись об отдельном пользователе. Запись состоит
из полей, разделённых символом :
.
Выделить первый столбец в каждой записи, выбрав в качестве
разделителя :
, с помощью команды cat /etc/passwd | cut -f1 -d::
[user@localhost test]$ cat /etc/passwd | cut -f1 -d: root bin daemon adm lp mail news ...
Отсортировать список пользователей по алфавиту с помощью команды cat /etc/passwd | cut -f1 -d: | sort:
[user@localhost test]$ cat /etc/passwd | cut -f1 -d: | sort adm apache bin cacheman daemon exim ftp ...
Выделить в каждой записи седьмой столбец, соответствующий командной оболочке пользователя, с помощью команды cat /etc/passwd | cut -f7 -d:
[user@localhost test]$ cat /etc/passwd | cut -f7 -d: /bin/bash /dev/null /dev/null /dev/null /dev/null ...
Список содержит много повторяющихся строк.
Удалить повторяющиеся строки командой cat /etc/passwd | cut -f7 -d: | uniq:
[user@localhost test]$ cat /etc/passwd | cut -f7 -d: | uniq /bin/bash /dev/null /sbin/nologin /bin/bash
Некоторые повторяющиеся строки остались, так как сравниваются только последовательные строки.
Добиться полной уникальности, предварительно отсортировав строки с помощью команды sort. Ввести команду cat /etc/passwd | cut -f7 -d: | sort | uniq:
[user@localhost test]$ cat /etc/passwd | cut -f7 -d: | sort | uniq /bin/bash /dev/null /sbin/nologin
Выделить первый и седьмой столбцы файла /etc/passwd
в отдельные файлы. Для этого
ввести команды cat /etc/passwd | cut -f1 -d: > users и
cat /etc/passwd | cut -f7 -d: > shells:
[user@localhost test]$ cat /etc/passwd | cut -f1 -d: > users [user@localhost test]$ cat /etc/passwd | cut -f7 -d: > shells
Объединить результаты с помощью команды paste users shells:
[user@localhost test]$ paste users shells root /bin/bash bin /dev/null daemon /dev/null adm /dev/null lp /dev/null mail /dev/null ...
В данном сценарии изучаются команды, которые позволяют провести первичный анализ файла: с чего он начинается, как заканчивается и каков его размер.
Начальные условия: Командная строка.
Получить число строк в файле /etc/passwd
с помощью команды wc -l /etc/passwd:
[user@localhost test]$ wc -l /etc/passwd 33 /etc/passwd
Или другим способом: посчитав число слов в созданном ранее
файле users
с помощью команды cat users | wc -w:
[user@localhost test]$ cat users | wc -w 33
Посмотеть первые несколько строк длинного файла с помощью команды head logs/Xorg.0.log:
[user@localhost test]$ head logs/Xorg.0.log X Window System Version 7.2.0 Release Date: 21 February 2007 X Protocol Version 11, Revision 0, Release 7.2 Build Operating System: Linux 2.6.18-std-smp-alt4 i686 ALT Linux Current Operating System: Linux localhost 2.6.18-wks-alt1 #1 SMP Wed Dec 13 01:43:50 MSD 2006 i686 Build Date: 21 February 2007 Before reporting problems, check http://wiki.X.Org to make sure that you have the latest version. Module Loader present Markers: (--) probed, (**) from config file, (==) default setting,
Аналогично, посмотеть последние несколько строк с помощью команды tail logs/Xorg.0.log:
[user@localhost test]$ tail logs/Xorg.0.log (**) RADEON(0): Memory map updated. (**) RADEON(0): Programming CRTC1, offset: 0x00000000 (**) RADEON(0): GRPH_BUFFER_CNTL from 20097c7c to 20095c5c (II) RADEON(0): [RESUME] Attempting to re-init Radeon hardware. (II) RADEON(0): [agp] Mode 0x1f000201 [AGP 0x8086/0x3340; Card 0x1002/0x4c66] (**) RADEON(0): EngineRestore (32/32) (**) RADEON(0): EngineRestore (32/32) (**) RADEON(0): RADEONSaveScreen(2) (II) Configured Mouse: ps2EnableDataReporting: succeeded (**) RADEON(0): RADEONDisplayPowerManagementSet(0,0x0)
Это бывает полезно при просмотре системных журналов — в них записи о самых последних событиях содержатся в конце файлов.
В данном сценарии рассматривается практическое использование регулярных выражений для поиска по текстовым файлам.
Начальные условия: Командная строка. Каталог test/logs с найденными системными журналами.
Среди найденных системных журналов посмотреть файл журнала загрузки
графичской системы Xorg.0.log
с помощью команды
less test/logs/Xorg.0.log:
[user@localhost ~]$ less test/logs/Xorg.0.log
Выйти из просмоторщика можно нажатием клавиши q.
Найти все предупреждения в журнале: строка, начинающаяся с «(WW)». Для этого ввести команду grep "^(WW)" test/logs/Xorg.0.log:
[user@localhost ~]$ grep "^(WW)" test/log/Xorg.0.log (WW) RADEON(0): Failed to detect secondary monitor, MergedFB/Clone mode disabled (WW) RADEON(0): DRI init changed memory map, adjusting ... (WW) RADEON(0): MC_FB_LOCATION was: 0xe3ffe000 is: 0xe3ffe000 (WW) RADEON(0): MC_AGP_LOCATION was: 0xffffffc0 is: 0xd07fd000 ...
Получить все строки, содержащие следующий шаблон: последовательность из одной или более цифры или буквы, затем символ собаки, затем еще одна последовательность из одной или более цифры или буквы, или точки, затем символ точки, затем от двух до четырёх букв (имя домена первого уровня). При этом служебный вывод ошибок удаляется (перенаправляется в нулевое устройство). Для этого ввести команду grep "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:
[user@localhost ~]$ grep "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null /etc/protocols:cbt 7 CBT # CBT, Tony Ballardie <A.Ballardie@cs.ucl.ac.uk> /etc/sensors.conf:# Many thanks go to Peter T. Breuer <ptb@it.uc3m.es> for helping us figure /etc/sensors.conf:# Jonathan Yew <j.teh@iname.com> and Alex van Kaam <darkside@chello.nl> ...
При работе с несколькими файлами grep по умолчанию использует вывод имени файла перед найденной стокой.
Избавиться от имени файла в начале строки с помощью ключа
-h
. Ввести команду
grep -h "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/*
2>/dev/null:
[user@localhost ~]$ grep -h "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null cbt 7 CBT # CBT, Tony Ballardie <A.Ballardie@cs.ucl.ac.uk> # Many thanks go to Peter T. Breuer <ptb@it.uc3m.es> for helping us figure # Jonathan Yew <j.teh@iname.com> and Alex van Kaam <darkside@chello.nl> ...
Для вывода только найденной подстроки используется
ключ -o
. Ввести команду grep
-ho "[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:
[user@localhost ~]$ grep -ho "[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null allardie@cs.ucl.ac.uk ptb@it.uc3m.es teh@iname.com ...
Получить все файлы каталога /etc/
с помощью
команды find /etc -type f 2>/dev/null, игнорируя ошибки:
[user@localhost ~]$ find /etc -type f 2>/dev/null /etc/.pwd.lock /etc/gshadow /etc/gshadow- /etc/group /etc/group- /etc/passwd /etc/passwd- ...
Для каждого из найденных файлов произвести поиск подстроки «nameserver». Для этого ввести команду find /etc -type f -exec grep "nameserver" {} \; 2>/dev/null:
[user@localhost ~]$ find /etc -type f -exec grep "nameserver" {} \; 2>/dev/null nameserver 192.168.0.1 nameserver 42/tcp name # Host Name Server nameserver 42/udp name # Host Name Server # nameserver lines into /etc/resolv.conf or not.
Для большего удобства добавить вывод имени файла
(ключ -H
) и номера строки
(ключ -n
), на которой было найдено
совпадение, с помощью команды find /etc -type f -exec grep -Hn
"nameserver" {} \; 2>/dev/null:
[user@localhost ~]$ find /etc -type f -exec grep -Hn "nameserver" {} \; 2>/dev/null /etc/resolv.conf:1:nameserver 192.168.0.1 /etc/services:60:nameserver 42/tcp name # Host Name Server /etc/services:61:nameserver 42/udp name # Host Name Server /etc/sysconfig/network:13:# nameserver lines into /etc/resolv.conf or not.
Таким образом, команда grep может эффективно использоваться вместе с командой find для нахождения информации в файлах.