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 12:21:26 -0300

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


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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