Вопрос или проблема
Мне нужно найти номер строки конкретного совпадения в файле – адрес электронной почты – а затем удалить его от начала файла до строки с совпадением.
например, допустим, номер строки 13807. Поэтому мне нужно сохранить строки с 13808 и дальше без изменений.
Вот пример:
$ cat input
some
lines
before
[email protected]
and
some
more
afterwards
$ cat output
and
some
more
afterwards
sed
sed '1,/mail@server\.com/d' # удаление до строки с совпадением
sed '/mail@server\.com/,$!d' # сохранение строки с совпадением
Объяснения
1,/mail@server\.com/d
–d
удаляет каждую строку от строки1
до (,
)[email protected]
/mail@server\.com/,$!d
– не (!
)d
удалять каждую строку от[email protected]
до (,
) конца файла ($
), а всё остальное
Использование
sed '…' file > file2 # сохраняем вывод в file2
sed -i.bak '…' file # изменяем файл на месте, сохраняя резервную копию как file.bak
sed -i '…' file # изменяем файл на месте без резервной копии (осторожно!)
awk
awk 'f;/mail@server\.com/{f=1}' # исключая строку с совпадением
awk '/mail@server\.com/{f=1}f' # включая строку с совпадением
Объяснения
f
– переменнаяf
, переменные по умолчанию0
=false
,awk
ничего не печатает, если выражениеfalse
, и просто печатает строку, если выражениеtrue
/mail@server\.com/{f=1}
– если найден[email protected]
, поставитьf=1
, таким образом выражение становитсяtrue
при следующем появленииf
в выражении
Использование
awk '…' file > file2 # сохраняем вывод в file2
awk -iinplace -vINPLACE_SUFFIX=.bak '…' file # изменяем файл на месте, сохраняя резервную копию как file.bak
awk -iinplace '…' file # изменяем файл на месте без резервной копии (осторожно!)
Ещё один подход с awk
, включая строку с совпадением.
awk '/pattern/, 0' infile
Исключая строку с совпадением.
awk '/pattern/&& getline, 0' infile
Ответ или решение
Для задач, связанных с обработкой текстовых файлов в UNIX-подобных системах, таких как удаление строк до определенной найденной закономерности в файле, существует несколько эффективных инструментов, включая sed
и awk
. Эти утилиты часто используются для обработки текста, поскольку они предлагают мощные средства работы с текстом в потоках.
Теория
Прежде всего, давайте обсудим, что вам нужно сделать: удалить все строки в файле от начала до строки, содержащей определённый шаблон. После этого важный момент – сохранить все строки, начиная с найденной ниже. Это часто используется в скриптах для очистки данных или подготовки логов для анализа.
sed
(Stream Editor) — это неинтерактивный редактор, который предназначен для обработки и преобразования текста в потоке данных.awk
— это язык обработки текстовых файлов, который позволяет выделять нужные куски текста, выполнять над ними операции и затем выводить измененный текст.
Примеры
Использование sed
-
Удаление строк, включая соответствующую шаблону строку:
sed '1,/mail@server\.com/d' input.txt > output.txt
Это команда удаляет все строки от начала файла
input.txt
до (включительно) строки, содержащейmail@server.com
. -
Удаление строк, исключая соответствующую шаблону строку:
sed '/mail@server\.com/,$!d' input.txt > output.txt
Эта команда оставляет включенной строку с найденным шаблоном и все следующие за ней строки.
Использование awk
-
Удаление строк, включая соответствующую шаблону строку:
awk 'f;/mail@server\.com/{f=1}' input.txt > output.txt
Переменная
f
используется как флаг, который устанавливается в1
(истина) при обнаружении строки с шаблоном, после чего все строки печатаются. -
Удаление строк, исключая соответствующую шаблону строку:
awk '/mail@server\.com/{f=1} f' input.txt > output.txt
В этой команде вывод начинается со строки, следующей за той, в которой найден шаблон. Здесь
f
изначально равно0
(ложь), и как только найден шаблон,f
становится1
, что заставляет awk выводить все следующие строки.
Применение
Для применения этих команд вам необходимо иметь базовое понимание работы с командной строкой и текстовыми редакторами UNIX-систем. Обе утилиты, sed
и awk
, поддерживают использование регулярных выражений, что делает их невероятно гибкими и мощными инструментами.
-
Создание резервных копий: Когда вы используете
sed
с параметром-i
, либоawk
с-iinplace
, важно помнить о важности создания резервных копий ваших оригинальных файлов, чтобы избежать потери данных. Вы можете добавить суффикс для резервных копий, воспользовавшись-i.bak
вsed
или-vINPLACE_SUFFIX=.bak
вawk
. -
Интерпретация регулярных выражений: Будьте аккуратны с регулярными выражениями, особенно если в строке, которую вы ищете, есть специальные символы, такие как точки (
.
), которые также служат метасимволами в регулярных выражениях. Если вы хотите найти буквальную точку, вам нужно экранировать её, например,\.
.
Заключение
Использование sed
и awk
— это простой способ автоматизировать обработку больших текстовых файлов. Эти инструменты особенно полезны в среде системного администрирования и разработки для текста, так как позволяют быстро и эффективно производить манипуляции с данными. Главный аспект при работе с ними — это аккуратность в обращении с исходными данными и регулярными выражениями, а также понимание их синтаксиса. Эти инструменты помогают существенно экономить время, когда дело касается редактирования файловых содержимого в больших объемах.