在脚本中,我想从 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
只知道其输入是什么样子,而不知道谁在输入的构造中扮演了什么角色。