![从文件中 Grep 字符串](https://linux22.com/image/49622/%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%20Grep%20%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我在一个文件夹内为一项操作创建了 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