在目录中的最新文件中搜索字符串

在目录中的最新文件中搜索字符串

我想要grep当前目录中最新文件中的字符串。通过使用以下命令,我可以获取最新的文件,但不能grep仅在该文件中获取。

$ ls -lrth 

-rw-r--r--. 1 user pg_user 1712804 Jul 13 22:27 postgresql-2021-07-13_000000.log
-rw-r--r--. 1 user pg_user       0 Jul 14 00:00 postgresql-2021-07-14_000000.log

$ ls -lt postgresql-*.log | head -n 1 
-rw-r--r--. 1 user pg_user       0 Jul 14 00:00 postgresql-2021-07-14_000000.log

现在,我想要grep一个字符串postgresql-2021-07-14_000000.log

我如何将两者结合在一个命令中以在echo屏幕上获取输出。就像是

$ls -lt postgresql-*.log | head -n 1 | grep "system is ready" 

(只有我知道这里还缺少一些东西)。

答案1

使用zsh外壳:

grep -F 'system is ready' postgresql-*.log(.om[1])

该模式postgresql-*.log(.om[1])由将匹配当前目录 ( postgresql-*.log) 中的文件选择的普通通配模式和修改通配模式行为的通配限定符 ( (.om[1])) 组成。通配限定符特定于zshshell。

这里使用的 globbing 限定符确保我们只匹配常规文件 ( .),并且匹配产生的名称列表按修改时间戳 ( om) 排序。然后,从匹配的有序列表中,我们仅使用 提取第一个匹配[1],从而为我们提供与最近修改的通配模式匹配的文件名。

如果您的交互式 shell 不是zsh,您仍然可以zsh像这样执行此操作:

zsh -c 'grep -F "system is ready" postgresql-*.log(.om[1])'

既然你要求脚本去做这个:

#!/bin/zsh

grep -F 'system is ready' postgresql-*.log(.om[1])

有关的:

答案2

在我看来,你缺少的是xargs命令。对于您的示例,您可以使用

ls -t postgresql-*.log | head -n 1 | xargs grep "system is ready" 

xargs命令用于从标准输入执行命令行。在这种情况下,它将是命令grep输出的文件head

请注意,要使其正常工作,您不要-l在原始文件中包含该标志ls,以便 head 命令的结果只是文件名,而不是用 打印的额外信息-l

如果您不熟悉xargs,只需在互联网上快速搜索即可找到很多有关如何使用它的优秀教程。

相关内容