我想要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])
) 组成。通配限定符特定于zsh
shell。
这里使用的 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
,只需在互联网上快速搜索即可找到很多有关如何使用它的优秀教程。