假设两个文件具有以下内容:
$ cat ttest1.txt
x = 1
x = 3
y = 5
$ cat ttest2.txt
x = 4
x = 10
y = 3
我想递归地 grep 文件x
并打印每个文件中的最后一个实例。因此,所需的输出是
ttest1.txt:x = 3
ttest2.txt:x = 10
以下grep
和的组合tail
适用于一个文件,但不适用于多个文件。
$ grep x ttest1.txt
x = 1
x = 3
$ grep x ttest1.txt | tail -n 1
x = 3
$ grep -r x ttest* | tail -n 1
ttest2.txt:x = 10
我该如何解决?
当你做
你得到一个单一的流
如果你
tail -1
这样做,你会得到ttest2.txt:x = 10
. 这是预期的。但是您希望
grep | tail
在每个单独的文件而不是合并的流上完成组合。所以:在每个单独的文件上执行此操作。使用
awk
,您可以使用正则表达式字符串(请参阅动态正则表达式),记住每个输入文件的最后一个匹配项并打印它:递归结合
find
:使用 GNU sed:
输出:
paste -d: - -
如果您希望在一行中显示结果,请将其传递。如果您不想从不包含的文件输出,请在-change 命令x
后检查,例如:x
{ x; /./ { F; p; z; }; }
这是一种方法:
tac 反转 grep 结果以准备 awk 操作,而 awk 操作又只打印每个文件中的第一次出现