尾部字符和通配符

尾部字符和通配符

我想获取多个文件的最后 10 行。我知道它们都以“-access_log”结尾。所以我尝试了:

 tail -10 *-access_log 

但这给了我一个错误,例如:

tail -10 file-*

给出了我期望的输出。我认为这可能与 BASH 有关,而不是 tail。但是,像这样的命令:

cat *-access_log

做工精细。

有什么建议么?

答案1

我相信你会想要:

tail -n 10 *-access.log

至于为什么
我认为这与通配符没有任何关系:

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

我认为您的 glob 恰好扩展为一个文件。这可能与一些过时的选项解析有关,我懒得去阅读,但如果您真的想知道,请查看tail.ccoreutils 源代码并剖析以下函数:

parse_obsolete_option (int argc, char * const *argv, uintmax_t *n_units)

答案2

虽然有点老了,但这个问题仍然有意义。我遇到了类似的问题

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

这给了我错误

tail:选项在无效上下文中使用——2

然而,尾矿只有一个文件,例如

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

工作正常。查看源代码尾部表明尾巴从解析开始过时的选项,然后解析其余部分(即尚未处理的选项),常规选项。但是,parse_obsolete_option()期望“过时”的用法,只有一个文件作为参数。
因此,当提供更多文件时,该函数会立即返回,并让常规解析器阻塞-2(期望-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;

总之,最好始终使用-n常规形式,同时要知道“过时”的代码只接受一个文件。

答案3

实际上,GNU tail 的这种行为(-COUNT 仅接受一个文件)是有记录的。https://www.gnu.org/software/coreutils/manual/html_node/tail-invocation.html

为了兼容,tail 还支持过时的用法“tail -[num][bcl][f] [file]”,只有在与上述用法不冲突的情况下才会被识别。此过时形式只使用一个选项,最多使用一个文件。

它也可以在已安装的 coreutils 信息页面中找到。

shell> info tail

注意,相反,“head -COUNT”支持多个文件。

相关内容