1.3. Инструменты командной строки
Команда grep (globally search for a regular expression and print matching lines) осуществляет поиск по образцу, определяемому регулярным выражением. Команда sed (stream editor) является строчным редактором, но главное ее использование состоит в замене по шаблону, как и в случае grep, заданному регулярным выражением.
В табл. 1 показаны примеры некоторых базовых элементов регулярного выражения.
| Символ | Действие |
|---|---|
| Буквы, числа, некоторые знаки | Обозначают сами себя |
. |
Любой символ |
[множество символов] |
Любой символ из множества |
[^множество символов] |
Любой символ не из множества |
^ |
Начало строки |
$ |
Конец строки |
^ |
Начало строки |
выражение* |
Повторение выражения 0 или более раз |
выражение выражение |
Последовательность из выражений |
Веб-инструмент regex101 [6] может помочь в поэлементном разборе сложных регулярных выражений.
С использованием grep и sed можно создать достаточно сложные схемы обработки данных. В частности, следующий код осуществляет проверку правописания для файла README.md на основе словаря из файла unix-words:
cat README.md | tr A-Z a-z | tr -cs A-Za-z '\n' | sort | uniq | grep -vx -f unix-words >out ; cat out | wc -l | sed 's/$/ mispelled words!/'
Еще более изощренной, чем grep и sed, является команда awk. AWK (по именам авторов – Aho, Weinberger, Kernighan) представляет собой язык программирования для обработки текстовых данных.
Ниже показан пример вывода колонки №5 из данных, предоставленных вызовом ls -l:
localhost:~$ ls -l
total 36
-rw-r--r-- 1 root root 114 Jul 5 2020 bench.py
-rwxr-xr-x 1 root root 51 Nov 4 18:56 fact.sh
-rwxr-xr-x 1 root root 76 Nov 4 19:45 fact2.sh
drwxr-xr-x 2 root root 37 Nov 4 18:01 foo
-rw-r--r-- 1 root root 76 Jul 3 2020 hello.c
-rw-r--r-- 1 root root 22 Jun 26 2020 hello.js
-rwxr-xr-x 1 root root 6 Nov 4 18:44 lsl
-rw-r--r-- 1 root root 151 Jul 5 2020 readme.txt
-rwxr-xr-x 1 root root 36 Nov 4 18:50 test.sh
localhost:~$ ls -l | awk '{ print $5 }'
114
51
76
37
76
22
6
151
36
Средствами awk легко подсчитать общий размер файлов:
localhost:~$ ls -l | awk '{ s += $5 } END { print s }'
569
В заключение рассмотрим пример вывода на экран самой свежей новости с ресурса Hacker News:
#!/bin/sh
N=$(curl -s https://hacker-news.firebaseio.com/v0/topstories.json | jq '.[0]')
curl -s "https://hacker-news.firebaseio.com/v0/item/$N.json" | jq '.["title"]' | cowsay
Вот как выглядит вывод этой программы:
localhost:~$ ./hn.sh
________________________________________
/ "Finishing my first game while working \
\ full-time" /
----------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
На тему анализа данных в командной строке существует целая книга [7].