如何从日志文件的指定匹配位置开始执行grep检索
可行实现方案
方案1:直接用awk一行命令实现(无需额外配置)
awk天生支持该需求,逻辑是匹配到目标字符串后开启输出标记,后续所有行直接输出:
# 示例:从Oct 29 09:55:00的第一行开始输出所有后续日志 awk '/Oct 29 09:55:00/{flag=1} flag' syslog20211029 | grep "[my message]"
如果需要模糊匹配分钟级起点,把匹配串改成Oct 29 09:55:即可匹配该分钟所有行的起始位置。
方案2:封装为自定义命令实现你要的调用形式
步骤1:创建自定义脚本
在/usr/local/bin/start-at-first-match路径下写入以下内容:
#!/bin/bash # 校验参数 if [ $# -ne 2 ]; then echo "用法: start-at-first-match <匹配起始字符串> <日志文件路径>" exit 1 fi # 用-v参数传递搜索串,避免特殊字符转义问题 awk -v search_str="$1" '$0 ~ search_str {output_flag=1} output_flag' "$2"
步骤2:赋予执行权限
sudo chmod +x /usr/local/bin/start-at-first-match
步骤3:直接调用
完全符合你要求的使用形式:
start-at-first-match "Oct 29 09:55:00" syslog20211029 | grep "[my message]"
备选方案:用sed实现
sed也可以实现从匹配行到末尾输出的效果,语法更简洁:
sed -n '/Oct 29 09:55:00/,$p' syslog20211029 | grep "[my message]"
参数说明:-n关闭默认输出,/匹配串/,$p表示从第一个匹配串所在行到最后一行($)打印(p)。
小提示
如果目标时间点的日志不存在,上述命令会输出空内容,可以把匹配串调整为更粗的时间粒度,比如用Oct 29 09:5匹配09:50到09:59的行,找到最接近变更时间的起始点。
内容的提问来源于stack exchange,提问作者blue
相关产品推荐
相关产品推荐

