在多个文件的范围内使用grep搜索字符串

时间:2016-06-03 11:12:40

标签: linux bash scripting grep

希望标题是不言自明的,但我仍然会更加清楚我要做的事情。我正在寻找一个字符串" Live message"在我的日志文件中。通过使用简单的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 ...

有比这更好的方法吗?

提前感谢您的任何帮助

2 个答案:

答案 0 :(得分:1)

您很幸运,您的日期以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]

答案 1 :(得分:0)

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