[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [shell-script] validação de string
From: |
Jose Edson Moreno Jr |
Subject: |
Re: [shell-script] validação de string |
Date: |
Wed, 16 Mar 2011 15:47:54 -0300 |
Humm ...
Ok, mais dados e as coisas modificam e ficam melhores ...
Legal, para novatos isto será muito util, vamos lá ...
Podemos fazer assim :
*grep -i -e set -e control -e \'*\' teste.txt | awk -F'\n' '{printf $0" "}
END {printf "\n"}' | tr [:upper:] [:lower:] | sed "s/set control /\nset
control /g" | grep -e "^set control " | awk '{print $1" "$2" "$3}'*
OK, muito coisa junto, eu explico passo a passo :
Primeiramente, temos que separar o " set control 'n' " de todo o resto,
sempre prevendo que a combinação pode estar em uma linha, duas ou tres, e
ser upper ou lower case, existem várias abordagens para isto, mas um meio
fácil é usar o grep foi o que fiz :
*
grep -i -e set -e control -e \'*\' teste.txt*
O segundo passo que fazemos é juntar os provaveis " set control 'n' "
separados , para isto elimino o \n , também temos várias abordagens, aqui
uso o awk, gosto dele é bastante flexivel, podereia o usar o tr, só que como
as ficaram complexas, o tr acho pouco claro no meio de muitos comandos ...,
vamos lá :
*
grep -i -e set -e control -e \'*\' teste.txt | awk -F'\n' '{printf $0" "}
END {printf "\n"}' *
O terceiro passo, vi que seu arquivo estava tudo com letras maiuscula,
não sei se será sempre assim, para eliminar qualquer problema, ou garantimos
tudo upper ou lower , aqui coloco em lower usando o tr:
*
grep -i -e set -e control -e \'*\' teste.txt | awk -F'\n' '{printf $0" "}
END {printf "\n"}' | tr [:upper:] [:lower:] *
O quarto passo, separar o "set control 'n'" de todo o lixo, bom, temos um
dificultador aqui, o 'n' , pois n pode ser qualquer coisa, para simplificar
isto e o entendimento, vamos fazer em tres passo, primeiro garantir que o
"set control" seja inicio de linha , para isto :
*grep -i -e set -e control -e \'*\' teste.txt | awk -F'\n' '{printf $0" "}
END {printf "\n"}' | tr [:upper:] [:lower:] | sed "s/set control /\nset
control /g" *
Segundo que só linhas que inicia com "set control" sejam selecionado
*grep -i -e set -e control -e \'*\' teste.txt | awk -F'\n' '{printf $0" "}
END {printf "\n"}' | tr [:upper:] [:lower:] | sed "s/set control /\nset
control /g" | grep -e "^set control "*
Terceiro extrair realmente a string set + control + 'n' de todo lixo que
esta junto, para isto basta pegar as 3 primeiras colunas separadas por
espaço, poderiamos utilizar o cut, mas acho ele um tanto pouco didatico e
pouco flexivel, vou de novo com o bom e velho awk, ele é um verdadeiro
canivete suiço quando se trata de manipulação de entrada ...
*grep -i -e set -e control -e \'*\' teste.txt | awk -F'\n' '{printf $0" "}
END {printf "\n"}' | tr [:upper:] [:lower:] | sed "s/set control /\nset
control /g" | grep -e "^set control " | awk '{print $1" "$2" "$3}'*
Pronto, esta tratado o dado, com esta sequencia de comando extraimos todos
"set control 'n'" do arquivo e aprtir dai fazermos o que quisermos como por
exemplo que já tinha dito contar quantos tem .
Att.
Edson
Em 16 de março de 2011 12:21, Elvio Barbalho <address@hidden>escreveu:
> Oiiii, Jose Edson a abordagem
>
> awk -F'\n' '{printf $0" "} END {printf "\n"}' arquivo.txt | grep "set
> control n" | awk -F'set control n' '{print NF - 1}'
>
> funcionou perfeitamente para arquivos pequenos. para um arquivo maior deu
> o seguinte erro.
>
> awk: record `0010* --------------...' too long
>
> já a segunda
>
> grep -A 1 -B 1 control arquivo.txt | awk -F'\n' '{printf $0" "} END {printf
> "\n"}' | sed "s/set control n/\nset control n\n/g" | grep "set control n" |
> wc -l
>
> não funciona aqui pois na versão do grep no Unix que estou usando não
> possui todas essas opções ai.
>
> segue um exemplo de arquivo que deu problema no too long.
>
> 0010*
> ----------------------------------------------------------------------
> 0020* STARTUP SO SISTEMA DE GERENCIAMENTO DE MANUTENCAO PREDIAL
> 0030* ANALISTA: YARLE - MAI/2000 - ITI-1
> 0040* AAP50000
> 0050* MANUTENCAO:
> 0060* ---------------------------------------------------------------------
> 0070DEFINE DATA LOCAL USING AAP5NIS
> 0080LOCAL
> 009001 #NOME-TITULO (A50)
> 010001 #VERSAO (A1/2)
> 0110INDEPENDENT
> 012001 +NOME-SISTEMA (A50)
> 013001 +PGM-NAT (A8)
> 014001 +START (A01)
> 0150END-DEFINE
> 0160*
> 0170FETCH RETURN 'AAP5900S' /* CARREGA INDEPENDENTES E FUNCOES USUARIOS
> 0180*
> 0190IF *DEVICE = 'BATCH'
> 0200 WRITE *PROGRAM 'PROCESSAMENTO BATCH - DESVIO PROGRAMADO'
> 0210 STOP
> 0220END-IF
> 0230*
> 0240***********************************************************
> 0250* IF NOT(*USER = 'R16484' OR= 'BMAN000R' OR= 'R23000' OR= 'N60484')
> 0260* SET CONTROL 'WL49C18B04/18F'
> 0270* INPUT ' ATENCAO' (I)
> 0280* // 'ESTE SISTEMA ESTARA INDISPONIVEL A PARTIR'
> 0290* // 'DE 18:00 HORAS DO DIA 28/06 (SEXTA-FEIRA)'
> 0300* // 'COM RETORNO PREVISTO PARA AS 08:00 HORAS'
> 0310* // ' DO DIA 03/07 (QUARTA-FEIRA), PARA SUA '
> 0320* // ' ADEQUACAO AO PADRAO MULTI-ESTADO.'
> 0330* /// ' PF12-SAI '
> 0340* SET CONTROL 'WB'
> 0350*
> 0360* TERMINATE
> 0370* END-IF
> 0380***********************************************************
> 0390FORMAT PS=60 LS=132
> 0400*
> 0410SET KEY PF1 PF2 PF3 PF4 PF5 PF6 PF7 PF8 PF9 PF10 PF11 PF12 = PGM
> 0420*
> 0430MOVE ' MENU PRINCIPAL ' TO #NOME-TITULO
> 0440MOVE *PROGRAM TO NIS-PROGRAMA
> 0450 NIS-PROG-RETORNO
> 0460RESET #VERSAO(*)
> 0470*
> 0480IF +START NE '1'
> 0490 MOVE '1' TO +START
> 0500 IF +PGM-NAT = 'NATBATES'
> 0510 INPUT USING MAP 'AAP5000C'
> 0520 IF *PF-KEY = 'PF11'
> 0530 FETCH 'MAN0PFT1'
> 0540 END-IF
> 0550 IF #VERSAO(1) NE 'X' AND #VERSAO(2) NE 'X'
> 0560 REINPUT 'Marque um <X> na opcao desejada' MARK *#VERSAO(1)
> 0570 END-IF
> 0580 IF #VERSAO(1) NE ' ' AND #VERSAO(2) NE ' '
> 0590 REINPUT 'Selecione somente uma opcao' MARK *#VERSAO(1)
> 0600 END-IF
> 0610 IF #VERSAO(1) = 'X'
> 0620 STACK TOP COMMAND 'AAP1100P'
> 0630 STACK TOP COMMAND 'LOGON PREDIO'
> 0640 STOP
> 0650 ELSE
> 0660 IF NOT(+TAB-FUNCAO(1) = 1 OR +TAB-FUNCAO(2) = 1)
> 0670 REINPUT
> 0680 'Aplicacao restrita inicialmente a usuarios master ou sub-master'
> 0690 ALARM
> 0700 END-IF
> 0710 END-IF
> 0720 END-IF
> 0730 INPUT USING MAP 'AAP5000B'
> 0740 IF *PF-KEY = 'PF11'
> 0750 FETCH 'MAN0PFT1'
> 0760 END-IF
> 0770END-IF
> 0780*
> 0790INPUT USING MAP 'AAP5000A'
> 0800PERFORM NAVEGACAO-NIS
> 0810*
> ----------------------------------------------------------------------
> 0820DEFINE SUBROUTINE NAVEGACAO-NIS
> 0830*
> ----------------------------------------------------------------------
> 0840MOVE LEFT NIS-COMANDO TO NIS-COMANDO
> 0850*
> 0860DECIDE FOR FIRST CONDITION
> 0870 WHEN *PF-KEY = 'PF1'
> 0880 REINPUT USING HELP MARK *NIS-COMANDO
> 0890 WHEN *PF-KEY = 'PF10'
> 0900 STACK COMMAND 'RETURN'
> 0910 STOP
> 0920 WHEN *PF-KEY = 'PF11' OR NIS-COMANDO = '.'
> 0930 FETCH 'MAN0PFT1'
> 0940 WHEN *PF-KEY = 'PF12'
> 0950 CALL 'LOGOFF'
> 0960 WHEN NIS-COMANDO NE ' '
> 0970 CALLNAT 'NISV2' NIS-PARAMETROS
> 0980 WHEN NONE
> 0990 REINPUT 'INFORME CODIGO DA FUNCAO OU COMANDO DIRETO VALIDOS'
> 1000 ALARM
> 1010END-DECIDE
> 1020END-SUBROUTINE
> 1030*
> ----------------------------------------------------------------------
> 1040END
>
>
> Elvio Barbalho
> Brasília, DF
> Brasil
>
> C + 55 11 82696525
> C + 55 61 81751213
> address@hidden
>
>
>
>
> Em 15 de março de 2011 20:23, Jose Edson Moreno Jr <address@hidden
> > escreveu:
>
> Oi Elvio,
>>
>> Bom imagino que queira contar o numero de ocorrencia "set control n",
>> uma maneira seria pegar parte da palavra que esta contida na string e contar
>> o numero de ocorrencia, algo como :
>>
>> grep control arquivo.txt | wc -l
>>
>> Porém isto somente funcionaria se esta palavra somente ocorresse na
>> string, uma outra maneira seira fazer a contagem de campos apos a
>> normalizacao, ou em outras palavras a eliminação do final de linha, assim :
>>
>> awk -F'\n' '{printf $0" "} END {printf "\n"}' arquivo.txt | grep "set
>> control n" | awk -F'set control n' '{print NF - 1}'
>>
>> Supondo, que seu arquivo contenha centenas de variações e no meio esta
>> string , uma maneira de tratar para não ficar uma linha enorme seria assim :
>>
>> grep -A 1 -B 1 control arquivo.txt | awk -F'\n' '{printf $0" "} END
>> {printf "\n"}' | sed "s/set control n/\nset control n\n/g" | grep "set
>> control n" | wc -l
>>
>> Como vê, existe diversa maneiras de ataca o problema, somente é
>> necessário ver qual será o tipo de restrição, talves, tenha ate outra
>> maneiras mais simples, mas seria uma real analise do arquivo que contera a
>> ocorrencia, os modos que pode ocorrer e assim determinar um meio mais fácil
>> ... mas acredito que estas maneiras devam atender a sua necessidade (a
>> ultima é uma melhoria do que já passei para você e muito mais abrangente) ..
>> Att.
>>
>> Edson
>>
>> Em 15 de março de 2011 11:36, Elvio Barbalho <address@hidden>escreveu:
>>
>>>
>>>
>>> Jose Edson bom dia sua dica funcionou, entretanto depois deparei me com
>>> outro problema preciso contar o número de ocorrências desta string e
>>> utilizando o grep em conjunto com o wc -l sempre retorna 1 pois temos
>>> mente
>>> uma unica linha. Se puder ajudar agradeço.
>>>
>>>
>>> Elvio Barbalho
>>> Brasília, DF
>>> Brasil
>>>
>>> address@hidden
>>>
>>> Em 14 de março de 2011 13:19, Jose Edson Moreno Jr
>>> <address@hidden>escreveu:
>>>
>>>
>>> > Bom dia Elvio,
>>> >
>>> > Normalize a entrada e depois faça o teste , um meio de fazer isso :
>>> >
>>> > awk -F'\n' '{printf $0" "} END {printf "\n"}' /arquivo.txt | grep "set
>>> > control n"
>>> > if [ $? -eq 0 ]; then
>>> > echo "String OK "
>>> > fi
>>> >
>>> > agora se deseja utilizar regex, segue a regex para o seu padrão :
>>> > (set)[\ |\n](control)[\ |\n]n
>>> >
>>> > Att.
>>> >
>>> > Em 14 de março de 2011 11:18, Elvio Barbalho <address@hidden
>>> > >escreveu:
>>> >
>>> > >
>>> > >
>>> > > Bom dia senhores, tenho que validar uma determinada string dentro de
>>> um
>>> > > arquivo, até ai nada complicado.
>>> > >
>>> > > A string a ser validada é essa "set control n" entretanto ela pode
>>> ter
>>> > > algumas variações por exemplo:
>>> > >
>>> > > set control
>>> > > n
>>> > > ----------------------------
>>> > > set
>>> > > control n
>>> > > ----------------------------
>>> > > set
>>> > > control
>>> > > n
>>> > > ----------------------------
>>> > >
>>> > > como podemos ver parte dessa string pode ou não estar em outra linha
>>> > dentro
>>> > > do arquivo, mas necessariamente seguindo essa ordem ai.
>>> > >
>>> > > Poderiam me ajudar a criar um expressão regular para verificar se
>>> essa
>>> > > string esta ou não presente dentro do arquivo?????
>>> > >
>>> > > Elvio Barbalho
>>> > > Brasília, DF
>>> > > Brasil
>>> > >
>>> > > address@hidden
>>> > >
>>> > > [As partes desta mensagem que não continham texto foram removidas]
>>> > >
>>> > >
>>> > >
>>> >
>>> >
>>> >
>>> > --
>>> > Jose Edson Moreno Jr.
>>>
>>> >
>>> >
>>> > [As partes desta mensagem que não continham texto foram removidas]
>>> >
>>> >
>>> >
>>> > ------------------------------------
>>>
>>> >
>>> > ----------------------------------------------------------
>>> > Esta lista não admite a abordagem de outras liguagens de programação,
>>> como
>>> > perl, C etc. Quem insistir em não seguir esta regra será moderado sem
>>> prévio
>>> > aviso.
>>> > ----------------------------------------------------------
>>> > Sair da lista: address@hidden
>>> > ----------------------------------------------------------
>>> > Esta lista é moderada de acordo com o previsto em
>>> > http://www.listas-discussao.cjb.net
>>> > ----------------------------------------------------------
>>> > Servidor Newsgroup da lista: news.gmane.org
>>> > Grupo: gmane.org.user-groups.programming.shell.brazil
>>> >
>>> > Links do Yahoo! Grupos
>>>
>>> >
>>> >
>>> >
>>>
>>> [As partes desta mensagem que não continham texto foram removidas]
>>>
>>>
>>>
>>
>>
>>
>> --
>> Jose Edson Moreno Jr.
>>
>
>
--
Jose Edson Moreno Jr.
[As partes desta mensagem que não continham texto foram removidas]
- Re: [shell-script] validação de string, (continued)
- Re: [shell-script] validação de string, Elvio Barbalho, 2011/03/15
- Re: [shell-script] validação de string, Jose Edson Moreno Jr, 2011/03/15
- Re: [shell-script] validação de string, Elvio Barbalho, 2011/03/16
- Re: [shell-script] validação de string, Eri Ramos Bastos, 2011/03/16
- Re: [shell-script] validação de string, Elvio Barbalho, 2011/03/16
- Re: [shell-script] validação de string, Eri Ramos Bastos, 2011/03/16
- Re: [shell-script] validação de string, Elvio Barbalho, 2011/03/16
- Re: [shell-script] validação de string, Eri Ramos Bastos, 2011/03/16
- Re: [shell-script] validação de string, Elvio Barbalho, 2011/03/16
- Re: [shell-script] validação de string, Wagner Macedo, 2011/03/16
- Re: [shell-script] validação de string,
Jose Edson Moreno Jr <=
- Re: [shell-script] validação de string, Elvio Barbalho, 2011/03/16
Re: [shell-script] validação de string, Tiago Peczenyj, 2011/03/15