Por que dois comandos greet quase ideticos retornam uma saida diferente: sem o e com o nome do arquivo

6

Eu tenho 2 grep s quase idênticas:

[Alex@localhost tmp]$ grep /bin/bash /etc/passwd 
root:x:0:0:root:/root:/bin/bash
AlexL:x:500:500::/home/AlexL:/bin/bash
user1:x:501:501:user1 12345:/home/user1:/bin/bash

vs.

[AlexL@localhost tmp]$ grep /bin/*sh /etc/passwd    
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:AlexL:x:500:500::/home/AlexL:/bin/bash
/etc/passwd:user1:x:501:501:user1 12345:/home/user1:/bin/bash

Na segunda consulta, recebi o prefixo do nome de arquivo para cada correspondência de linha. Eu sei que para obter o mesmo resultado eu preciso colocar a opção -h no 2º grep , mas minha pergunta é:

Por que eles retornam resultados diferentes? Devo acrescentar algo mais?

A tarefa consiste em recuperar de /etc/passwd usuários reais (sem daemons e usuários do sistema).

Usado: CentOS 6.4, grep gnu versão 2.6.3

    
por ALZ 23.11.2013 / 17:26

2 respostas

11

Seu shell expande /bin/*sh . Então, o que você está realmente fazendo é

grep /bin/bash /bin/dash /bin/rbash /bin/rzsh /bin/sh /bin/zsh /etc/passwd

Ou seja, pesquise a string /bin/bash nos arquivos /bin/dash , /bin/rbash , /bin/rzsh , /bin/sh , /bin/zsh e /etc/passwd .

(compare com a saída de echo /bin/*sh /etc/passwd .)

Como há vários arquivos para pesquisar, grep informa em qual deles a string foi inserida.

O que você deseja é citar seu termo de pesquisa, portanto, ele não é expandido pelo shell e usar uma expressão regular adequada:

grep '/bin/.*sh' /etc/passwd
    
por 23.11.2013 / 17:39
0

Aproximadamente, para o que você precisa, você pode usar (-v):

➜  TestZone  sudo grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
me:x:1000:1000:me:/home/me:/bin/zsh
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash

Grep was originally developed for the Unix operating system, but is available today for all Unix-like systems. Its name comes from the ed command g/re/p (globally search a regular expression and print), which has the same effect: doing a global search with the regular expression and printing all matching lines.

Fonte: wiki / Grep

    
por 24.11.2013 / 07:02