Expressão regular para extrair nomes de tabelas do banco de dados de arquivos .sql

1

Eu estou olhando para pesquisar o meu diretório de consultas SQL e para as tabelas de banco de dados mais comuns em todos os arquivos. Para fazer isso, espero usar grep para isolar esses nomes, mas não consigo descobrir a expressão regular para extrair apenas os nomes das tabelas.

Eu acho que para isolar as tabelas, estou procurando a sequência de texto depois das palavras FROM ou JOIN .

Eu espero que o pessoal possa me ajudar a construir isso, mas atualmente minhas declarações do grep estão encontrando apenas as ocorrências dessas palavras, mas como puxo a string diretamente seguindo essas palavras-chave?

grep -R "FROM" | grep -R  "JOIN"
    
por mbau978 11.07.2016 / 18:32

1 resposta

2

Eu peguei algumas consultas de amostra do Google e fiz alguns arquivos sql com os seguintes dados nelas, por exemplo:

file1.sql

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers
ON Orders.CustomerID=Customers.CustomerID;
SELECT Customers.CustomerName, Orders.OrderID
INTO CustomersOrderBackup2013
FROM CustomersOriginal
LEFT JOIN Orders
ON Customers.CustomerID=Orders.CustomerID;

file2.sql

-- Dumping data for table 'user_details'
INSERT INTO 'user_details' ('user_id', 'username', 'first_name', 'last_name', 'gender', 'password', 'status') VALUES
(1, 'rogers63', 'david', 'john', 'Female', 'e6a33eee180b07e563d74fee8c2c66b8', 1);

A primeira coisa que você está procurando é o operador OR para grep:

$ grep 'INTO\|FROM\|JOIN' *.sql
file1.sql:FROM Orders
file1.sql:INNER JOIN Customers
file1.sql:INTO CustomersOrderBackup2013
file1.sql:FROM CustomersOriginal
file1.sql:LEFT JOIN Orders
file2.sql:INSERT INTO 'user_details' ('user_id', 'username', 'first_name', 'last_name', 'gender', 'password', 'status') VALUES

Isso obterá as linhas inteiras dos arquivos originais. Em seguida, vamos usar sed para extrair os nomes das tabelas:

$ grep 'INTO\|FROM\|JOIN' *.sql | sed -r 's/.*?(FROM|INTO|JOIN)\s'?([^' ]*).*//g'
Orders
Customers
CustomersOrderBackup2013
CustomersOriginal
Orders
user_details

Por fim, vamos eliminar as tabelas duplicadas:

$ grep 'INTO\|FROM\|JOIN' *.sql | sed -r 's/.*?(FROM|INTO|JOIN)\s'?([^' ]*).*//g' | sort -u
Customers
CustomersOrderBackup2013
CustomersOriginal
Orders
user_details
    
por DynamicBits 02.11.2016 / 01:48