Usando o Awk (e assumindo que a saída que você deseja capturar é o terceiro campo):
awk '/CREATE TABLE/ {printf "%s\n", "drop table "$3" cascade;"}' datadump.sql
drop table agency cascade;
drop table agency_contact cascade;
Eu tenho um banco de dados despejado para sql com comandos create table
e eu preciso criar um script para aplicar um determinado comando a alguns dos objetos, como soltar a tabela como um exemplo.
No caso de descartar as tabelas, por exemplo, faço a varredura de linhas que começam com create table
e extraio o terceiro campo com o comando cut
. Depois disso eu quero prefixar cada linha de saída com um comando como drop table
seguido por cascade;
ou outros comandos adequados.
O comando que eu uso agora é cat datadump.sql | cut -d ' ' -f 1-3 | grep 'CREATE TABLE' | uniq | cut -d ' ' -f 3
.
Isso gera uma lista como
table1
table2
table3
que eu quero converter para
drop table table1 cascade;
drop table table2 cascade;
e salve um arquivo para ser executado quando necessário. Na verdade, eu gostaria de tornar o prefixo e o sufixo condicionais na entrada, mas por enquanto o texto literal simples deveria ser suficiente.
Aqui está uma entrada de amostra, conforme solicitado nos comentários:
CREATE TABLE agency (
agrecordid integer DEFAULT nextval(('agency0_pk_seq'::text)::regclass) NOT NULL,
agidcode1 character(20) NOT NULL,
...,
...,
agaddress1 character(40),
agtown character(40),
agfax2 character(20),
agemail character(20)
);
CREATE TABLE agency_contact (
recordid integer DEFAULT nextval(('agencon0_pk_seq'::text)::regclass) NOT NULL,
agencyid integer,
name character varying(35),
...,
...,
email2 character varying(30),
deptorperson character(1),
notes text
);
Tags text-processing