Текстовые препроцессоры

Addresses

Sed commands can be given with no addresses, in which case the command will be executed for all input lines; with one address, in which case the
command will only be executed for input lines which match that address; or with two addresses, in which case the command will be executed for all input lines
which match the inclusive range of lines starting from the first address and continuing to the second address. Three things to note about address ranges: the
syntax is addr1,addr2 (i.e., the addresses are separated by a comma); the line which addr1 matched will always be accepted, even if
addr2 selects an earlier line; and if addr2 is a regexp, it will not be tested against the line that addr1 matched.

After the address (or address-range), and before the command, a ! may be inserted, which specifies that the command shall only be executed if the
address (or address-range) does not match.

The following address types are supported:

number

Match only the specified line number.

first~step

Match every step‘th line starting with line first. For example, »sed -n 1~2p» will print all the odd-numbered lines in the input stream, and
the address 2~5 will match every fifth line, starting with the second. first can be zero; in this case, sed operates as if it were equal to
step. (This is an extension.)

$

Match the last line.

/regexp/

Match lines matching the regular expression regexp.

\cregexpc

Match lines matching the regular expression regexp. The c may be any character.

GNU sed also supports some special 2-address forms:
0,addr2

Start out in «matched first address» state, until addr2 is found. This is similar to 1,addr2, except that if addr2 matches the very
first line of input the 0,addr2 form will be at the end of its range, whereas the 1,addr2 form will still be at the beginning of its range. This
works only when addr2 is a regular expression.

addr1,+N

Will match addr1 and the N lines following addr1.

addr1,~N

Will match addr1 and the lines following addr1 until the next line whose input line number is a multiple of N.

Команда sed в Linux

Сначала рассмотрим синтаксис команды:

$ sed опции -e команды файл

А вот её основные опции:

  • -n, —quiet — не выводить содержимое буфера шаблона в конце каждой итерации;
  • -e — команды, которые надо выполнить для редактирования;
  • -f — прочитать команды редактирования из файла;
  • -i — сделать резервную копию файла перед редактированием;
  • -l — указать свою длину строки;
  • -r — включить поддержку расширенного синтаксиса регулярных выражений;
  • -s — если передано несколько файлов, рассматривать их как отдельные потоки, а не как один длинный.

Я понимаю, что сейчас всё очень сложно, но к концу статьи всё прояснится.

1. Как работает sed

Теперь нужно понять как работает команда sed. У утилиты есть два буфера, это активный буфер шаблона и дополнительный буфер. Оба изначально пусты. Программа выполняет заданные условия для каждой строки в переданном ей файле.

sed читает одну строку, удаляет из неё все завершающие символы и символы новой строки и помещает её в буфер шаблона. Затем выполняются переданные в параметрах команды, с каждой командой может быть связан адрес, это своего рода условие и команда выполняется только если подходит условие.

Когда всё команды будут выполнены и не указана опция -n, содержимое буфера шаблона выводится в стандартный поток вывода перед этим добавляется обратно символ перевода строки. если он был удален. Затем запускается новая итерация цикла для следующей строки.

Если не используются специальные команды, например, D, то после завершения одной итерации цикла содержимое буфера шаблона удаляется. Однако содержимое предыдущей строки хранится в дополнительном буфере и его можно использовать.

2. Адреса sed

Каждой команде можно передать адрес, который будет указывать на строки, для которых она будет выполнена:

  • номер — позволяет указать номер строки, в которой надо выполнять команду;
  • первая~шаг — команда будет выполняется для указанной в первой части сроки, а затем для всех с указанным шагом;
  • $ — последняя строка в файле;
  • /регулярное_выражение/ — любая строка, которая подходит по регулярному выражению. Модификатор l указывает, что регулярное выражение должно быть не чувствительным к регистру;
  • номер, номер — начиная от строки из первой части и заканчивая строкой из второй части;
  • номер, /регулярное_выражение/ — начиная от сроки из первой части и до сроки, которая будет соответствовать регулярному выражению;
  • номер, +количество — начиная от номера строки указанного в первой части и еще плюс количество строк после него;
  • номер, ~число — начиная от строки номер и до строки номер которой будет кратный числу.

