Extraindo uma seção de linha de backup mysql usando sed

3

Eu ocasionalmente preciso extrair um único registro de um mysqlbackup

Para fazer isso, eu primeiro extraio a única tabela que eu quero do backup ...

sed -n -e '/CREATE TABLE.*usertext/,/CREATE TABLE/p' 20120930_backup.sql > table.sql

No table.sql, os registros são agrupados usando inserções estendidas (com talvez 100 registros por inserção antes de criar uma nova linha começando com INSERT INTO), então eles se parecem com ...

INSERT INTO usertext VALUES (1, field2 etc), (2, field2 etc),

INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), ...

Estou tentando extrair o registro 239560 disso, usando ...

sed -n -e '/(239560.*/,/)/p' table.sql > record.sql

Ou seja, comece a transmitir quando encontrar 239560 e pare quando atingir o colchete de fechamento

Mas isso não está funcionando como eu esperava, apenas resulta na saída completa do lote de inserção.

Por favor alguém pode me dar algumas indicações sobre onde estou indo errado?

Eu estaria melhor usando o awk para extrair segmentos de linhas e usar sed para extrair linhas dentro de um arquivo?

    
por carpii 07.10.2012 / 17:58

2 respostas

2

Com base na resposta de Iain, eu criei este truque de sed ...

$ sed  's/\(INSERT[^(]*\).*\((239560,[^)]*)\),.*//' sample.sql | tee 1-record.sql
INSERT INTO usertext VALUES (239560, 2, 3, 4)
$ 

Variação sem usar sed ... Você pode extrair valores de algumas linhas / inserções que correspondam exatamente a esse número.

$ 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)
$ 

o resto da inserção pode ser roteirizado facilmente se você usar -n alternar com grep para pegar a linha de correspondência e depois cortar tudo primeiro (

    
por 07.10.2012 / 23:22
2

Tente algo assim, que pode ser ajustado para o seu exemplo, mas que esperamos que você esteja no caminho certo

dado um arquivo de entrada como este

INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), (103,filed2, etc), ...

sed  's/.*\((102,[^)]*)\),.*//' f
(102, field2, etc)

O que isto faz é dividir seus dados em 3 seções, lembra a seção importante usando (...) e substitui isto pela linha inteira.

  • .* tudo antes do texto que você deseja
  • \((102,[^)]*)\) do seu texto interessante
  • ,.* todo o resto
por 07.10.2012 / 19:29

Tags