Проверить замену, потом править
diff покажет каждую изменённую строку до и после:
sed меняет и удаляет строки по шаблону, awk делит строку на поля и считает по ним; оба читают текст построчно.
sed -n 's/old/new/p' app.ini
проба: какие строки изменятся
sed -i.bak 's/old/new/g' app.ini
правка, копия в app.ini.bak
sed -n '5,10p' file
строки с 5 по 10
sed '/^ *#/d; /^$/d' file
без комментариев и пустых строк
sed '/^ *#/! s/old/new/' file
заменить вне комментариев
awk '{print $1}' access.log
первое поле каждой строки
awk -F: '$3 >= 1000 {print $1}' /etc/passwd
фильтр по полю
awk '{s += $4} END {print s}' log.txt
сумма четвёртого поля
sed и awk читают текст построчно — из файла или
конвейера — и печатают результат. Файл остаётся прежним, пока
sed не получит ключ -i.
s/шаблон/замена/ меняет текст, d удаляет
строку, p печатает её.$1, $2… и выполняет действие для строк,
которые подходят под условие.На учебных машинах sed — GNU sed 4.9, awk — GNU awk 5.2.
s/шаблон/замена/флаги. Шаблон — регулярное выражение, флаги: g —
все совпадения в строке (без него только первое), p — напечатать изменённую
строку, I — без учёта регистра. Разделителем служит любой символ после s:
s#/old/path#/new/path# удобнее, когда в шаблоне есть /.
Точка в шаблоне — любой символ, поэтому адрес без \. находит лишнее:
10.20.0.150 тоже подошёл. Шаблон 10\.20\.0\.15: с экранированными точками
и двоеточием в конце совпадает только с нужным адресом.
Перед командой можно указать, к каким строкам её применять:
| Адрес | Строки |
|---|---|
5 |
пятая |
5,10 |
с пятой по десятую |
$ |
последняя |
/^db_host/ |
подходящие под шаблон |
/^ *#/! |
все, кроме подходящих |
! после адреса обращает его. Так замена обходит закомментированные строки:
С ключом -E (расширенные выражения) скобки ( ) запоминают часть
совпадения, а \1, \2 вставляют её в замену:
Обе записи ключа, с пробелами и без, стали одинаковыми, комментарий не
тронут: шаблон начинается с ^. Без -E скобки — обычные символы, и \1
ссылаться не на что (см. неполадку invalid reference).
Программа awk — пары условие {действие}. $0 — вся строка, $1… — поля,
NF — число полей, NR — номер строки. Условие — сравнение поля
($4 == "refund"), номер строки (NR > 1 пропускает заголовок) или шаблон
(/error/). Без условия действие выполняется для каждой строки, без действия
подходящая строка печатается целиком.
Блок END {…} выполняется после последней строки, массив s[ключ] собирает
значения по ключу:
Порядок for (k in s) не задан, поэтому результат сортируют. Поля делятся по
пробелам и табуляциям; другой разделитель задаёт -F: awk -F: … для
/etc/passwd, awk -F, … для CSV без кавычек.
Основные ключи обеих программ — в таблице ниже. Полный список — man sed,
man gawk.
| Ключ | Что делает | Пример |
|---|---|---|
-i SUFFIX |
sed — править файл на месте; без аргумента не оставляет резервной копии. опасно | sed -i.bak 's/old/new/g' file |
-n |
sed — не печатать строки автоматически; используется с командой p. | sed -n '5,10p' file |
-F SEP |
awk — задать разделитель полей вместо пробелов/табов по умолчанию. | awk -F: '{print $1}' /etc/passwd |
-E |
sed — расширенные регулярные выражения (без экранирования групп). | sed -E 's/(a|b)+/X/g' file |
-v var=val |
awk — передать значение переменной внутрь программы. | awk -v n=5 '{print $n}' file |
Ничего не найдено. Попробуй запрос короче.
diff покажет каждую изменённую строку до и после:
Сначала список файлов, потом правка: так видно, что именно поменяется.
Шаблон не совпал ни с одной строкой. Прогони ту же замену с -n … p: пустой
вывод значит, что дело в шаблоне — регистр, пробелы вокруг =, точка или *
без \.
Шаблон шире, чем нужно: точка без \ совпала с любым символом, нет ^ в
начале, нет адреса для комментариев. Сверь вывод sed -n … p до правки.
sed 's/a/b' — не хватает последнего разделителя. Команда целиком —
s/шаблон/замена/.
В шаблоне или замене есть /, и sed принял остаток за флаги. Смени разделитель:
s#/old/path#/new/path#.
В замене стоит \1, а группы в шаблоне нет: скобки без -E — обычные
символы. Добавь -E или пиши группу как \(…\).
Не закрыта скобка или кавычка в программе:
Программу awk бери в одинарные кавычки — тогда $1 не подставит оболочка.
Строка делится не тем разделителем: в /etc/passwd поля разделены :, в
CSV — запятой. Задай -F.
sed -i переписывает файл без подтверждения. Ошибка в шаблоне по многим
файлам сразу (*.conf) откатывается только из копий: пиши -i.bak и
проверяй замену с -n … p до правки.
sed -i пишет результат во временный файл и ставит его на место прежнего.
Символическая ссылка при этом превращается в обычный файл, а жёсткая ссылка
перестаёт указывать на правленое содержимое. Для ссылок нужен ключ
--follow-symlinks или правка цели.
s и адресов.sed -i.Есть неточность? Сообщить об ошибке в статье