Если для команды не был задан адрес, то она будет выполнена для всех строк. Если передан один адрес, команда будет выполнена только для строки по этому адресу. Также можно передать диапазон адресов. Тогда адреса разделяются запятой и команда будет выполнена для всех адресов диапазона.

3. Синтаксис регулярных выражений

Вы можете использовать такие же регулярные выражения, как и для Bash и популярных языков программирования. Вот основные операторы, которые поддерживают регулярные выражения sed Linux:

  • * — любой символ, любое количество;
  • \+ — как звездочка, только один символ или больше;
  • \? — нет или один символ;
  • \{i\} — любой символ в количестве i;
  • \{i,j\} — любой символ в количестве от i до j;
  • \{i,\} — любой символ в количестве от i и больше.

4. Команды sed

Если вы хотите пользоваться sed, вам нужно знать команды редактирования. Рассмотрим самые часто применяемые из них:

  • # — комментарий, не выполняется;
  • q — завершает работу сценария;
  • d — удаляет буфер шаблона и запускает следующую итерацию цикла;
  • p — вывести содержимое буфера шаблона;
  • n — вывести содержимое буфера шаблона и прочитать в него следующую строку;
  • s/что_заменять/на_что_заменять/опции — замена символов, поддерживаются регулярные выражения;
  • y/символы/символы — позволяет заменить символы из первой части на соответствующие символы из второй части;
  • w — записать содержимое буфера шаблона в файл;
  • N — добавить перевод строки к буферу шаблона;
  • D — если буфер шаблона не содержит новую строку, удалить его содержимое и начать новую итерацию цикла, иначе удалить содержимое буфера до символа перевода строки и начать новую итерацию цикла с тем, что останется;
  • g — заменить содержимое буфера шаблона, содержимым дополнительного буфера;
  • G — добавить новую строку к содержимому буфера шаблона, затем добавить туда же содержимое дополнительного буфера.

Утилите можно передать несколько команд, для этого их надо разделить точкой с запятой или использовать две опции -e. Теперь вы знаете всё необходимое и можно переходить к примерам.

Understand sed Linux command

The sed command is a non-interactive text editor. Sed Linux command edits data based on the rules you provide; you can use it like this:

$ sed options file

You are not limited to use sed to manipulate files; you apply it to the  directly like this:

$ echo "Welcome to LikeGeeks page" | sed 's/page/website/'

The s command replaces the first text with the second text pattern. In this case, we replaced the string “website” with the word “page”.

The above example was a simple example to demonstrate the tool. We can use the sed Linux command to manipulate files as well.

Let’s create a sample file :

$ sed 's/test/another test/' ./myfile

The results are printed to the screen instantaneously; you don’t have to wait for processing the file to the end.

If your file is massive enough, you will see the result before the processing is finished.

Sed Linux command doesn’t update your data. It only sends the changed text to . The file is still untouched. If you need to overwrite the existing content, you can check our previous post, which was talking about redirections.

Useful examples

Suppose that we have a file that contains text with a placeholder, and we have another file that contains the data that will fill the placeholder on the other file.

We will use the (r) and (d) flags to do the job.

The word DATA in that file is a placeholder for a real content that we will store in another file called data.

We will replace it with the actual content:

$ Sed '/DATA>/ {

r newfile

d}' myfile

Awesome!! as you can see, we filled the placeholder location with the data from the other file.

This is just a small intro about sed command. The sed Linux command is another world by itself.

The only limitation is your imagination.

I hope you find it easy to manipulate strings using the sed Linux command.

Thank you.

Основные команды

Рассмотрим основные команды:

