Como comandar o grep para não exibir a string pesquisada? [duplicado]

6

Eu quero imprimir uma parte de uma linha em um arquivo. A linha inteira parece assim.

Path=fy2tbaj8.default-1404984419419

Eu quero imprimir apenas os caracteres após Path= . Eu tentei grep Path filename | head -5 . Mas não está funcionando. Ele ainda mostra toda a linha. Como posso fazer isso?

    
por Anandu M Das 29.09.2014 / 16:37

6 respostas

11

você pode usar o comando cut para essa finalidade.

grep Path filename |cut -c6-

Aqui, a opção -c6- significa imprimir do 6º ao último caractere.

    
por g_p 29.09.2014 / 16:44
29

Você pode usar grep e apenas grep :

grep -oP "(?<=Path=).*" file

Explicação :

De man grep :

   -o, --only-matching
          Print only the matched (non-empty) parts of a matching line,
          with each such part on a separate output line.
   -P, --perl-regexp
          Interpret PATTERN as a Perl compatible regular expression (PCRE)

O lookbehind (?<=Path=) afirma que na posição atual na string, o que precede são os caracteres% código%. Se a afirmação for bem-sucedida, o mecanismo corresponderá ao padrão de resolução.

Para a sintaxe de expressões regulares do Perl 5, leia a página de manual de expressões regulares do Perl .

    
por Sylvain Pineau 29.09.2014 / 17:08
6

A solução awk é o que eu usaria, mas um processo um pouco menor é sed e pode produzir os mesmos resultados, mas substituindo a parte PATH da linha por "" , ou seja

  sed -n 's/^Path=//p' file

O comportamento padrão -n substitui sed s de "imprimir todas as linhas" (por isso, -n = sem impressão), e para imprimir uma linha, adicionamos o caractere p após a subestação. Apenas linhas onde a substituição acontece serão impressas.

Isso lhe dá o comportamento que você pediu, de grep ing para uma string, mas removendo a parte Path= da linha.

Se, por comentários de David Foerster, você tiver um arquivo grande e desejar parar o processamento assim que tiver correspondido e imprimido a primeira correspondência com 'Path =', poderá dizer ao sed para sair, com o comando q . Observe que você precisa torná-lo um grupo de comando cercando ambos em { ..} e separando cada comando com ; . Então o comando aprimorado é

sed -n 's/^Path=//{p;q;}' file

IHTH

    
por shellter 29.09.2014 / 16:57
5

grep greps uma linha de texto e a exibe. head exibe as primeiras linhas de texto n , não caracteres.

Você está procurando sed ou awk :

awk '{print }' FS='='

Isso define = como um separador de campo e imprime o segundo campo.

    
por Jan 29.09.2014 / 16:43
5

Com o GNU grep:

$ echo Path=fy2tbaj8.default-1404984419419 | grep -oP '(Path=)\K.*'
fy2tbaj8.default-1404984419419

\K mantém as coisas restantes de \ K, não inclua em $& .

    
por cuonglm 29.09.2014 / 19:03
1

Claro que a solução é usar grep -Po .

Vamos adicionar outras soluções para completar:

  • com cut , definindo o delimitador como = :

    cut -d'=' -f2 file
    
  • Pode ser um pouco arriscado, mas você também pode originar o arquivo, para que $Path contenha o código valor.

    source file
    echo "$Path"
    

Teste

$ cat a
this=aaabbccc
that=dddeee
$ source a
$ echo "$this"
aaabbccc
$ echo "$that"
dddeee

Conforme comentários, veja como source apenas parte do arquivo:

$ cat a
Path=22
Path=33
$ source a
$ echo $Path
33
$ source <(head -1 a)
$ echo $Path
22
    
por fedorqui 29.09.2014 / 17:25