shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] validação de string


From: Elvio Barbalho
Subject: Re: [shell-script] validação de string
Date: Wed, 16 Mar 2011 16:04:56 -0300

Jose Edson, obrigado pela força que tem dado, mas infelizmente ainda deu
erro nos parâmetros que foram passados para o grep


bash-3.00$ grep -i -e set -e control -e \'*\' AAP50000.21  | 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}'
grep: illegal option -- e
Usage: grep -hblcnsviw pattern file . . .



Elvio Barbalho
Brasília, DF
Brasil

C + 55 11 82696525
C + 55 61 81751213
address@hidden




Em 16 de março de 2011 15:47, Jose Edson Moreno Jr
<address@hidden>escreveu:

> 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]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]