Copie uma string que ocorre antes de um padrão específico.

-1

Devo copiar este emuEventTrapInformative abaixo.

-- Traps
   emuEventTrapInformative TRAP-TYPE
        ENTERPRISE compaq
        VARIABLES  { scellNameDateTime,
                     shelfId,
                     shelfElementType,
                     shelfElementNum,
                     shelfErrorCode }

O que eu quero fazer é que eu procure pela primeira instância de TRAP-TYPE em um arquivo e copie tudo antes dela dentro da própria linha.

emuEventTrapInformative irá variar de arquivo para arquivo
Usando qualquer coisa sed / grep / awk.

    
por SamFlynn 18.06.2015 / 13:11

4 respostas

4

Usando awk

$ awk '/TRAP-TYPE/ {print $1; exit}' foo

Nota

Isso só funcionará se houver apenas um único campo antes de TRAP-TYPE como no caso de OPs

Exemplo

$ cat foo
sCSISmart5  TRAP-TYPE
    ENTERPRISE  cyclone
    VARIABLES {cycHostAdapterNumber, cycHostAdapterID, cycManagerID}
    DESCRIPTION
    "The HostAdapter# %d has new HostAdapter Id %s and Manager Id %s"
    --#TYPE "Host Adapter changed"
    --#SUMMARY "The HostAdapter# %d has new HostAdapter Id %s and Manager Id %s"
    --#ARGUMENTS {0,1,2}
    --#SEVERITY CRITICAL
    --#TIMEINDEX 100
    --#STATE OPERATIONAL
    --#HELP "scsismrt.hlp"
    --#HELPTAG 109
::=  109

--This Trap is issued when a Host adapter fails.

sCSISmart6  TRAP-TYPE
    ENTERPRISE  cyclone
    VARIABLES {cycHostAdapterNumber}
    DESCRIPTION
    "The HostAdapter# %d has Failed"
    --#TYPE "Host adapter failed"
    --#SUMMARY "The HostAdapter# %d has Failed"
    --#ARGUMENTS {0}
    --#SEVERITY CRITICAL
    --#TIMEINDEX 100
    --#STATE OPERATIONAL
    --#HELP "scsismrt.hlp"
    --#HELPTAG 110
::=  110

$ awk '/TRAP-TYPE/ {print $1; exit}' foo
sCSISmart5
    
por A.B. 18.06.2015 / 13:28
4

Você pode usar grep :

$ grep -m 1 TRAP-TYPE file
   emuEventTrapInformative TRAP-TYPE

O -m 1 informa grep para sair após a primeira correspondência. Para obter apenas a parte emuEventTrapInformative , você pode excluir apenas TRAP-TYPE e qualquer espaço em branco anterior:

$ grep -m 1 TRAP-TYPE file | sed 's/ *TRAP-TYPE//'
   emuEventTrapInformative

Como alternativa, você pode usar uma lookahead :

$ grep -Pom 1 '.*(?=TRAP-TYPE)' file 
   emuEventTrapInformative 

A -o informa grep para imprimir apenas a parte correspondente da linha e a -P ativa Expressões regulares compatíveis com Perl que suportam lookaheads.

    
por terdon 18.06.2015 / 13:56
2

Aqui está uma versão sed :

sed -n 's/TRAP-TYPE//p' inp-file.txt

Para o exemplo que você forneceu, a saída é:

sed -n 's/TRAP-TYPE//p' inp-file.txt                                        
emuEventTrapInformative 

Em sua pergunta original, você solicitou a primeira ocorrência de TRAP-TYPE em um arquivo. Se você tiver mais de uma intance sed -n 's/TRAP-TYPE//p' | head -n1 fará o truque

Aqui está outra versão que extrai múltiplas strings (apenas no caso de você precisar de um, nunca), se você tiver mais de uma instância de TRAP-TYPE no arquivo.

$ awk 'BEGIN {RS="TRAP-TYPE"} NR>1{ print previous } {previous=$NF}' inp-file.txt                                                     
emuEventTrapInformative
someOtherString

Explicação :

RS é o separador de registros. Nós dividimos todo o texto em registros, usando o TRAP-TYPE como string, depois imprimimos o último item antes do separador. O problema é que o último registro termina com chave. Então, para evitar isso, usamos NR>1{print previous}{previous=$NF} construct para que possamos ignorar a última linha.

Meu arquivo inp.txt

-- Traps
   emuEventTrapInformative TRAP-TYPE
        ENTERPRISE compaq
        VARIABLES  { scellNameDateTime,
                     shelfId,
                     shelfElementType,
                     shelfElementNum,
                     shelfErrorCode }

-- Traps
   someOtherString TRAP-TYPE
        ENTERPRISE compaq
        VARIABLES  { scellNameDateTime,
                     shelfId,
                     shelfElementType,
                     shelfElementNum,
                     shelfErrorCode }
    
por Sergiy Kolodyazhnyy 18.06.2015 / 14:02
1

E aqui está uma versão do Perl:

< inputfile perl -ne 's/^ +(.*) +TRAP-TYPE/$1/&&print'
  • -n : coloca um loop while (<>) {[...]} ao redor do script
  • -e : lê o script dos argumentos

Divisão do comando Perl:

  • s : afirma para executar uma substituição
  • / : inicia o padrão
  • ^ : corresponde ao início da linha
  • + : corresponde a um ou mais caracteres
  • (.*) : corresponde e agrupa qualquer número de qualquer caractere antes de um ou mais caracteres
  • TRAP-TYPE : corresponde a uma TRAP-TYPE string
  • / : interrompe o padrão / inicia a sequência de substituição
  • $1 : substitui pelo grupo capturado
  • / : interrompe a string de substituição / inicia os modificadores
por kos 18.06.2015 / 17:29