Заметки о работе с основными командами в 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-группе!