O comando “grep -w” não está funcionando

2

Eu tenho a entrada abaixo:

csdi_d_trs_proc_uxs1        26 24
csdi_d_tdp_process_uxs1     28 32

Eu só preciso da linha que contém proc . Quando eu uso:

grep proc filename 

ambas as linhas são geradas, então eu tentei usar grep -w proc filename , mas nenhuma saída está sendo exibida.

Como posso obter a linha que tem apenas proc , mas não process ?

    
por Nithin Kumar 15.06.2017 / 09:44

2 respostas

10

O sinalizador -w para grep fará com que a expressão especificada corresponda apenas a palavras inteiras.

Uma "palavra" é uma cadeia de "caracteres de palavra", rodeada por "caracteres que não são de palavras" (ou início / fim de linha).

O problema no seu caso é que _ (sublinhado) passa a ser um "caractere de palavra" e, portanto, não serve para delimitar a palavra proc como uma palavra por si só.

Em vez de usar -w com grep , use um padrão que delimite explicitamente a palavra por _ :

grep '_proc_' filename

Como alternativa, use [^a-z] em vez de _ se você quiser delimitar a palavra por qualquer coisa que não seja um caractere alfabético minúsculo:

grep '[^a-z]proc[^a-z]' filename

Observe que isso não reconhecerá proc como uma palavra no início / final de uma linha.

    
por 15.06.2017 / 10:34
4

-w, --word-regexp Select only those lines containing matches that form whole words. [...] Word-constituent characters are letters, digits, and the underscore.

O sublinhado é válido como parte de um identificador na maioria das linguagens de programação (pelo menos C, Perl, shell), o que provavelmente é o motivo de ser considerado um "caractere de palavra" aqui.

Uma forma de corresponder apenas a palavra seria usar os testes de look-ahead e look-behind negativos que os regexes Perl fornecem. Aqui (?<![a-z]) significa "não precedido por um caractere minúsculo e (?![a-z]) similarmente pelo que vem depois. O início e o final da linha não são caracteres minúsculos, portanto, isso corresponderá a proc mesmo no início:

pcregrep '(?<![a-z])proc(?![a-z])' filename 

Ou com um ERE do grep, considerando o início e o fim de uma linha explicitamente:

grep -E '(^|[^a-z])proc([^a-z]|$)' filename

(não sei qual deles é mais bonito).

Se você tem texto em idioma natural, [[:alpha:]] pode estar mais correto do que [a-z] .

Mas, é claro, apenas o grepping para _proc_ é mais fácil, se você souber que os sublinhados estarão lá.

    
por 15.06.2017 / 13:10

Tags