Pesquisar em uma pesquisa

3

Eu me acostumei a usar grep para minhas pesquisas de linha de comando e queria saber como fazer uma pesquisa com êxito usando o resultado de outra pesquisa.

Aqui está minha tentativa, onde estou procurando por "ferramenta" dentro do meu resultado:

grep tool | grep -rl embed=

Isso retorna alguns resultados e, em seguida, o console trava. Existem soluções simples / elegantes para isso?

    
por darkace 11.04.2016 / 18:44

4 respostas

6

são executados da esquerda para a direita. Mais precisamente, os processos são executados em paralelo, mas os dados fluem da esquerda para a direita: a saída do comando à esquerda torna-se a entrada do comando à direita.

Aqui, o comando à esquerda é grep tool . Como você está passando um único argumento para grep , ele está pesquisando em sua entrada padrão. Como você não redirecionou a entrada padrão, grep está lendo no terminal: está aguardando que você digite.

Para pesquisar em um arquivo, use

grep tool path/to/file | …

Para pesquisar em um diretório recursivamente, use

grep -r tool path/to/directory | …

Você pode filtrar os resultados para listar somente as linhas que contêm embed= . Elimine as opções -l e -r , elas não fazem sentido quando a entrada é proveniente da entrada padrão.

grep -r tool path/to/directory | grep 'embed='

Isso lista linhas contendo tool e embed= (em qualquer ordem). Um método alternativo com encanamento mais simples seria fazer uma única pesquisa com um ou padrão; isso é sempre possível, mas se os padrões puderem se sobrepor (não é o caso aqui), o padrão pode ficar muito complicado.

grep -E -r 'tool.*embed=|embed=.*tool' path/to/directory

Se você quisesse listar arquivos contendo tool e embed= , você precisaria de uma estrutura de comando diferente, com os primeiros grep listando nomes de arquivos ( -l ) e o segundo recebendo esses nomes de arquivos como argumentos , não como entrada. Convertendo entradas padrão em argumentos de linha de comando para o comando xargs .

grep -lZ -r tool path/to/directory | xargs -0 grep -l 'embed='
    
por 12.04.2016 / 01:43
4

Este comando irá procurar foo no arquivo filename e nos resultados de bar :

grep foo filename | grep bar

Uma alternativa seria com o awk: awk '/foo/ && /bar/' filename

    
por 11.04.2016 / 19:13
2

Você pode usar o grep de maneiras diferentes, por exemplo:

cat myfile | grep keyword

Este exemplo acima despejará o arquivo em stdout . O caractere de canal | pegará essa saída e o alimentará ao comando grep keyword como stdin . No final, as linhas em myfile contendo keyword serão gravadas no stdout , que geralmente é a tela do terminal. Este é um uso muito ineficaz de recursos, o mesmo resultado pode ser realizado com este comando também:

grep keyword myfile

se você quiser usar grep em um menar em cascata, veja como está:

grep keyword1 myfile | grep keyword2

Desta vez, primeiro o comando grep , localiza as linhas que contêm keyword1 em myfile. O segundo comando grep pega a saída do primeiro e procura por keyword2 naqueles. Efetivamente, você está procurando por linhas contendo keyword1 e keyword2 em myfile .

você pode multiplicar esses comandos com diferentes opções de linha de comando para encontrar exatamente o que procura, usando mais de um pipe. Se você puder elaborar o que está tentando fazer com o seu comando na pergunta original em inglês simples, eu ou outra pessoa podemos ajudá-lo ainda mais.

    
por 12.04.2016 / 01:04
1

Essencialmente, o que você está tentando fazer é lógico AND. grep é uma ferramenta de correspondência de linhas, portanto, em termos de uma linha, a lógica patter1 AND patter2 significa que elas estarão na mesma linha; quando você pesquisa um arquivo, onde você quer encontrar uma linha com um termo e outro na mesma linha, você pode usar a expressão regular grep 'pattern1.*pattern2' input_file.txt

$ ps -ef | grep 'xieerqi.*firefox'
xieerqi   5069  2616  7 17:43 ?        00:07:25 /usr/lib/firefox/firefox
xieerqi  24317  6901  0 19:22 pts/19   00:00:00 grep xieerqi.*firefox

Neste exemplo, em vez de pesquisar todos os processos com meu nome de usuário e, em seguida, direcionar para outro grep que filtra firefox processa.

Para mais, consulte este tutorial

    
por 12.04.2016 / 03:26