希望标题是不言自明的,但我仍然会尝试更清楚地说明我想要做什么。我正在日志文件中查找字符串"实时消息"。通过使用简单的 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]