我知道如何在文本文件的尾部添加特定的行数
tail -n50 /this/is/my.log
但是,如何使该行计数为变量?
假设我有一个很大的日志文件,该文件每天都会由某些程序附加到日志文件中,日志文件中的所有行均以以下格式的日期时间开头:
Day Mon YY HH:MM:SS
每天,我只想输出日志文件的末尾,但只输出前几天的记录。假设此输出仅在午夜之后运行,我不担心尾巴溢出到第二天。
我只想能够根据昨天日期的第一次出现来计算要拖尾多少行...
有可能吗?
答案 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