grep e []

10

Estou aprendendo o código bash e hoje estou estudando o comando grep .

se eu correr

$ ps -fU user | grep thunderbird

terminal

mostra:

user  17410     1  0 10:09 ?        00:00:20 /usr/lib/thunderbird/thunderbird
user  18990 15896  0 12:25 pts/1    00:00:00 grep --color=auto thunderbird

Mas se eu correr:

$ ps -fU user | grep [t]hunderbird
terminal

mostra:

user  17410     1  0 10:09 ?        00:00:20 /usr/lib/thunderbird/thunderbird

por quê? Eu li o guia, mas não entendi.

    
por linofex 07.11.2015 / 13:54

4 respostas

14

Existem dois problemas aqui. Primeiro, quando você executa ps | grep ... , o processo grep também é mostrado na saída de ps . A saída ps padrão inclui os argumentos com os quais um processo foi iniciado e não apenas o nome do processo. Isso significa que, se você executar grep foo e houver um processo em execução chamado foo , haverá dois ps de resultados correspondentes a foo : o foo process e o grep em si, pois está pesquisando %código%. É por isso que você obtém duas linhas ao executar foo .

Agora, o ps -f | grep thunderbird é uma construção de expressão regular que define uma lista de caracteres, uma classe de caracteres. Por exemplo, [ ] corresponderá a [abc] ou a ou b . Quando você executa c , essa classe contém apenas um único caractere, portanto, é equivalente a ps -f | grep [t]hunderbird sem os colchetes. No entanto, o processo thunderbird foi lançado com grep como argumento desta vez, e não [t]hunderbird . Portanto, sua linha na saída de thunderbird conterá ps . Será assim:

terdon   23101 10991  0 16:53 pts/3    00:00:00 grep --color [t]hunderbird

Isso significa que não é correspondido quando você executa [t]hunderbird , pois contém ps -f | grep thunderbird e não [t]hunderbird .

Este é um truque comum para evitar a correspondência do processo thunderbird ao executar grep . Outra alternativa é executar ps | grep para excluir o ps -f | grep foo | grep -v grep . A melhor abordagem, no entanto, é usar um programa projetado especificamente para isso, grep :

$ pgrep -l thunderbird
11330 thunderbird
    
por terdon 07.11.2015 / 15:57
6

No primeiro caso, você está procurando por qualquer processo com a palavra thunderbird. Existem dois comandos thunderbird e grep.

No segundo, você também está procurando pelo caracter t seguido por hunderbird , já que o [t] corresponde a todos os caracteres listados no colchete do qual há apenas um, a letra t, mas desta vez seus dois processos são

user  17410     1  0 10:09 ?        00:00:20 /usr/lib/thunderbird/thunderbird
user  18990 15896  0 12:25 pts/1    00:00:00 grep --color=auto [t]hunderbird

O segundo processo não corresponde porque o rexep [t] hunderbird não corresponde à string literal [t]hunderbird porque o] impede a correspondência.

    
por Robert Longson 07.11.2015 / 14:14
3

Primeiramente, se grep --color=auto thunderbird aparecerá na tabela de processos e, portanto, na saída de ps , depende do tempo, ou seja, quão ocupado é o seu sistema & amp; quanto tempo leva para que ps mostre algo em sua saída (analisando a tabela de processos) que foi iniciado simultaneamente, grep neste caso. Embora este seja um caso altamente improvável e podemos assumir que grep aparecerá na saída de ps .

Agora, [] é uma sintaxe do grep, o que significa que (se não for seguido por outros tokens) corresponde a qualquer um dos caracteres dentro de [] . Portanto, quando você usa grep '[t]hunderbird' , grep trata o [t] para corresponder apenas a t , como resultado, ele não apareceria na saída.

Enquanto estiver usando grep thunderbird , se chegar na tabela do processo, encontraremos o processo grep na saída, pois estamos grep -ping para a mesma coisa, ou seja, grep thunderbird .

Observe também que grep é um alias para grep --color=auto , fazendo com que ele apareça na saída também.

    
por heemayl 07.11.2015 / 14:21
1

O [] em grep é usado para correspondência de caracteres. Se tomarmos      grep [tb]all my_file.txt

É equivalente a

grep tall my_file.txt
grep ball my_file.txt

Ele executará grep com t + all e então executará grep tomando b + all.

Por exemplo: Se quisermos procurar por uma palavra ABC ou BBC em um arquivo, podemos usar o seguinte comando grep:

grep [AB]BC file_name 

Aqui o [] fará com que grep expanda a palavra tomando A, então ela expandirá a palavra usando B, criando assim ABC e BBC.

    
por Bidyut 07.11.2015 / 14:47