a текст — добавить новую строку с текстом после указанной строки

] c текст — Удаляет выбранные строки и заменяет их на текст

] d — Удаляет указанные строки.

i текст — Вставить текст на место указанной строки.

] p (с флагом -n) выводит найденные строки.

q — выход из sed.

] r файл — Читает файл и выдает его содержание на выход.

] s/регулярное_выражение/замена/флаги — Заменяет регулярное_выражение на замена-у с учётом флагов:

  • g — во всей строке
  • i — без учёта регистра
  • p — выводить результат замены

] y/строка1/строка2/ — Заменяет все вхождения символов в строке1 соответсвующими символами из строки2. Длины строк должны быть одинаковыми.

] { команды } — скобки группируют команды = — Выдаёт номера строк

Delete lines

To delete lines using sed, you can use the delete (d) flag is your friend.

The delete flag deletes the text from the stream, not the original file.

$ sed '2d' myfile

Here we delete the second line only from myfile.

What about deleting a range of lines?

$ sed '2,3d' myfile

Here we delete a range of lines, the second and the third.

Another type of ranges:

$ sed '3,$d' myfile

Here we delete from the third line to the end of the file.

All these examples never modify your original file.

$ sed '/test 1/d' myfile

Here we use a pattern to delete the line if matched on the first line.

If you need to delete a range of lines, you can use two text patterns like this:

$ sed '/second/,/fourth/d' myfile

We deleted from the second to the fourth line.

COLOPHON top

       This page is part of the sed (stream-oriented editor) project.
       Information about the project can be found at 
       ⟨http://www.gnu.org/software/sed/⟩.  If you have a bug report for this
       manual page, send it to bug-sed@gnu.org.  This page was obtained from
       the tarball sed-4.8.tar.gz fetched from
       ⟨https://www.gnu.org/software/sed/⟩ on 2020-08-13.  If you discover
       any rendering problems in this HTML version of the page, or you
       believe there is a better or more up-to-date source for the page, or
       you have corrections or improvements to the information in this
       COLOPHON (which is not part of the original manual page), send a mail
       to man-pages@man7.org

sed 4.8                         January 2020                          SED(1)

Pages that refer to this page:
egrep(1), 
fgrep(1), 
gawk(1), 
grep(1), 
iostat2pcp(1), 
pdfroff(1), 
pmdaopenmetrics(1), 
sheet2pcp(1), 
cpuset(7)

Основные команды Sed

Для того чтобы применить SED достаточно ввести в командную строку

echo ice | sed s/ice/fire/

Результат:

fire

Замена слова в файле

Обычно SED применяют к файлам, например к логам или конфигам.

Предположим, что у нас есть файл input.txt следующего содержания

Мы хотим заменить слово Here на There

sed ‘s/HereThere/’ input.txt

Результат будет выведен в консоль:

There is a String
There is an Integer
There is a Float

Если нужно не вывести в консоль а изменить содержание файла — используем опцию -i

sed -i ‘s/HereThere/’ input.txt

В этом случае перепишется исходный файл input.txt

Рассмотрим пример посложнее. Файл input.txt теперь выглядит так:

sed ‘s/HereThere/’ input.txt

Как Вы сейчас увидите, замена произойдёт только по одному разу в строке

There is an Apple. Here is a Pen. Here is an ApplePen
Integer is There
There is a Float
There is a Pen. Here is a Pineapple. Here is a PineapplePen

Чтобы заменить все слова нужна опция g

sed ‘s/HereThere/g’ input.txt

There is an Apple. There is a Pen. There is an ApplePen
Integer is There
There is a Float
There is a Pen. There is a Pineapple. There is a PineapplePen

Замена слова в файле и вывод результата в другой файл

Та же замена, но с выводом в новый текстовый файл, который мы назовём output:

sed ‘s/HereThere/’ input.txt > output.txt

Замена слова в нескольких файлах одновременно

Если нужно обработать сразу несколько файлов: например файл 1.txt с содержанием

