linux sort 'field skip' 选项未记录,但似乎有效

lit*_*les 9 linux sort

我正在将一个脚本从 AIX 移植到具有以下形式代码的 linux

grep <pattern> $LOG | sort -b +rn4 -5 +2 -3
Run Code Online (Sandbox Code Playgroud)

在 AIX 上,记录了这种排序语法,基本上 +a -b 语法意味着跳过字段并将 a 和 b 之间的字段视为排序键。

这在 linux 上不起作用,因为 linux sort 命令不喜欢在 +a 'skip fields' 参数中包含 'rn'(反向数字)标志。但这确实有效:

grep <pattern? $LOG | sort -b -rn +4 -5 +2 -3
Run Code Online (Sandbox Code Playgroud)

因此很明显,“田跳过逻辑Linux所支持的排序,但在手册页没有记录(即我可以看到,反正)。-k 选项适用于两个系统以指定关键字段编号。但这里有一个奇怪的怪癖。在 AIX 上

ls -l | sort -n +4
Run Code Online (Sandbox Code Playgroud)

生成按第 5 个字段(大小)排序的文件列表。但是在 linux 上,同样的命令会产生错误:

排序:无法读取:+4:没有那个文件或目录

ls -l | sort -n +4 -5
Run Code Online (Sandbox Code Playgroud)

不过确实有效。因此,显然 + 跳过 - 跳过键选择语法排序有效,但前提是您同时指定了开始和结束列跳过参数。它没有记录。所以,我的问题 - 此列跳过语法是否已弃用?它是否只是因为代码就在命令中而没有人知道将其取出而起作用?

Ste*_*itt 8

我假设您的 Linux 系统使用 GNU sort;GNUsort的手册页没有提供完整的文档。相反,该文档以信息文件 ( info sort) 的形式提供,也可在在线 Coreutils 手册 中找到。后者描述了您所看到的行为:

在不符合 POSIX 1003.1-2001 的系统上,sort支持用于指定排序键的传统原点零语法“ ”。如果y是 ' ' 或不存在,则传统命令 ' ' 等效于 ' ' ,否则等效于 ' '。+pos1 [-pos2]sort +a.x -b.ysort -k a+1.x+1,b0sort -k a+1.x+1,b+1.y

这种传统行为可以通过_POSIX2_VERSION环境变量来控制(参见标准一致性);它也可以在POSIXLY_CORRECT未设置时使用带有“ -pos2”的传统语法启用。

如果您在其环境中sort使用_POSIX2_VERSIONset to运行 GNU 199209,您将能够单独使用:+x

ls -l | _POSIX2_VERSION=199209 sort -n +4
Run Code Online (Sandbox Code Playgroud)