工作原理
一般情况下,日志的内容是按照时间顺序依次写入的。因此可以按照行号来定向查询。
注意
如果同一个文件内,是同一日期的日志,则只需要按照时间查询即可。
如果同一文件内有多个日期,则需要按照日期和时间一起查询才准确。
实际操作
#第一步,查询开始时间的行号,如果没有返回,则换个时间查询(查询时间的时候,一般首位要加一个空格,防止查询的不是以小时单位为开头的时间,模糊时间可以用【*】代替)
cat -n abc.log |grep ' 09:00:*' | head -n 1| awk '{print $1}'
>>683051
#第二步,查询结束时间的行号,如果没有返回,则换个时间查询
cat -n abc.log |grep ' 10:00:*' | head -n 1| awk '{print $1}'
>>1204936
#第三步,查询从开始时间的行号,到结束时间的行号内的所有日志。
sed -n 683051,1204936p abc.log
简化版:将上面3个步合并成一条命令
paste -d , <( cat -n abc.log |grep ' 09:00:*' | head -n 1| awk '{print $1}' ) <( cat -n abc.log |grep ' 10:00:*' | head -n 1| awk '{print $1}' ) |xargs -I {} sed -n {}p abc.log
相关知识
- paste <(date) <(date) #将2个date命令的结果用空格或TAB拼接成一行(注意每个【)】与【<】z之间必须有空格并且只能是空格,【<】与【(】之间不能有空格)。paste <(date) <(date) <(echo abc) #同上这是3个命令的结果进行拼接,多个命令以此类推。
- xargs 的一个选项 -I,使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次
- head -n 2000 abc.log #从文件第一行开始,输出2000行abc.log的文件内容。
- awk '{print $1,$4}' #每行按空格或TAB分割,输出文本中的1、4项
- sed 可依照脚本的指令来处理、编辑文本文件。
- cat 命令用于连接文件并打印到标准输出设备上。