comando: ls / etc | classificar | grep d * não está produzindo resultados, mas ls / etc | classificar | grep p * lista o diretório inteiro

5

Estou brincando com piping e grep hoje à noite. Eu sei que grep usa regex e que * significa 0 ou mais ocorrências do caractere anterior. Então, a maneira que eu entendo é que, se eu fizer o seguinte comando, o diretório inteiro deve estar listado ... mas nada é listado. Tudo o que acontece é a redefinição da linha de comando:

[root@LinuxAcademy etc]# ls /etc | sort | grep d*
[root@LinuxAcademy etc]#

No entanto, se eu fizer o comando novamente e substituir d por p, todo o diretório será listado como seria de esperar:

[root@LinuxAcademy ~]# ls /etc | sort | grep p*
ConsoleKit
DIR_COLORS
DIR_COLORS.256color
DIR_COLORS.lightbgcolor
NetworkManager
X11
...........<<rest of listing not pasted in>>

Mesmo que nenhum erro tenha sido dado quando eu usei o grep d *, eu redirecionei o stderr para um arquivo apenas para verificar e nada foi impresso.

Eu então pensei que o grep poderia estar interpretando o 'd' no 'grep d *' como uma opção ou comando ... mas esse não parece ser o caso também.

Alguém pode me ajudar a entender o que está acontecendo e porque quando eu uso o comando com

grep d*

nada está listado?

    
por Brad Harris 09.08.2014 / 03:56

1 resposta

10

Uma expressão regular não é uma glob.

Eu estou supondo que você quer arquivos que começam com "d". Nesse caso, você precisa:

ls /etc | sort | grep '^d'

O que deu errado

Como a seguinte declaração se comporta depende dos arquivos no diretório atual:

ls /etc | sort | grep p*

Como está sem aspas, o shell tentará expandir o glob p* , substituindo-o pelos nomes de arquivos do diretório atual .

Se nenhum nome de arquivo corresponder, então um literal p* será passado para grep . Como grep espera expressões regulares, ele interpreta p* para significar zero ou mais ocorrências da letra p . Como tudo tem um p ou não, que corresponde a tudo .

Por que grep d* não lista nada?

Isso provavelmente significa que havia um nome de arquivo começando com d no diretório atual. Só para ser específico, digamos que o nome do arquivo seja dichotomy . O shell expande d* para dichotomy e passa isso como o argumento para grep . Assim, o comando efetivo é:

grep dichotomy

É provável que não tenha havido resultados quando você executou grep d* .

O que acontece se vários arquivos corresponderem ao d* glob?

Considere o comando:

grep d*

Se houver vários arquivos correspondentes a esse glob, diga dmesg daemon.log e dpkg.log . O shell expandiria d* para a lista desses arquivos em ordem alfabética (que depende da sua localidade). Isso pode resultar em:

grep daemon.log dmesg dpkg.log

Este comando procura a presença da string daemon.log nos arquivos dmesg e dpkg.log . Se essa sequência não ocorrer nesses arquivos, não haverá resultados de saída.

    
por 09.08.2014 / 04:02