preocupações com a saída do Grep

0

Ok, estou usando o grep em um disco rígido externo

exemplo,

M:/

grep -rhI "bananas" . > out.txt

que produziria quaisquer linhas dentro de "M: /" contendo "bananas"

No entanto, gostaria de produzir todo o conteúdo do arquivo, portanto, se uma linha no exemplo.txt contiver "bananas", o conteúdo inteiro de exemplo.txt será enviado e o mesmo vale para qualquer outro arquivo .txt dentro do diretório "M: / "que contém" bananas ".

    
por Jack 30.06.2017 / 18:33

2 respostas

1

grep -r "bananas" | cut -d: -f1 | xargs cat >> result.txt

grep

  • -r : recursivo. Leia todos os arquivos em cada diretório, recursivamente,

Resultado: file_name:text para cada linha. Por exemplo, foo.txt:bananas .

Agora precisamos buscar o nome do arquivo de cada linha.

corte Editor simples para remover parte da linha (você pode usar sed ou awk aqui, mas o corte é simples)

  • -d delimiter. Já que temos : depois do arquivo este é nosso delimitador: -d:
  • -f dividimos nossa saída em campos. Qual deles pegar? -f1 - primeiro um!

xargs

Agora temos uma lista de arquivos. Isso a ver com eles? Usamos xargs que constrói e executa linhas de comando a partir da entrada padrão. Ele aceita o nome do arquivo no stdin e executa cat para cada linha, fornecendo o nome do arquivo como parâmetro. E cat simplesmente imprime seu conteúdo para stdout.

>> significa "anexar ao arquivo"

    
por 30.06.2017 / 20:31
1
grep -rlZI "bananas" . | xargs -0 cat > out.txt

O -lZ gera uma lista separada por nulos dos nomes dos arquivos correspondentes:

-l, --files-with-matches
       Suppress normal output; instead print the  name  of  each  input
       file  from  which  output would normally have been printed.  The
       scanning will stop on the first match.

-Z, --null
       Output a zero byte (the ASCII  NUL  character)  instead  of  the
       character  that normally follows a file name.  For example, grep
       -lZ outputs a zero byte after each  file  name  instead  of  the
       usual  newline.   This option makes the output unambiguous, even
       in the presence of file names containing unusual characters like
       newlines.   This  option  can  be  used  with commands like find
       -print0, perl -0, sort -z, and xargs  -0  to  process  arbitrary
       file names, even those that contain newline characters.

Se a sua versão do grep não fornecer a opção -Z , você poderá retornar ao -l simples, que ainda manipulará nomes de arquivos contendo espaços em branco (excluindo novas linhas obviamente), desde que você defina o xargs delimitador como nova linha também:

grep -rlI "bananas" . | xargs -d '\n' cat > out.txt
    
por 30.06.2017 / 18:43

Tags