如何用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}:当匹配到起始行时,开启打印标记flagflag{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

