Иногда мне нужно извлечь один запись из mysqlbackup
Для этого я сначала извлекаю одну нужную мне таблицу из резервной копии ...
sed -n -e '/CREATE TABLE.*usertext/,/CREATE TABLE/p' 20120930_backup.sql > table.sql
В table.sql записи группируются с использованием расширенных вставок (может быть, 100 записей на вставку, прежде чем она создает новую строку, начинающуюся с INSERT INTO), поэтому они выглядят как ...
INSERT INTO usertext VALUES (1, field2 etc), (2, field2 etc),
INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), ...
Я пытаюсь извлечь из этого запись 239560, используя ...
sed -n -e '/(239560.*/,/)/p' table.sql > record.sql
Т.е. начать потоковую передачу, когда найдет 239560, и остановить, когда попадет в закрывающую скобку
Но это не работает, как я надеялся, это просто приводит к выводу полного пакета вставки.
Пожалуйста, может кто-нибудь подсказать мне, где я ошибаюсь?
Могу ли я использовать awk для извлечения сегментов строк и использовать sed для извлечения строк в файле?
Попробуйте что-то подобное, которое может быть настроено на ваш пример, но, надеюсь, поможет вам встать на правильный путь.
учитывая входной файл, подобный этому
INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), (103,filed2, etc), ...
sed 's/.*\((102,[^)]*)\),.*/\1/' f
(102, field2, etc)
Это разбивает ваши данные на 3 раздела, запоминает важный раздел, используя (...), и заменяет им всю строку.
.*
все перед текстом, который вы хотите\((102,[^)]*)\)
ваш интересный текст ,.*
все остальноеОсновываясь на ответе Иана, я придумал этот трюк sed ...
$ sed 's/\(INSERT[^(]*\).*\((239560,[^)]*)\),.*/\1\2/' sample.sql | tee 1-record.sql
INSERT INTO usertext VALUES (239560, 2, 3, 4)
$
- Вариация без использования sed ... Вы можете извлечь значения некоторой строки / вставки, которые соответствуют только этому числу.
$ cat sample.sql
INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), (239560, 2, 3, 4), (5, 8, 9)
INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), (1239560, 2, 3, 4), (5, 8, 9)
$ egrep -o '(\(239560\,[^)]+\))' sample.sql
(239560, 2, 3, 4)
$
Остальная часть вставки может быть легко написана сценарием, если вы используете переключатель -n с grep, чтобы поймать строку совпадения, а затем просто вырезать все до первого (