从特定行号结尾日志文件

时间:2018-12-14 09:42:47

标签: bash tail less-unix

我知道如何在文本文件的尾部添加特定的行数

tail -n50 /this/is/my.log

但是,如何使该行计数为变量?

假设我有一个很大的日志文件,该文件每天都会由某些程序附加到日志文件中,日志文件中的所有行均以以下格式的日期时间开头:

Day Mon YY HH:MM:SS

每天,我只想输出日志文件的末尾,但只输出前几天的记录。假设此输出仅在午夜之后运行,我不担心尾巴溢出到第二天。

我只想能够根据昨天日期的第一次出现来计算要拖尾多少行...

有可能吗?

4 个答案:

答案 0 :(得分:2)

我不认为尾巴有这样的功能。

您可以使用awk计算出开始和结束的行号,但是如果您只想从日志文件中精确找出那些行,最简单的方法可能是将grep与date结合使用。在行首匹配昨天的日期应该可以工作:

grep "^`date -d yesterday '+%d %b %y'`" < log_file.txt

您可能需要调整日期格式,使其与日志文件中的内容完全匹配。

答案 1 :(得分:2)

回答标题问题,对于以这种方式来到这里的任何人来说,头和尾都可以接受要排除多少文件的代码。

  • 对于尾部,请使用-n +num作为行号num的起始位置
  • 对于打印头,使用-n -num作为不打印的行数

如果您记得上次执行命令以来的行数,然后将该数字用于tail -n +$prevlines以获取部分日志的下一部分,则与实际问题相关,无论多久检查一次日志。

回答实际问题,在可以grep的特定行之后打印所有内容的一种方法是使用-A选项,计数可笑。这可能比这里的其他答案更有用,因为您可以获得许多天的结果。因此,要获取昨天和今天为止的所有信息:

grep "^`date -d yesterday '+%d %b %y'`" -A1000000 log_file.txt

您可以组合使用2个毛刺来在2个日期范围之间进行打印。

请注意,这取决于日志文件中实际发生的日期。它的缺点是,如果在特定日期没有任何事件被记录为范围标记,那么它将找不到任何东西。

要解决此问题,您可以为开始日期和结束日期注入虚拟记录,并在grepping之前对文件进行排序。不过,这可能有点矫kill过正,而且排序可能很昂贵,所以我不会举例说明。

答案 2 :(得分:0)

您可以不加尾巴,只需grep带有前一个日期的行即可:

cat my.log | grep“ $(date -d”昨天13:00“'+%d%m%Y')”

如果需要行数,可以添加  | wc -l <​​/ p>

答案 3 :(得分:0)

我通过反复试验得出了包含日期和总行的第一行的行号,如下所示:

lines=$(wc -l < myfile.log)

start=$(cat myfile.log | grep -no $datestring | head -n1 | cut -f1 -d:)

n=$((lines-start))

然后是一条尾巴,

tail -n$n myfile.log