You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用sed提取INFO:root:id is至INFO:root:newId后一行的内容?

提取日志中从指定行到目标行及其下一行的内容

嘿,这个问题我熟!你现在的sed命令只能提取到INFO:root:newId那一行,要把它的下一行也包含进去,咱们可以稍微改改命令,两种方法都给你试试:

方法1:改进版sed命令

直接修改你的sed命令,通过循环和标签来实现包含目标行的下一行:

sed -n '/INFO:root:id is/{:a;p;n;/INFO:root:newId/!ba;p;n;p;}' 1/python.log

命令解释:

  • -n:让sed只打印我们明确指定的内容,避免默认输出所有行
  • /INFO:root:id is/{...}:当匹配到起始行INFO:root:id is时,执行大括号内的逻辑
  • :a:定义一个名为a的标签,用来实现循环跳转
  • p:打印当前行
  • n:读取下一行到sed的模式空间
  • /INFO:root:newId/!ba:如果当前行不匹配INFO:root:newId,就跳回标签a继续循环(打印、读行)
  • 当匹配到INFO:root:newId时,先p打印该行,再n读取下一行,最后p打印这一行,完成整个范围的提取

方法2:更直观的awk命令

如果你觉得sed的标签循环有点绕,用awk会更易懂,逻辑更清晰:

awk '/INFO:root:id is/{flag=1} flag{print; if(/INFO:root:newId/) {getline; print; flag=0}}' 1/python.log

命令解释:

  • /INFO:root:id is/{flag=1}:当匹配到起始行时,开启打印标记flag
  • flag{print; ...}:只要flag为1,就打印当前行
  • if(/INFO:root:newId/) {getline; print; flag=0}:如果当前行是INFO:root:newId,就读取下一行并打印,然后关闭打印标记,结束当前提取范围

验证效果

用你提供的日志示例测试,两种命令都会输出以下内容:

INFO:root:id is
INFO:root:16836211
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): abc.hh.com
DEBUG:urllib3.connectionpool:https://abc.hh.com:443 "POST /api/v2/import/row.json HTTP/1.1" 201 4310
INFO:root:newId
INFO:root:35047536
INFO:root:id is
INFO:root:46836211
DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): abc.hh.com
DEBUG:urllib3.connectionpool:https://abc.hh.com:443 "POST /api/v2/import/row.json HTTP/1.1" 201 4310
INFO:root:newId
INFO:root:55547536

完全符合你要的从INFO:root:id is开始,到INFO:root:newId及其下一行的提取需求。

内容的提问来源于stack exchange,提问作者pothios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:17:45