从文件中 Grep 字符串

从文件中 Grep 字符串

我在一个文件夹内为一项操作创建了 5 个文件名。文件名采用以下格式。

ES_currentdate_currenttime_processid_uniqueid.log

我想从该路径中最新创建的文件中读取状态。

我在 shell 脚本中形成文件名的方式是:

$ filename=ES_*_uniqueid.log
$ echo grep "##status##XRB##" $HOME/log/$filename | sort -u` "

当我grep读取所有 5 个文件的状态并回显它时。我希望该字符串grep仅来自创建的最新文件。

有人可以提供解决方案吗?

答案1

只要文件是按时间顺序写入的,文件的名称并不重要。只需用于tail -1获取文件列表中的最后一个文件,该文件应该始终是最新的文件:

$ filename=ES_*_uniqueid.log
$ grep "##status##XRB##" $(ls -tr $filename | tail -1)

这将运行子命令ls -tr $filename | tail -1,该命令将返回单个结果,即最新的文件。然后将对该文件进行 grep 查找匹配的字符串##status##XRB##

答案2

在 zsh 中(解释:

grep "##status##XRB##" ~/log/ES_*.log(om[1])

如果日期采用合理的格式 (YYYYmmdd_HHMMSS),则文件名的字典顺序对应于时间顺序。因此,在 ksh 或 bash 中,您可以将匹配文件的名称放入数组中:您所在的文件将是最后一个数组元素。

logs=(~/log/ES_*.log)
grep "##status##XRB##" "${logs[${#logs}-1]}"

仅使用 POSIX shell(例如/bin/sh),您可以使用位置参数。

grep_last_match () {
  eval set -- \"\${$#}\"
  grep "##status##XRB##" "$1"
}
grep_last_match ~/logs/ES_*.log

相关内容