linux sed/awk命令检索区间日志的问题
开发时如果需要检索一段时间内或者某个批量执行期间的所有日志也就是区间日志时手动检索会有一些问题如要查询一段时间前的日志比如归档日志需要一页一页翻费时且费眼睛使用grep筛选日志但是只能搜索满足特定字段的日志无法检索区间日志为了实现区间日志的检索可以使用sed/awk命令。这两个命令都无法直接处理压缩文件需要先使用zcat读取压缩文件再通过管道传递。1 grepsedsed是一个流编辑器它一次读取一行文本处理一行并输出一行要检索日志区间时主要使用1234-- 1.行号匹配输出从startrow行到endrow行的内容sed-nstartrow,endrowpfilename-- 2.字符匹配输出从匹配start的行到end的行的内容sed-n/start/,/end/pfilename行号匹配注意startrow,endrow为起始行号结束行号p为打印命令printsed默认处理一行之后会输出一行因此需要使用-np来取消自动打印只打印我们需要的行如果只有一个行号则打印指定行打印到末尾则区间为startrow,$字符匹配注意sed匹配字符时一旦匹配到start则会一直输出内容直到匹配到end因此如果文件包含多个顺序start...end则会分批输出如果只有start没有end则会从start输出到文件末尾如果文件内容为start...start...end...end那么会输出从第一个start到第一个end区间里内容匹配区间时候一般使用真实使用这个最方便:1234-- 1. 使用grep定位行号(如果是压缩文件则使用zcat filename.tar.gz|grep-nxxx)grep-n开始日志标志filename-- 2. 找到上述命令输出行号比如 510:xxxxx在该行号上面大致区间长度即可,压缩文件同样使用zcat管道sed-n510,550pfilename2 awksed一般只用于简单的文本转换编辑比如查找替换但awk命令是一个更强大的文本处理器可以处理更复杂的命令比如计算、分析。awk采用“模式-动作”对执行模型命令基本结构是123pattern {action}pattern {action}...对于输入流/文件里的每一行awk会依次检查每个pattern如果匹配成功则执行对应的action如果某个action之后的pattern不需要继续匹配则需在这个action中加上next终止后续匹配。如果action缺失则采用默认动作{print $0}打印当前整行。如果要打印开始日志到结束日志中间的内容使用如下命令与sed一样如果文件包含多组开始日志...结束日志则会输出所有区间1234567-- 模式使用/xxx/表明使用正则表达式模式-- 1.1 不包括开始日志和结束日志行awk/开始日志/{flag1;next} /结束日志/{flag0} flagfilename-- 1.2 包括开始日志和结束日志行awk/开始日志/{flag1} flag; /结束日志/{flag0}filename-- 2. 语法糖打印从开始日志行到结束日志行内的所有内容包括首尾两行awk/开始日志/,/结束日志/filename命令1.1的流程为:当匹配开始日志行时将开关变量flag置1然后执行next跳过后续模式动作处理直接读取下一行假设下一行是中间行那么前两个正则匹配模式都失败进行第三个flag模式这是一个表达式模式检查flag的值。当它非0或非空时为true然后采用默认动作{print $0}打印当前整行因此中间行能被打印当匹配结束日志行时开关变量flag置0继续下一个模式此时flag表达式判断为false因此不打印这个流程完成了从开始日志行到结束日志行之间内容的打印。1.2同样可以按照这个流程分析它会打印包括开始日志行和结束日志行在内的所有区间内容。命令2是范围模式格式为pattern1,pattern2 {action}是一种特殊模式它表示从第一次匹配pattern1的行开始到第一次匹配pattern2的行结束之间的所有行都执行action动作。action缺失则打印整行。3 sed/awk查找特定重复区间当某功能或任务执行多次时可能有多个任务开始...任务结束区间:123456781 任务开始2 ...10: 任务结束11 xxxx12 任务开始13 ...22: 任务结束...3.1 查找第一个区间sed/awk查找第一个区间日志都是在输出完后退出sed使用qawk使用exit123sed-n/任务开始/,/任务结束/p; /任务结束/qfilenameawk/任务开始/{flag1} flag; /任务结束/{print;exit}filenameawk/任务开始/,/任务结束/; /任务结束/{exit}filename3.2 查找第n区间如果想要找到第n组日志可以用awk定义计数器sed不支持复杂操作1awk/任务开始/{cnt} cnt2{print} /任务结束/ cnt2 {exit}filename3.3 最后一组/最新组sed,awk都是流处理无法回溯信息因此无法得知当前区间是否是最后一次所以最新一组日志需要使用反转命令找第一次结束日志...开始日志区间再倒转即可。123tac filename |sed-n/任务结束/,/任务开始/p; /任务开始/qfilenametac filename |awk/任务结束/{flag1} flag; /任务开始/{flag0;exit}| tactac filename |awk/任务结束/,/任务开始/; 任务开始/{exit}| tac到此这篇关于linux sed/awk命令检索区间日志的问题的文章就介绍到这了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2477943.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!