Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

1.3. Инструменты командной строки

Команда grep (globally search for a regular expression and print matching lines) осуществляет поиск по образцу, определяемому регулярным выражением. Команда sed (stream editor) является строчным редактором, но главное ее использование состоит в замене по шаблону, как и в случае grep, заданному регулярным выражением.

В табл. 1 показаны примеры некоторых базовых элементов регулярного выражения.

Таблица 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].