尾部和通配符

Mit*_*tch 10 linux bash

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

 tail -10 *-access_log 
Run Code Online (Sandbox Code Playgroud)

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

tail -10 file-*
Run Code Online (Sandbox Code Playgroud)

给我我期望的输出。我认为这可能更多地与 BASH 相关,然后是尾部。但是命令如:

cat *-access_log
Run Code Online (Sandbox Code Playgroud)

工作正常。

有什么建议?

Kyl*_*ndt 10

我相信你会想要:

tail -n 10 *-access.log
Run Code Online (Sandbox Code Playgroud)

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

tail -10 foo-access.log arf-access.log 
tail: option used in invalid context -- 1
Run Code Online (Sandbox Code Playgroud)

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

parse_obsolete_option (int argc, char * const *argv, uintmax_t *n_units)
Run Code Online (Sandbox Code Playgroud)


Bre*_*bad 6

虽然有点老,但问题仍然相关。我遇到了类似的问题

ssh myserver.com 'tail -2 file-header*'
Run Code Online (Sandbox Code Playgroud)

这给了我错误

尾部:在无效上下文中使用的选项 -- 2

然而,只拖尾一个文件,比如

ssh myserver.com 'tail -2 file-header-file-one'
Run Code Online (Sandbox Code Playgroud)

工作正常。查看源代码tail.c显示,tail从解析过时的选项开始,然后解析其余的(即尚未处理的选项),常规选项。但是,parse_obsolete_option()期望“过时”用法,只有一个文件作为参数。
因此,当提供更多文件时,该函数会立即返回,并让常规解析器阻塞-2(期望-n 2)。

ssh myserver.com 'tail -2 file-header*'
Run Code Online (Sandbox Code Playgroud)

总之,最好总是使用-n正则形式,知道“过时”的代码只接受一个文件。

  • 喜欢你深入挖掘源头并找到这个问题的根本原因!但是,是的,总而言之,当有通配符时,请使用 `-n 2` 而不是 `-2`。 (2认同)