防止 sort 对文件名进行排序而不是对内容进行 greped

防止 sort 对文件名进行排序而不是对内容进行 greped

在脚本中,我想从 findgrep和 sort 中获取一个变量,并在屏幕上用 echo 显示它。该变量如下所示:

OUTPUT="$(find . -maxdepth 2 -type f -name 'filename' | xargs grep -o -m 1 "string" | sort -r)"

Find 应在文件夹中搜索一些同名文件xyz。将它们通过管道传输到 grep 以在这些文件中搜索每个第一个匹配的字符串。然后 sort 应按降序排序。

效果很好,但无论我怎么尝试 sort 总是按文件名排序,但它应该按 grep 找到的匹配字符串排序。输出如下

/file3:111
/file2:666
/file1:333

无论文件名是什么,我都希望 echo 显示以下内容:

 /file2:666
 /file1:333
 /file3:111

grep -h得到了我想要的结果,但我还需要显示文件名作为附加信息。

答案1

您需要告诉sort您要根据输入的哪一部分进行排序。这就是开关-k(“key”)的作用。假设您有一个列表,例如

/file3 111
/file2 666
/file1 333

您想根据第二个字段进行排序,因此您需要-k 2

sort -r -k 2

默认情况下,sort使用“非空白到空白转换”分隔字段,或在每个非空白字符之间使用空格字符分隔字段。 在您的例子中,您使用 分隔输入的字段:。 因此,也必须sort使用 switch 来说明这一点-t

sort -r -k 2 -t ':'

更一般地讲,在管道中(多个命令通过 链接在一起|),后面的命令不知道其输入是如何产生的。因此,将其视为“sort需要查看来自什么grep和不来自什么find”可能没什么帮助 ;)sort只知道其输入是什么样子,而不知道谁在输入的构造中扮演了什么角色。

相关内容