用于提取特定date日志的shell脚本

我必须从任何应用程序日志中提取特定date的日志。 我们通常做什么

  1. vi app.log
  2. /date(search)
  3. 。=(finddate的位置)
  4. G(最后一行)
  5. first_line,Last_line w filname.log(用于生成具有特定date的日志文件)

我做了小脚本,但我认为我的逻辑是不正确的:

#!/bin/bash read -p " enter the App name" : app read =p " enter the Date in this Format 10 Jan 20:01:00" : date FILE=/logs/$app.log # Check if $app exists or not if test ! -f "$app" /logs then echo "Error - $app not found." else First_line=$(cat $FILE | grep $date | .=) Second_line=$(tail -1 $FILE | .=) vi $FILE | $First_line, $Second_line w $app.txt fi 

该行有错误

 if test ! -f "$app" /logs 

你用一个空格分隔“$ app”和/ logs; test -f期望一个参数,所以它应该是:

 if test ! -f "$app"/logs 

为了从给出的日期开始到文件当前的结尾,你应该使用sed (意思是“流编辑器”),它是为文件的非交互式编辑而设计的:

 sed -n '/'$date'/,$ p' $app.log >$app.txt 

参数-n只输出,匹配的不是整个文件。

这里我告诉sed提取两个正则表达式之间的所有东西,第一个是给定的$date参数,第二个是“文件结束”。 你可以很容易地改变这个提取所有日志为特定的一天或任何。

由于似乎不清楚,我添加了一个完整的例子:我有一个Apache日志文件,其中日志记录看起来像这样[01/Apr/2015:22:31:21 +0200]

所以我可以这样做:

 export date="01\/Apr\/2015" 

重要的是要注意,我正在逃避斜线,因为它们正在进入正则表达式。 这一切都必须在正则表达式中有一些特殊含义的东西来完成。

那我可以这样做:

 sed -n '/'$date'/,$ p' myaccess.log 

我将四月一日的一切记录下来,直到文件结束。

如果您的任务与您描述的一样机械化,您可以使用here文档从脚本向vi传递命令。

我正在谈论这样的事情

 #!/bin/bash read -p " enter the App name" : app read =p " enter the Date in this Format 10 Jan 20:01:00" : date FILE=/logs/$app.log # Check if $app exists or not if test ! -f "$app" /logs then echo "Error - $app not found." else vi $FILE <<-_EOF_ /date .= G first_line,Last_line w filname.log etc, etc _EOF_ fi 

我只是把这个想法写成了一个想法,让你找到乐趣去探索。 我知道代码将无法正常工作。

我会使用awk:

 awk -v date="$date" '$0 ~ date {p=1} p' file.in > file.out 

当日期第一次出现时,这将开始打印行,直到行结束。