Usando tee para canalizar ls e grep no comando tail sem um script

1

Eu tenho um problema em executar arquivos de log.

Eu estou olhando para usar ls para criar uma lista de arquivos no diretório de log e grep para percorrer para as instâncias específicas / vezes que o arquivo foi executado. Eu só quero ter a última linha de cada arquivo, então eu quero que o comando tail -1 seja executado na lista de arquivos grep fornecida.

Eu tentei várias combinações de código que eu encontrei mas ainda não tive sorte; Neste ponto, tornou-se mais uma curiosidade do que útil, devido à quantidade de tempo que passei com isso. Abaixo estão alguns exemplos das instâncias que tentei:

ls | grep 2011_.._.._.._35_.* | tee >(tail -1)
ls | tee >(grep 2011_.._.._.._35_.*) | tail -1

Além disso, eu gostaria de fazer isso com uma única linha de comando, se possível, em vez de criar um script e executar um loop.

    
por nrdk 03.11.2011 / 16:49

1 resposta

1

REVISTO!

escreveu que você deseja apenas a última linha de cada logfile ...

O comando de que você precisa é xargs não tee :

 ls | grep '2011_.._.._.._35_.*' | xargs -n 1 -- tail -1

ou

 ls -1 2011_??_??_??_35_* | xargs -n 1 -- tail -1

Isso chama o comando tail -1 para cada arquivo que passa no comando grep (primeiro caso) ou que é encontrado pelo comando ls (segundo caso). Observe que isso não funcionará se um arquivo contiver espaços ou nova linha. Se você precisar de uma resposta para esse caso, adicione um comentário.

EDITAR Para o seu comentário:

ls -1 2011_??_??_??_35_* | xargs -n 1 -I FILE -- sh -c 'echo ; echo "FILE"; tail -1 "FILE"'

Um pouco mais complicado, mas também lida com arquivos com espaços no nome.

Cada "FILE" na seqüência de comandos echo ; echo "FILE"; tail -1 "FILE" será substituído por uma linha que ls produz. Essa seqüência de comando será passada para um shell e, em seguida, executada.

    
por 03.11.2011 / 17:35

Tags