在linux中使用shell命令从日志中打印两个date之间的连线

我有一个日志,我想打印两个date之间日志中的所有行02/04/2015:14:23:0002/04/2015:14:23:59

另一个sed单行的方法是: sed -n '/start/,/end/p' log.txt

 $ cat /tmp/log.txt before before before a log line containing 02/04/2015:14:23:00 and some other stuff between between a log line containing 02/04/2015:14:23:59 and some other stuff after after $ sed -n '/02\/04\/2015:14:23:00/,/02\/04\/2015:14:23:59/p' /tmp/log.txt a log line containing 02/04/2015:14:23:00 and some other stuff between between a log line containing 02/04/2015:14:23:59 and some other stuff 

请注意,如果开始和结束标记在同一行,它将无法按预期工作。

这种情况很简单 – 使用grep和match 02/04/2015:14:23: ::

 grep '02/04/2015:14:23:' log.txt 

一般/万能的情况比较复杂。 你必须找到第一行和最后一行,然后打印行。

要找到第一行和最后一行,请使用像这样的日期(仅用于例子):

 FIRST=`grep -n '02/04/2015:14:30:12' log.txt | head -n 1 | cut -f 1 -d:` LAST=`grep -n '02/04/2015:14:43:43' log.txt | tail -n 1 | cut -f 1 -d:` 

命令会擦除与某种模式匹配的所有行,而不是选择第一个/最后一个匹配行,并从中删除行号。

这可以用于tailhead来选择匹配的线条:

 tail -n +$FIRST log.txt | head -n $(($LAST-$FIRST+1)) 

以下脚本总结了这些操作:

 #!/bin/bash START_PATTERN=$1 END_PATTERN=$2 FILE=$3 FIRST=`grep -n "$START_PATTERN" $FILE | head -n 1 | cut -f 1 -d:` LAST=`grep -n "$END_PATTERN" $FILE | tail -n 1 | cut -f 1 -d:` tail -n +$FIRST $FILE | head -n $(($LAST-$FIRST+1))