Команда tee копирует содержимое стандартного потока ввода в поток выво- да и в файлы, заданные в качестве аргументов без каких-либо изменений. Этим можно воспользоваться для создания множества одинаковых копий файла. При этом вовсе не обязательно, чтобы файл был текстовым. В приме- ре П2.1 показано, как создать несколько копий бинарного файла.
В примере П2.1 команда tee получила четыре аргумента: ls1, ls2, ls3 и ls4. В эти файлы скопировано бинарное содержимое файла /bin/ls, которое по- ступило в стандартный поток ввода команды tee. Стандартный поток вывода этой команды был перенаправлен в файл устройства /dev/null для исключе- ния вывода бинарного содержимого на экран. Получившиеся бинарные фай- лы имеют одинаковое содержание и являются точными копиями файла
/bin/ls, что подтверждается проверкой дайджеста SHA256. Для проверки ра- ботоспособности файл ls1 сделан исполняемым. Его работа проверена по- следней командой примера.
Нумерация строк с помощью команды cat
Команда cat помимо того, что может объединять содержимое текстовых или бинарных файлов, выводя их в стандартный поток вывода, может еще нуме- ровать строки текстовых файлов. Для этого предназначены опции –b — ну- меровать непустые строки и –n — нумеровать строки подряд (пример П2.2).
Пример П2.2. Команда cat
$ cat -b /etc/issue
1 Welcome to openSUSE 11.2 "Emerald" - Kernel \r (\l).
В примере команда cat вывела содержимое одного и того же файла, содер- жащего пустые строки. При использовании опции –b пустые строки не были пронумерованы.
Пример П2.3 показывает, как можно получить нумерованный список файлов.
Пример П2.3. Нумерованный список файлов
$ ls *.gz | cat -n
1 fsck.txt.gz
2 ls.txt.gz
3 mkfs.txt.gz
4 mount.txt.gz
5 paste.txt.gz
6 ps.txt.gz
7 sfdisk.txt.gz
8 users.txt.gz
В примере П2.3 получен нумерованный список файлов с суффиксом .gz.
Нумерация строк с помощью команды nl
Команда nl обладает более широкими возможностями нумерации строк. На- пример, имеется возможность пронумеровать лишь строки, удовлетворяю- щие регулярному выражению. Пример П2.4 показывает, как можно пронуме- ровать только те строки, у которых перед первой точкой от начала строки стоит лишь два символа.
Пример П2.4. Нумерация строк, удовлетворяющих регулярному выражению
$ ls *.gz | nl -bp'^..\.' fsck.txt.gz
1 ls.txt.gz mkfs.txt.gz mount.txt.gz paste.txt.gz
2 ps.txt.gz sfdisk.txt.gz users.txt.gz
Опция –b команды nl устанавливает режим нумерации строк. Стиль p нуме- рации обозначает использование регулярного выражения.
Команда csplit
Команда csplit делит на части текстовые файлы, основываясь на поиске строк, удовлетворяющих заданному регулярному выражению. По умолчанию
файл делится на две части: в первой части — все строки до вхождения стро- ки, удовлетворяющей регулярному выражению, и во второй части — все ос- тальные строки, начиная с той, которая удовлетворила искомому регулярно- му выражению. Имеется, однако, возможность продолжить поиск либо заданное количество раз, либо повторить его столько раз, сколько раз встре- чается строка, удовлетворяющая регулярному выражению (пример П2.5).
Пример П2.5. Деление текстового файла на части
$ cat sfdisk.txt
# sfdisk -l
Disk /dev/sda: 19457 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device
Boot Start
End #cyls
#blocks
Id System
/dev/sda1
0+
1073- 1074-
27 Unknown
end: (c,h,s) expected (1023,254,63) found (1023,239,63)
/dev/sda2
1073+
8854-
7782-
62501953+ 7 HPFS/NTFS
start:
(c,h,s)
expected
(1023,254,63) found (1023,239,63)
/dev/sda3
* 8855
85160565 5 Extended
/dev/sda4
-
0 0 Empty
/dev/sda5 ris
19083+
374-
3004123+ 82 Linux swap / Sola-
/dev/sda6
8855+
3656-
29366757 83 Linux
/dev/sda7
12511+
6572-
52789558+ 83 Linux
$ csplit sfdisk.txt /sda[0-9]/ {*} 209
$ ls xx??
xx00 xx01 xx02 xx03 xx04 xx05 xx06 xx07
$ cat xx06
/dev/sda6 8855+ 12510 3656- 29366757 83 Linux
В примере П2.5 выведено содержимое текстового файла sfdisk.txt, содержа- щего пример работы команды sfdisk –l. Этот файл был разделен на части с помощью команды csplit. Она разделила файл на столько частей, сколько встретилась искомая строка, удовлетворяющая регулярному выражению sda[0-9]. В результате образовались файлы xx00, ..., xx07, содержимое пред- последнего файла показано.
Команда sed
Потоковый редактор sed позволяет выполнять довольно сложное неинтерак- тивное редактирование текста. В документации на sed приведено множество полезных примеров применения sed (см. info sed). В примере П2.6 показа- но, как с помощью sed инвертировать порядок следования строк файла.
Пример П2.6. Инвертирование порядка строк файла с помощью команды sed
Приведенная в примере П2.8 команда сделает копии файлов с суффиксом .txt
так, что имена копий до суффикса сохранятся, а суффикс будет заменен на
.html. Например, файл index.txt будет скопирован в файл index.html.
Пример П2.8. Команда awk
$ ls *.txt | awk –F. '{print "cp",$0,$1".html"}' | bash
$ ls
index.html index.txt
Команда awk имеет встроенную функцию printf, позволяющую осуществ- лять форматированный вывод аналогично одноименной функции стандарт- ной библиотеки языка C (пример П2.9).
Команда expand заменяет символы табуляции пробелами (пример П2.10).
Пример П2.10. Команда expand
$ echo -e 'A\tB' A B
$ echo -e 'A\tB' | od -ta 0000000 A ht B nl 0000004
$ echo -e 'A\tB' | expand | od -ta
0000000 A sp sp sp sp sp sp sp B nl 0000012
Команда unexpand делает обратную замену. По умолчанию табуляцией заме- няются лишь лидирующие пробелы в строке. Опция –a позволяет заменять все пробелы (пример П2.11).
Пример П2.11. Команда unexpand
$ echo -e 'A\tB' | expand | unexpand -a | od -ta 0000000 A ht B nl
Команда pr
Команда pr предназначена для подготовки текста к печати. В приме- ре П2.12 показано, как с ее помощью можно вывести список файлов в три столбца.
Пример П2.12. Команда expand
$ ls | pr -3ft
alsa.txt
ls.txt.gz
sfdisk.txt
cat.txt
lsusb.txt
tee.txt
coockie.txt
mkfs.txt.gz
udev.txt
cooo.txt
modalias.txt
users.txt.gz
csplit.txt
modinfo.txt
who.txt
dmesg.txt
mon.txt
xorg.txt
expand.txt
mount.txt.gz
xx00
fsck.txt.gz
nl.txt
xx01
grub.txt
paste.txt.gz
xx02
last.txt
printf.txt
xx03
ldd.txt
pstree.txt
xx04
libmodules.txt
ps.txt.gz
xx05
lsmod.txt
rev.txt
xx06
lspci.txt
rpcinfo.txt
xx07
lspcmcia.txt
rpm.txt
zypper.txt
lsscsi.txt
Команды sort и uniq
Команда uniq позволяет отфильтровывать повторяющиеся строки во входном потоке. Входной поток должен быть заранее отсортирован. В примере П2.13 показано, как в текстовый файл, содержащий в себе вывод команды ps –ef, через некоторое время добавлен вывод этой же команды. Задача заключается в том, что надо вывести список процессов, изменившихся за это время.
Пример П2.13. Команды sort и uniq
$ ps -ef > ps.txt
$ ps -ef >> ps.txt
$ sort ps.txt | uniq -u
user1 21150 6054 4 00:17 pts/0 00:00:00 ps -ef
user1 21162 6054 0 00:17 pts/0 00:00:00 ps -ef
Команда wc
Команда wc позволяет подсчитать количество строк, слов и символов в потоке текста. Особенностью GNU-версии команды wc является наличие опции –L, позволяющей получить максимальную длину строки среди всех обработан- ных строк (пример П2.14).
Пример П2.14. Команда wc
$ ls | tr -L 14
Команда tr
Команда tr позволяет заменять или удалять символы в потоке. Приведенная в примере П2.15 команда позволяет подсчитать количество пробелов в файле.
Пример П2.15. Команда tr
$ tr –dc ' ' < /etc/motd | wc –c 4
Команда grep
Команда grep позволяет отфильтровывать строки, удовлетворяющие регу- лярному выражению с базовым синтаксисом (Basic syntax). А egrep исполь- зует расширенный синтаксис (Extended Regexp). В примере П2.16 показана команда для получения из журнала /var/log/messages только тех сообщений, которые записывались в журнал с 8 до 10 утра.