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



reply via email to

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