![尾部字符和通配符](https://linux22.com/image/512552/%E5%B0%BE%E9%83%A8%E5%AD%97%E7%AC%A6%E5%92%8C%E9%80%9A%E9%85%8D%E7%AC%A6.png)
我想获取多个文件的最后 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.c
coreutils 源代码并剖析以下函数:
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”支持多个文件。