И файл 2.txt с содержанием

Это можно сделать используя *.txt

sed ‘s/HereThere/’ *.txt > output.txt

На выходе файл output.txt будет выглядеть так

Отбросить всё, что левее определённого слова

Предположим, что у нас есть файл input.txt следующего содержания

Мы хотим отбросить всё, что находится левее слова it, включая слово it, и записать в файл.

sed ‘s/^.*it//’ input.txt > output.txt

^ означает, что мы стартуем с начала строки
Результат:

 has a Name
 has a Name
 has a Name

Для доступности объясню синтаксис сравнив две команды. Посмотрите внимательно, когда мы заменяем
слово Here на There.

There находится между двумя слэшами. Раскрашу их для наглядности в зелёный и
красный.

sed ‘s/HereThere

А когда мы хотим удалить что-то, мы сначала описываем, что мы хотим удалить. Например, всё от
начала строки до слова it.

Теперь в правой части условия, где раньше была величина на замену, мы
ничего не пишем, т.е. заменяем на пустое место. Надеюсь, логика понятна.

sed ‘s/^.*it’ > output.txt

Отбросить всё, что правее определённого слова

Предположим, что у нас есть файл input.txt следующего содержания

Мы хотим отбросить всё, что находится правее слова is, включая слово is, и записать в файл.

sed ‘s/is.*//’ > output.txt

Результат:

Экранирование символов в sed

Специальные символы экранируются с помощью \

Предположим, что у нас есть файл input.txt следующего содержания

Мы хотим отбросить всё, что находится левее /a, включая /a, и записать в файл.

sed ‘s/^.*/a//’ > output.txt

В результате получим ошибку

-e expression #1, char 15: unknown option to `s’

Чтобы команда заработала нужно добавить \ перед /

sed ‘s/^.*\/a//’ > output.txt

Результат:

Два условия одновременно в Sed

Предположим, что у нас есть файл input.txt следующего содержания

Мы хотим отбросить всё, что находится левее /b, включая /b, и всё, что правее
has.

Таким образом, в каждой строчке должно остаться только слово it.

Нужно учесть необходимость экранирования специального символа / а также мы хотим
направить вывод в файл.

sed ‘s/^.*\/b//
;
s/has.*//’ input.txt > output.txt

Результат:

Допустим Вы хотите удалить все строки после третьей

sed 3q input.txt > output.txt

Удалить строку

Допустим Вы хотите удалить все строки где встречается слово Apple в файле input.txt

Сделать это можно с помощью опции d

sed ‘/Apple/d‘ input.txt > output.txt

Результат:

Теперь сделаем более сложное условие — удалим все строки где есть слово Pineapple и слово Integer

sed ‘/Pineapple\|Integer/d’ input.txt > output.txt

| выступает в роли логического ИЛИ
\ нужна чтобы экранировать |

Результат:

Получить диапазон строк

В случае, когда Вы работаете с большими файлами, например с логами, часто бывает нужно
получить только определённые строки, например, в момент появления бага.

Копировать из UI командной строки не всегда удобно, но если Вы примерно представляете
диапазон нужных строк — можно скопировать только их и записать в отдельный файл.

Например, Вам нужны строки с 9570 по 9721

sed -n ‘9570,9721p;9722q’ project-2019-10-03.log > bugFound.txt

Substituting flags

Look at the following example carefully:

$ cat myfile
$ sed 's/test/another test/' myfile

The above result shows that we replaced the first occurrence in each line. To substitute all occurrences of a pattern, use one of the following substitution flags.

We can write the flags like this:

s/pattern/replacement/flags

There are four types of substitutions:

  • g, replace all occurrences.
  • A number, the occurrence number for the new text that you want to substitute.
  • p, print the original content.
  • w file: means write the results to a file.

You can limit your replacement by specifying the occurrence number that should be replaced like this:

$ sed 's/test/another test/2' myfile

