从日期开始,在日期停止

时间:2013-12-30 03:43:51

标签: linux grep

我想把日期的一切开始直到日期结束。这是我目前的代码

for z in *.log; do cat /test/data/$z | grep "`date --date="yesterday" +%m\/\%d\/\%y`" > /data/demo.log; done

我的代码的问题是它不会grep新行例如

原始数据

   > [12/28/13 17:57:15.702]: start
   > test_miss
   > [12/28/13 17:57:15.702]: end 
   > [12/29/13 17:57:15.702]: new day

之后

   > [12/28/13 17:57:15.702]: start
   > [12/28/13 17:57:15.702]: end 

期望的输出

   > [12/28/13 17:57:15.702]: start
   > test_miss
   > [12/28/13 17:57:15.702]: end 

我如何从我约会的日期开始直到我的约会结束,谢谢你,

3 个答案:

答案 0 :(得分:1)

使用gawk,例如

 yest=$(date --date="yesterday" +%m\/\%d\/\%y`")
 for z in *.log; do
   awk "/$yest/{inside= !inside;print;next;} {if (inside) print;}" $z
 done

我是using a variable inside作为布尔标志,在遇到$yest(昨天的日期)时切换。

答案 1 :(得分:0)

试试这个

 cat logfile | awk '$0 >= "xx/xx/xx 00:00" && $0 <= "yy/yy/yy 00:00"'

 cat /var/log/messages | awk '$0 >= "Dec 30 14:45:01" && $0 <= "Dec 30 14:50:01"'


NOTE - The timestamps are at the beginning of each line and you need to include the correct 
timestamp format.

答案 2 :(得分:0)

感谢所有的帮助和提示无论如何这就是我所做的

for z in *.log; 
do
yest=$(grep -n "$( date --date="yesterday" +%m\/\%d\/\%y )" /data/log/$z |cut -f1 -d: | head -n 1) ;
today=$(grep -n "$( date --date="today" +%m\/\%d\/\%y )" /data/log/$z |cut -f1 -d: | head -n 1) ;

if [[ -z "$today" ]]
then
awk "NR>="$yest"" "/data/log/$z" > /data/test/$z;

else
today=$(($today - 1)) ; 
awk "NR>="$yest"&&NR<=$today" "/data/log/$z" > /data/test/$z;
fi
done

我使用grep搜索第一个和最后一个行号,并使用awk捕获其中的所有内容。