cat resultados do grep

1

Estou tentando concatenar os resultados da minha pesquisa grep. my grep search encontra cerca de 4 arquivos no meu sistema e os envia em uma nova linha para cada arquivo. Pensei em passar essa informação para tr '\n' ' ' . Eu pegaria todos os arquivos da pesquisa em uma linha e depois passaria para cat > bigfile para que o arquivo grande contivesse todo o conteúdo dos arquivos da minha pesquisa. Em vez disso, bigfile apenas contém a lista de arquivos que o grep encontrou.

Como faço para que bigfile contenha uma concatenação de todos os arquivos que o grep encontrou?

Aqui está o código que tentei:

egrep -Rl 'users.*log|log.*users' /home/moose/test | tr '\n' ' ' | cat > bigfile

e, em seguida, bigfile contém:

/home/moose/test/file1 /home/moose/test/2 /home/moose/test/3 /home/moose/moose/file4 

Obrigado

    
por Moose 09.03.2016 / 02:14

4 respostas

4

Se você está tentando concatenar os conteúdos dos arquivos correspondentes em um único bigfile , então você precisa passar os nomes de arquivos para cat como argumentos distintos: você poderia fazer isso com xargs

egrep -ZRl 'users.*log|log.*users' /home/moose/test | xargs -0 cat

A adição dos sinalizadores -Z e -0 passa os nomes usando delimitadores nulos, permitindo que o comando funcione com qualquer nome de arquivo legal (incluindo aqueles que contêm espaços em branco ou novas linhas).

    
por 09.03.2016 / 03:08
1
  1. cat não faz nada aqui. Simplesmente redirecionar a saída de tr é efetivamente o mesmo que direcionar para cat e redirecionar.

  2. Experimente paste em vez de tr . Por exemplo:

    egrep -Rl 'users.*log|log.*users' /home/moose/test | paste -sd' ' > bigfile

  3. xargs também funciona e tem a vantagem de dividir a saída em várias linhas se / quando atingir o comprimento máximo de uma linha de comando:

    egrep -Rl 'users.*log|log.*users' /home/moose/test | xargs > bigfile

BTW, por que é importante que os arquivos sejam listados um por linha ou todos em uma linha? Se você pretende usá-lo na linha de comando de outro programa ou como entrada para um loop for ou while , provavelmente ficará melhor com um nome de arquivo por linha, especialmente se houver algum arquivo com caracteres de espaço no nome do arquivo.

    
por 09.03.2016 / 02:23
0

Não há necessidade do último pipe / cat, você pode redirecioná-lo para o arquivo diretamente após tr

Pode usar seu código como:

egrep -Rl 'users.*log|log.*users' /home/moose/test | tr '\n' ' ' > bigfile

Isso lhe dará:

/home/moose/test/file1 /home/moose/test/2 /home/moose/test/3 /home/moose/moose/file4

    
por 09.03.2016 / 02:29
0

Você pode usar a opção paste with - s (serialize) para obter todas as linhas em uma única.

No seu caso:

grep .... | paste -sd'\t'

Aqui, -t indica delimitador, usando a guia aqui como delimitador, altere-o para atender à sua necessidade.

Exemplo:

% printf 'foo\nbar\nspam\negg\n'               
foo
bar
spam
egg

% printf 'foo\nbar\nspam\negg\n' | paste -sd' ' 
foo bar spam egg

% printf 'foo\nbar\nspam\negg\n' | paste -sd'\t'
foo   bar   spam    egg
    
por 09.03.2016 / 02:25

Tags