Искусство программирования на языке сценариев командной оболочки
Шрифт:
# Проще говоря, команда sed означает:
# "В первой строке удалить любые символы, вплоть до последнего встреченного пробела,
# и затем вывести остаток."
# Сделать это можно более простым способом:
# sed -e 's/.* //;q'
# Где, заданы два <диапазона><действия> (можно записать и по другому
# sed -e 's/.* //' -e q):
#
# ничего (для совпадающих строк) s/.* //
# ничего (для совпадающих строк) q (quit)
# Здесь sed считывает только первую строку.
# Выполняет оба действия, и выводит строку перед завершением
# (действие "q"), поскольку ключ "-n" опущен.
# =================================================================== #
# Простая альтернатива:
# head -c4 /dev/urandom| od -An -tu4
exit 0
См. также Пример 12-30.
tail
Выводит последние строки из файла на stdout (по-умолчанию -- 10 строк). Обычно используется для мониторинга системных журналов. Ключ – f, позволяет вести непрерывное наблюдение за добавляемыми строками в файл.
Пример 12-11. Мониторинг системного журнала с помощью tail
#!/bin/bash
filename=sys.log
cat /dev/null > $filename; echo "Создание / очистка временного файла."
# Если файл отсутствует, то он создается,
#+ и очищается, если существует.
# : > filename и > filename дают тот же эффект.
tail /var/log/messages > $filename
# Файл /var/log/messages должен быть доступен для чтения.
echo "В файл $filename записаны последние строки из /var/log/messages."
exit 0
См. также Пример 12-4, Пример 12-30 и Пример 29-6.
grep
Многоцелевая поисковая утилита, использующая регулярные выражения. Изначально это была команда в древнем строчном редакторе ed, g/re/p, что означает -- global - regular expression - print.
grep pattern [file...]
Поиск участков текста в файле(ах), соответствующих шаблону pattern, где pattern может быть как обычной строкой, так и регулярным выражением.
bash$ grep '[rst]ystem.$' osinfo.txt
The GPL governs the distribution of the Linux operating system.
Если
файл(ы) для поиска не задан, то команда grep работает как фильтр для устройства stdout, например в конвейере.bash$ ps ax | grep clock
765 tty1 S 0:00 xclock
901 pts/1 S 0:00 grep clock
– i– - выполняется поиск без учета регистра символов.
– w– - поиск совпадений целого слова.
– l– - вывод только имен файлов, в которых найдены участки, совпадающие с заданным образцом/шаблоном, без вывода совпадающих строк.
– r– - (рекурсивный поиск) поиск выполняется в текущем каталоге и всех вложенных подкаталогах.
The – n option lists the matching lines, together with line numbers.
bash$ grep -n Linux osinfo.txt
2:This is a file containing information about Linux.
6:The GPL governs the distribution of the Linux operating system.
– v (или – -invert-match) -- выводит только строки, не содержащие совпадений.
grep pattern1 *.txt | grep -v pattern2
# Выводятся строки из "*.txt", совпадающие с "pattern1",
# но ***не*** совпадающие с "pattern2".
– c (– -count) -- выводит количество совпадений без вывода самих совпадений.
grep -c txt *.sgml # (количество совпадений с "txt" в "*.sgml" файлах)
# grep -cz .
# ^ точка
# означает подсчет (-c) непустых ("." -- содержащих хотя бы один символ) элементов,
# разделенных нулевыми байтами (-z)
#
printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -cz . # 4
printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -cz '$' # 5
printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -cz '^' # 5
#
printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -c '$' # 9
# По-умолчанию, в качестве разделителя, принимается символ перевода строки (\n).
# Обратите внимание: ключ -z характерен для GNU-версии "grep".
# Спасибо S.C.
Если grep вызывается для поиска по группе файлов, то вывод будет содержать указание на имена файлов, в которых найдены совпадения.