Cortar Trecho de Arquivo

1. Cortar Trecho de Arquivo

João Ricardo
ricardoschet

(usa Debian)

Enviado em 02/12/2014 - 16:46h

Boa tarde,

Tenho um arquivo grande, gostaria de extrair desse arquivo um trecho, de forma que eu forneça a string inicial e a string final, exemplo:

Desejo o trecho que comece com create database teste e que termine com unlock tables.

Como posso fazer isso?

Obrigado.


  


2. Re: Cortar Trecho de Arquivo

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 02/12/2014 - 22:13h

vc pode usar o egrep:

egrep -o 'create database teste.*unlock tables' ARQUIVO

Para mais, veja o manual man egrep


3. Re: Cortar Trecho de Arquivo

João Ricardo
ricardoschet

(usa Debian)

Enviado em 03/12/2014 - 10:25h

Não funcionou :(


4. Re: Cortar Trecho de Arquivo

Perfil removido
removido

(usa Nenhuma)

Enviado em 12/12/2014 - 21:21h

Descrever a estrutura do arquivo é importante para não precisar ficar chutando possíveis soluções. Exemplos simplificando o problema são sempre muito úteis.

Já que o 'egrep' do rai3mb não funcionou ... aqui vai uma tentativa com o sed:

$ sed '/create database/,/unlock tables/!d' arquivo.sql



5. Re: Cortar Trecho de Arquivo

Raimundo Alves Portela
rai3mb

(usa Outra)

Enviado em 13/12/2014 - 18:18h

ricardoschet escreveu:

Não funcionou :(


Descreva o que aconteceu com mais detalhes, poste seu arquivo de exemplo e comando que executou.


6. Re: Cortar Trecho de Arquivo

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 17/12/2014 - 08:30h

Tanto egrep do rai3mb, quanto o sed do textmode funcionam pra mim...

O que falhou ?


7. Re: Cortar Trecho de Arquivo

João Ricardo
ricardoschet

(usa Debian)

Enviado em 17/12/2014 - 09:53h

AprendiNoLinux2 escreveu:

Tanto egrep do rai3mb, quanto o sed do textmode funcionam pra mim...

O que falhou ?



Opa, desculpem a demora em responder,

Meu arquivo de texto contem:


nao pega
6743689
CREATE TABLE `joao`
teste
teste2
teste3
823483274832
48327843287
UNLOCK TABLES
CREATE TABLE `ricardo`
blablabla
UNLOCK TABLES
nao pega



O que eu desejo seria pegar todo o trecho que compreenda CREATE TABLE `joao` até o primeiro UNLOCK TABLES, ou seja, deve me retornar:


CREATE TABLE `joao`
teste
teste2
teste3
823483274832
48327843287
UNLOCK TABLES



8. Re: Cortar Trecho de Arquivo

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 17/12/2014 - 17:08h

Ok, agora entendi o problema real...


Base de dados para teste.
Chamei de meutexto.txt

nao pega
6743689
nao pega
6743689
nao pega
6743689
CREATE TABLE `joao`
teste
teste2
teste3
823483274832
48327843287
UNLOCK TABLES
CREATE TABLE `ricardo`
blablabla
UNLOCK TABLES
nao pega
nao pega
6743689
nao pega
6743689
nao pega
6743689
nao pega
6743689
nao pega
6743689
nao pega
6743689
nao pega
6743689


Agora o script...



#!/bin/bash
#: filtrando.sh
#: Vai filtrar comandos sql.
#: Há várias formas de fazer.
#: Poderia usar sed, mas vai de while rsrs.
#
#:##########################################################################
#: Problemas conhecidos
#:##########################################################################
#: Se comando for minúsculo em algum caso vai falhar.
#: Se UNLOCK TABLES não for encontrado, vai falhar.
#: Se comando estiver todo em uma linha vai falhar.
#:##########################################################################

# Variáveis dos comandos de abertura e fechamento.
g_Prefixo="CREATE TABLE"
g_sufixo="UNLOCK TABLES"
g_arquivo_dados="meutexto.txt"
g_arquivo_saida="comandos.txt"

# Apagando arquivo de saída caso exista.
rm -rf "$g_arquivo_saida"

# Lê arquivo com while porque quero a linha toda.
if [ -f "${g_arquivo_dados}" ]; then
i=0
lc_iniciar=" "
while read line
do
let i++
if ! [ "${line}" == "" ]; then

# Tem conteúdo, vamos saber o que é.
lc_linha_atual="${line}"

# Monta String com base em CREATE TABLE
# POG (Correto seria pegar o tamanho da var.
# Fica como exercício futuro se você quiser arrumar.
lc_chk_prefix=$( echo "${lc_linha_atual:0:12}" )
lc_chk_sufix=$( echo "${lc_linha_atual:0:13}" )

# Confere se o prefixo é igual a var de controle.
# Se for, vai dizer SIM para inicialiar gravação.
if [ "$lc_chk_prefix" == "$g_Prefixo" ]; then
lc_iniciar="SIM"
fi

# Enquanto a var for SIM, vai gravar o arquivo.
if [ "$lc_iniciar" == "SIM" ]; then
echo "$lc_linha_atual" >> "$g_arquivo_saida"
fi

# Se encontrar o comando de fechamento, vai inicializar o controle
if [ "$lc_chk_sufix" == "$g_sufixo" ]; then
lc_iniciar=" "
fi
fi
done < "$g_arquivo_dados"
else
echo " Não encontrou arquivo $g_arquivo_dados "
read -t 5
exit 45
fi



resultado final do teste.


CREATE TABLE `joao`
teste
teste2
teste3
823483274832
48327843287
UNLOCK TABLES
CREATE TABLE `ricardo`
blablabla
UNLOCK TABLES


É isso ?


9. Re: Cortar Trecho de Arquivo

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 17/12/2014 - 17:59h

Agora que já viu o sofrimento do while, vamos a forma sed de resolver o problema....

meutexto.txt = seu arquivo com os comandos create e unlock em várias linhas...
comandos.txt = arquivo de saída..


cat meutexto.txt | sed -n '/CREATE/{:a;/UNLOCK/!{N;ba;};p;}' > comandos.txt




Note que funciona "igual" rsrs

ps: Sofre do mesmo problema de CAIXA ALTA e caixa baixa....

Resultado...


CREATE TABLE `joao`
teste
teste2
teste3
823483274832
48327843287
UNLOCK TABLES
CREATE TABLE `ricardo`
blablabla
UNLOCK TABLES


@Ga_Tux

ps: Fica como lição de casa entender o que está sendo feito no sed.

-n

CREATE

{:a;

UNLOCK

!{N;
ba;};

p;}

Pesquise sobre retrovisores...

E porque não usar a palavra TABLE(S)....



10. Re: Cortar Trecho de Arquivo

João Ricardo
ricardoschet

(usa Debian)

Enviado em 18/12/2014 - 13:27h

@AprendiNoLinux

Opa,

O sed funcionou, porém caso eu tenha outros CREATE TABLE e UNLOCK TABLES acima desde trecho, ele não funciona,
testei usando o trecho:


nao pega
674368o
9
CREATE TABLE `dshudhus`
sauhhuashd
dsahuduhsad
dsauidsauhdu
dsauhdhuysad
UNLOCK TABLES
CREATE TABLE `joao`
teste
teste2
teste3
823483274832
48327843287
UNLOCK TABLES
CREATE TABLE `ricardo`
blablabla
UNLOCK TABLES
nao pega


A saída (comandos.txt) foi:


CREATE TABLE `dshudhus`
sauhhuashd
dsahuduhsad
dsauidsauhdu
dsauhdhuysad
UNLOCK TABLES
CREATE TABLE `joao`
teste
teste2
teste3
823483274832
48327843287
UNLOCK TABLES
CREATE TABLE `ricardo`
blablabla
UNLOCK TABLES





11. Re: Cortar Trecho de Arquivo

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 18/12/2014 - 20:52h

ricardoschet escreveu:

@AprendiNoLinux

Opa,

O sed funcionou, porém caso eu tenha outros CREATE TABLE e UNLOCK TABLES acima desde trecho, ele não funciona,
testei usando o trecho:

nao pega
674368o
9.....


Testando.... Mudando a base de dados...meuteste.txt


kaka
sei lá o que veio aqui
testando......
CREATE TABLE Customer
(First_Name char(50),
Last_Name char(50),
Address char(50) default 'Unknown',
City char(50) default 'Rio de Janeiro',
Country char(25),
Birth_Date datetime);
UNLOCK TABLES
nao pega
6743689
nao pega
CREATE TABLE Customer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date datetime);
UNLOCK TABLES
6743689
nao pega
6743689
CREATE TABLE `joao`
teste
teste2
teste3
823483274832
48327843287
UNLOCK TABLES
CREATE TABLE `ricardo`
blablabla
UNLOCK TABLES
nao pega
nao pega
6743689
nao pega
6743689
nao pega
6743689
nao pega
6743689
nao pega
6743689
nao pega
6743689
CREATE TABLE xCustomer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date datetime);
UNLOCK TABLES
nao pega
6743689


Executando sed...


cat meutexto.txt | sed -n '/CREATE/{:a;/UNLOCK/!{N;ba;};p;}' > comandos.txt


Gerou arquivo comandos.txt assim...


CREATE TABLE Customer
(First_Name char(50),
Last_Name char(50),
Address char(50) default 'Unknown',
City char(50) default 'Rio de Janeiro',
Country char(25),
Birth_Date datetime);
UNLOCK TABLES
CREATE TABLE Customer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date datetime);
UNLOCK TABLES
CREATE TABLE `joao`
teste
teste2
teste3
823483274832
48327843287
UNLOCK TABLES
CREATE TABLE `ricardo`
blablabla
UNLOCK TABLES
CREATE TABLE xCustomer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date datetime);
UNLOCK TABLES


Gerei mudando a base e continuou funfando...
O problema é que se não tiver UNLOCK para fechar o retrovisor sed vai falhar.
Leia-se memória auxiliar...







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts