Caracteres finais e curingas

6

Eu quero pegar as últimas 10 linhas de vários arquivos. Eu sei que todos terminam com "-access_log". Então eu tentei:

 tail -10 *-access_log 

Mas isso me dá um erro, onde como:

tail -10 file-*

Me dá a saída que eu esperava. Eu acho que isso provavelmente tem mais a ver com o BASH e com o tail. No entanto, comandos como:

cat *-access_log

Trabalhe bem.

Alguma sugestão?

    
por Mitch 30.04.2010 / 19:17

2 respostas

7

Eu acredito que você gostaria:

tail -n 10 *-access.log

Quanto a por que :
Eu não acho que tenha algo a ver com globbing:

tail -10 foo-access.log arf-access.log 
tail: option used in invalid context -- 1

Acho que acontece que o seu glob se expande para um arquivo. Provavelmente tem algo a ver com algumas opções arcaicas analisando que estou com preguiça de tentar ler, mas se você realmente quer saber vá procurar em tail.c na fonte coreutils e dissecar a seguinte função:

parse_obsolete_option (int argc, char * const *argv, uintmax_t *n_units)
    
por 30.04.2010 / 19:20
5

Embora um pouco antigo, a questão ainda é relevante. Eu encontrei um problema semelhante

ssh myserver.com 'tail -2 file-header*'

que me deu o erro

tail: option used in invalid context -- 2

no entanto, tailing apenas um arquivo, como

ssh myserver.com 'tail -2 file-header-file-one'

funciona bem. Olhando para a fonte tail.c mostra que tail começa analisando obsoleto opções, então analisa o resto (ou seja, opções ainda não processadas), regular opções. No entanto, parse_obsolete_option() espera um uso "obsoleto", com apenas um arquivo como argumento.
Então, ao fornecer mais arquivos, a função retorna imediatamente, e deixa o analisador regular engasgar com -2 (esperando -n 2 ).

  /* With the obsolete form, there is one option string and at most
     one file argument.  Watch out for "-" and "--", though.  */
  if (! (argc == 2
         || (argc == 3 && ! (argv[2][0] == '-' && argv[2][1]))
         || (3 <= argc && argc <= 4 && STREQ (argv[2], "--"))))
    return false;

Em conclusão, é melhor usar sempre o formulário -n regular, sabendo que o código "obsoleto" só aceita um arquivo.

    
por 07.04.2013 / 12:21

Tags