As you can see, we replaced only the second occurrence on each line.

The g flag means global, which means a global replacement for all occurrences:

$ sed 's/test/another test/g' myfile

The p flag prints each line contains a pattern match, you can use the -n option to print the modified lines only.

$ cat myfile
$ sed -n 's/test/another test/p' myfile

The w flag saves the output to a specified file:

$ sed 's/test/another test/w output' myfile

We printed the output on the screen, but we saved the matching lines to the output file.

Description

Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in
some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is
consequently more efficient. But it is sed‘s ability to filter text in a pipeline which particularly distinguishes it from other types of
editors.

-n, —quiet, —silent
suppress automatic printing of pattern space
-e script, —expression=script
add the script to the commands to be executed
-f script-file, —file=script-file
add the contents of script-file to the commands to be executed
—follow-symlinks
follow symlinks when processing in place; hard links will still be broken.
-i, —in-place[=SUFFIX]
edit files in place (makes backup if extension supplied). The default operation mode is to break symbolic and hard links. This can be changed with
—follow-symlinks and —copy.
-c, —copy
use copy instead of rename when shuffling files in -i mode. While this will avoid breaking links (symbolic or hard), the resulting editing operation
is not atomic. This is rarely the desired mode; —follow-symlinks is usually enough, and it is both faster and more secure.
-l N, —line-length=N
specify the desired line-wrap length for the ‘l’ command
—posix
disable all GNU extensions.
-r, —regexp-extended
use extended regular expressions in the script.
-s, —separate
consider files as separate rather than as a single continuous long stream.
-u, —unbuffered
load minimal amounts of data from the input files and flush the output buffers more often
—help

display this help and exit

—version

output version information and exit

If no -e, —expression, -f, or —file option is given, then the first non-option argument is taken as the sed script to
interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read.

Использование awk в Linux

Простейшая и часто востребованная задача — выборка полей из стандартного вывода. Вы не найдете более подходящего инструмента для решения этой задачи, чем awk. По умолчанию awk разделяет поля пробелами. Если вы хотите напечатать первое поле, вам нужно просто использовать функцию print и передать ей параметр $1, если функция одна, то скобки можно опустить:

Да, использование фигурных скобок немного непривычно, но это только в первое время. Вы уже догадались как напечатать второе, третье, четвертое, или другие поля? Правильно это $2, $3, $4 соответственно.

Иногда необходимо представить данные в определенном формате, например, выбрать несколько слов. AWK легко справляется с группировкой нескольких полей и даже позволяет включать статические данные:

Если поля разделены не пробелами, а другим разделителем, просто укажите в параметре -F нужный разделитель в кавычках, например «:» :

Но разделитель не обязательно заключать в кавычки. Следующий вывод аналогичен предыдущему:

Иногда нужно обработать данные с неизвестным количеством полей. Если вам нужно выбрать последнее поле можно воспользоваться переменной $NF. Вот так вы можете вывести последнее поле:

Также вы можете использовать переменную $NF для получения предпоследнего поля:

Или поля с середины:

Все это можно сделать с помощью таких утилит как sed, cut и grep но это будет намного сложнее.

Как я рассказывал выше, awk обрабатывает одну строку за раз, вот этому подтверждение:

А вот пример фильтрации с помощью условия, выведем только строку, в которой содержится текст one:

А вот пример использования операций с переменными:

Это означает что мы должны выполнять следующий блок кода для каждой строки. Это можно использовать, например, для подсчета количества переданных данных по запросам из журнала веб-сервера.

Представьте себе, у нас есть журнал доступа, который выглядит так:

Мы можем подсчитать, что количество переданных байт, это десятое поле. Дальше идёт User-Agent пользователя и он нам не интересен:

Вот так можно подсчитать количество байт:

Это только несколько примеров показывающих использование awk в Linux , освоив awk один раз в получите очень мощный и полезный инструмент на всю жизнь.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *