Grep o texto que corresponde a um padrão

4

Eu estava procurando por um comando que irá imprimir a parte selecionada de uma linha que corresponda às condições. Por exemplo, minha linha de texto é assim:

p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X

Eu quero imprimir os valores que têm Y . Com este exemplo, o resultado esperado é p2,p6 .

    
por Peter 28.07.2015 / 11:59

6 respostas

7

Uso da expressão regular compatível com P erl em grep :

grep -Po '..(?==Y)' <file

Resultado:

p2
p6
    
por 28.07.2015 / 12:15
3

Tente isto:

echo 'p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X' | grep -o '[^|]*=Y' | cut -d= -f1 | sed -e 'N;s/\n/,/g'

Saída:

p2,p6
    
por 28.07.2015 / 12:08
2

awk pode ler registros com base em um delimitador regex de sua escolha. Por exemplo, '[|\n]'
Ele também pode dividir registros em campos no delimitador de sua escolha. por exemplo. '='
O operador ternário (condition)?: impede uma vírgula principal.

awk -F= -vRS='[|\n]' '$2=="Y"{ printf (i?",":"")"%s", $1; i=1 }'

saída:

p2,p6

Se uma nova linha for necessária, ela poderá ser anexada na seção END{} . Para evitar que uma nova linha seja emitida quando não há correspondências, o Separador do Registro de Saída ( ORS ) pode ser inicialmente definido como nenhum e, em seguida, definido como \n se uma correspondência for encontrada.

awk -F= -vRS='|' -vORS= '$2=="Y"{printf (ORS?",":"")"%s", $1; ORS="\n"} END{print ""}'
    
por 28.07.2015 / 13:01
2

Que tal:

tr '|' '\n' | sed -n 's/=Y$//p'
    
por 28.07.2015 / 17:43
1

um simples awk

awk -F\| '{for (i=1 ; i<= NF; i++) 
    if ( $i ~/Y/ ) { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}}'

onde

  • -F\| use | como separador
  • {for (i=1 ; i<= NF; i++) varre o padrão
  • if ( $i ~/Y/ ) se encontrado
  • { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;} dividi-lo e imprimi-lo

saída

in 3 : p2
in 11 : p6

use printf "%s\n",A[1] para pular o número do padrão

    
por 28.07.2015 / 12:10
1
perl -nE 'say join(",",/(\w+)=Y/g)'
    
por 28.07.2015 / 17:13