Заметки о работе с основными командами в Linux. Все эти команды так или иначе работают с вводом/выводом и каналами. Поиск и манипуляция с текстом.
Расширение фигурных скобок (brace expansion)
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ echo {10..1}
10 9 8 7 6 5 4 3 2 1
$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
$ echo {1..1000..100}
1 101 201 301 401 501 601 701 801 901
$ echo {A..Z}
A B C D E F G H I J K L M N O P Q R S T U V W XYZ
Регулярные выражения
Соответствие | Используемые выражения | Пример |
---|---|---|
Начало строки | ^ | ^a = строка, начинающаяся с a |
Конец строки | $ | !$ = строка, заканчивающаяся восклицательным знаком |
Любой одиночный символ | . | ... = любые три последовательных символа |
Ноль или более вхождений | E* | _* = ноль или более знаков подчеркивания |
Любой одиночный символ в наборе | [characters] | [aeiouAEIOU] = любая гласная |
Любой одиночный символ, не входящий в набор | [^characters] | [^aeiouAEIOU] = любая не гласная |
Любой символ в диапазоне между с1 и с2 | [c1-c2] | [0-9] = любая цифра |
Любой символ вне диапазона между c1 и c2 | [^c1-c2] | [^0-9] = любой нецифровой символ |
Команда grep
Ищет строки по заданому шаблону.
Строки которые содержать is:
$ grep is zen.txt | head -n5
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Также можно вывести строки, которые не соответствуют заданному шаблону, с опцией -v
:
$ grep -v is zen.txt | head -n5
Readability counts.
Special cases arent special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
grep
можно использовать для поиска определенного текста в некотором списке файлов:
$ grep is *.txt
Параметр -w
указывает команде grep
сопоставлять только слова целиком, а не их части.
Параметр -i
для игнорирования регистр букв.
Параметр -l
, чтобы вывести только имена файлов, содержащих совпадающие строки, но не сами строки:
$ grep -l is *
Найти совпадение всех строк, начинающихся с заглавной буквы:
$ grep '^[A-Z]' myfile
Найти совпадение со всеми непустыми строками (то есть совпадение с пустыми строками и их пропуск благодаря параметру -v
):
$ grep -v '^$' myfile
Найти все строки, содержащие либо cookie, либо cake:
$ grep 'cookie\|cake' myfile
Найти все строки длиной не менее пяти символов:
$ grep '.....' myfile
grep
молжет забыть о регулярных выражениях и искать буквально каждый символ во входных данных, используя параметр -F
(fixed)
$ grep -F w. frost
Параметр -f
(строчный символ, не путайте его с F), служащий для сопоставления с набором строк, а не с одной строкой.
$ grep -f /etc/shells
Команда wc
Команда wc
выводит количество строк, слов и символов в файле.
$ wc zen.txt
19 137 823 zen.txt
Учитываются пробелелы, табуляция и символы новой строки.
Опции -l
, -w
и -c
указывают wc
печатать только количество строк, слов и символов соответственно.
Команда ls
В отличие от большинства других команд Linux, ls
знает, выводит ли она данные на экран или перенаправляет в канал. Когда stdout — это экран, ls
упорядочивает вывод в несколько колонок для удобства чтения:
$ ls /
Applications Users cores home sbin var
Library Volumes dev opt tmp
System bin etc private usr
При перенаправлении stdout ls
создает одну колонку:
ls / | cat
Applications
Library
System
Users
Volumes
bin
cores
dev
etc
home
opt
private
sbin
tmp
usr
var
Команда head
Команда head
выводит первые строки файла. По умолчанию выводит 10 строк. С помощью параметра -n
можно указать другое кол-во.
head -n5 zen.txt
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Команда tail
Команда tail
печатает последние строки файла — по умолчанию 10 строк.
Опция -n
задает количество печатаемых строк, как и для команды head
.
Если поставить перед номером знак +, печать начнется со строки этого номера и продолжится до конца файла.
Команда cut
Команда cut
выводит одну или несколько колонок из файла.
Команда cut
поддерживает два способа определения, что считать колонкой. Первый — разделение по полям (-f
), когда входные данные состоят из строк (полей), каждая из которых разделена одним символом табуляции.
Вторая и третья колонка:
$ cut -f2,3 data.csv
Диапазон:
$ cut -f2-5 data.csv
Также можно определить колонку для команды cut по положению символа в строке с использованием параметра -c
.
Первые три символа:
$ cut -c1-3 zen.txt | head -n5
Bea
Exp
Sim
Com
Fla
Параметр -d
позволяет указать разделитель.
Например пробел:
$ cut -d ' ' -f1 zen.txt | head -n4
Beautiful
Explicit
Simple
Complex
Команда paste
Команда paste
объединяет строки текстов в столбцы, разделенные одним символом табуляции. Это сестра команды cut
, которая извлекает разделенные табуляцией столбцы из текста.
Измените разделитель на другой символ, например запятую, с помощью пара- метра -d
(delimiter).
Команда sort
Команда sort
сортирует строки файла в порядке возрастания (по умолчанию):
$ sort zen.txt | head -n5
Although never is often better than *right* now.
Although practicality beats purity.
Although that way may not be obvious at first unless youre Dutch.
Beautiful is better than ugly.
Complex is better than complicated.
или в порядке убывания (с параметром -r
):
$ sort -r zen.txt | head -n5
Unless explicitly silenced.
There should be one-- and preferably only one --obvious way to do it.
Special cases arent special enough to break the rules.
Sparse is better than dense.
Simple is better than complex.
Вывести все имена пользователей и отсортировать их:
$ cut -d: -f1 /etc/passwd | sort
sort
может сортировать строки в алфавитном порядке (по умолчанию) или в числовом порядке (с опцией -n
).
Максимальное значение в файле с числами:
... | sort -nr | head -n1
минимальное:
... | sort -n | head -n1
Команда uniq
Команда uniq
обнаруживает повторяющиеся соседние строки в файле. По умолчанию она удаляет повторы.
С помощью параметра -c
можно подсчитать количество повторяющихся строк.
Команда md5sum
Считает хэш файла используя MD5.
Команда date
Команда date
выводит текущую дату и/или время в различных форматах:
$ date
пятница, 1 августа 2014 г. 21:49:16 (MSK)
Формат год-месяц-день
$ date +%Y-%m-%d
2014-08-01
Формат часы:минуты:секунды
$ date +%H:%M:%S
21:49:16
Команда seq
Команда seq
печатает последовательность чисел из диапазона. Укажите два аргумента, нижнее и верхнее значения диапазона, и seq
напечатает весь диапазон.
Выводит все целые числа от 1 до 5 включительно
$ seq 1 5
1
2
3
4
5
Увеличение на 2
$ seq 1 2 10
1
3
5
7
9
Отрицательный шаг для создания уменьшающейся последовательности
$ seq 3 -1 0
3
2
1
0
По умолчанию значения разделяются символом новой строки, но вы можете изменить разделитель с помощью параметра -s
$ seq -s' ' 1 5
1 2 3 4 5
Параметр -w
приводит все значения к одинаковой ширине (в символах), добавляя ведущие нули по мере необходимости.
Команда find
Команда find
рекурсивно выводит список файлов в каталоге, спускаясь по подкаталогам и выводя полные пути.
$ find /dev
/dev
/dev/console
/dev/tty
/dev/null
/dev/zero
Ограничьте вывод только файлами или каталогами с опцией -type
:
$ find . -type f # Только файлы
$ find . -type d # Только каталоги
Ограничьте вывод именами, которые соответствуют шаблону имени файла с опцией -name
.
$ find /etc -type f -name "*.txt" -print # Файлы, заканчивающиеся на .txt
-iname
- нечувствителен к регистру.
Команда yes
Команда yes
выводит одну и ту же строку снова и снова, пока вы ее не остановите.
Команда tac
Команда tac
построчно переворачивает каждый текст. Ее имя — это написанное задом наперед название команды cat
.
tac
отлично подходит для обработки данных, которые уже находятся в определенном порядке, но не могут быть отсортированы с помощью команды sort -r
. Типичным случаем является преобразование файла журнала веб-сервера для обработки его строк от самых новых к самым старым.
Строки расположены в хронологическом порядке с отметками времени, но не в алфавитном или числовом порядке, поэтому команда sort -r
бесполезна.
Команда diff
Команда diff
сравнивает два файла построчно и выводит краткий отчет об их различиях.
Команда tr
Команда tr
переводит один набор символов в другой.
Преобразование двоеточий в символы новой строки:
$ echo $PATH | tr : "\n"
/home/smith/bin /usr/local/bin
/usr/bin
/bin
Выполняется преобразование текста в верхний или нижний регистр
$ tr a-z A-Z
$ tr A-Z a-z
Преобразование пробелов в символы новой строки:
$ tr " " "\n"
Удаление пробелов с помощью параметра -d
:
$ tr -d ' \t'
Команда rev
Команда rev
переворачивает символы задом наперед в каждой строке ввода.
$ echo Beautiful is better than ugly. | rev
.ylgu naht retteb si lufituaeB
Команды awk
и sed
awk
и sed
— это универсальные команды для обработки текста. Для них нужны отдельные гайды и практика. Ниже общая информация.
Команда awk
awk
преобразует строки текста из файлов (или из стандартного ввода) в любой другой текст, используя последовательность инструкций, которую называют awk-программой.
awk program input-files
Программа awk
включает одно или несколько действий, таких как вычисление значений или печать текста, которые запускаются, когда входная строка соответствует шаблону.
шаблон {действие}
При вводе awk-программы в командной строке заключайте ее в кавычки, чтобы оболочка не вычисляла специальные символы awk
. При необходимости используйте одинарные или двойные кавычки.
Действие без шаблона выполняется для каждой строки ввода.
$ awk '{print $2}' /etc/hosts
localhost
broadcasthost
localhost
awk
ссылается на любой столбец знаком доллара, за которым следует номер столбца, например $7
для седьмого столбца. Если номер столбца состоит из нескольких цифр, заключите число в круглые скобки, например $(25)
. Чтобы обратиться к последнему полю, используйте $NF
. Чтобы обратиться ко всей строке, используйте $0
.
awk
по умолчанию не печатает пробелы между значениями.
$ echo Beautiful is better than ugly. | awk '{print $1 $3}' # Без пробела
Beautifulbetter
$ echo Beautiful is better than ugly. | awk '{print $1, $3}' # С пробелом
Beautiful better
Если вы столкнулись с вводом, разделенным чем-то другим, кроме пробелов, awk
с параметром -F
может изменить разделитель полей на любое регулярное выражение:
$ echo 1-2-3-4-5-6 | awk -F'-' '{print $3}'
3
Выводит строки на экран, до тех пор пока их количество не достигнет 10:
$ awk 'FNR<=10' myfile
Команда sad
Команда sed
преобразует текст из файлов или из стандартного ввода, используя последовательность инструкций, которую называют sed-сценарием.
sed script input-files
Название команды sed
является сокращением от stream editor, потому что она редактирует текстовый поток.
Наиболее часто используемым сценарием является подстановка, которая заменяет одни строки другими.
s/regexp/replacement/
regexp — регулярное выражение для сопоставления с каждой входной строкой;
replacement — строка для замены совпадающего текста.
$ echo Efficient Windows | sed "s/Windows/Linux/"
Efficient Linux
Комментарии в Telegram-группе!