在多个文件中使用 grep 搜索字符串



希望标题是不言自明的,但我仍然会尝试更清楚地说明我想要做什么。我正在日志文件中查找字符串"实时消息"。通过使用简单的 grep 命令,我可以从文件夹中的所有文件中获取此信息。我正在使用的命令如下,

grep "Live message" *

但是,由于我的日志文件可以追溯到去年年中,因此有没有办法使用 grep 定义一个范围来搜索这个特定的字符串。我的日志文件如下所示,

commLogs.log.2015-11-01
commLogs.log.2015-11-01
commLogs.log.2015-11-01
...
commLogs.log.2016-01-01
commLogs.log.2016-01-02
...
commLogs.log.2016-06-01
commLogs.log.2016-06-02

我想在2016-01-01 - 2016-06-02范围内搜索"实时消息",现在写每个文件名会非常困难和挑剔,

grep "Live message" commLogs.log.2016-01-01 commLogs.log.2016-01-02 commLogs.log.2016-01-03 ...

有比这更好的方法吗?

提前感谢您的任何帮助

ls * | sed "/2015-06-01/,/2016-06-03/p" -n | xargs grep "Live message"

ls *都是日志文件(最好按日期排序),可以在find -type f -name ...上替换

sed "/<BEGIN_REGEX>/,/<END_REGEX>/p" -n过滤BEGIN_REGEX和END_REGEX之间的所有行

xargs grep "Live message" 是将所有文件传递给 grep

幸运的是,您的日期以 YYYY-MM-DD 方式存储;它允许您通过按字典顺序比较字符串来比较日期:

for f in *; do
    d=${f#commLogs.log.}
    if [[ $d > 2016-01-00 && $d < 2016-06-02 ]]; then
        cat "$f"
    fi
done | grep "Live message"

这并不理想;它有点冗长,需要多次运行cat。它可以通过将文件名存储在数组中来改进,只要匹配的数量不会变得太大,数组就可以工作:

for f in *; do
    d=${f#commLogs.log.}
    if [[ $d > 2016-01-00 && $d < 2016-06-02 ]]; then
        files+=("$f")
    fi
done
grep "Live message" "${f[@]}"
根据范围,

您可能能够编写合适的模式来匹配范围,但这会变得棘手,因为您只能模式匹配字符串,而不能匹配数字范围

grep "Live message" commLogs.log.2016-0[1-5]-* commLogs.log.2016-06-0[1-2]

相关内容

  • 没有找到相关文章

最新更新