我想打印出日志文件的最后一次更新,而不是它上面的任何内容(旧日志)。每5分钟更新/附加日志,并且没有选项可以覆盖而不是追加。每次更新的行数不会改变 now ,但我不想在添加新字段时更改脚本。每个附属物都以“Date:....”
开头到目前为止,这是我的解决方案。我找到了最后一次出现“Date”的行号,然后尝试将其发送到“awk'NR> line_num_here filename” -
line=$(grep -n Date stats.log | tail -1 | cut --delimiter=':' --fields=1) | awk "NR>$line" file.log
但是,我无法更新$ line!它从我第一次运行脚本时始终保持第一个值。有没有办法正确更新$ line?或者还有其他方法吗?也许是一种直接输入awk而不是变量的方法?
答案 0 :(得分:1)
您的解决方案中的问题是您需要用awk
替换;
前面的管道。这是两个单独的命令,通常会出现在两个单独的行中:
line=$(...)
awk -v "NR>$line" file
但是,如果应该出现在同一行,您可以用;
分隔它们:
line=$(...); awk -v "NR>$line" file
但无论如何,你可以大大简化命令。只需使用两次awk
两次,如下所示:
awk -v ln="$(awk '/Date/{l=NR}END{print l}' a.log)" 'NR>ln' a.log
我正在使用
awk '/Date/{l=NR}END{print l}' a.log
获取最后一次出现 Date 的行号。该值通过-v ln=...
传递给外部awk命令。
答案 1 :(得分:0)
这是一种你可以做到的方法,在一次awk调用中只读取一次文件:
awk '/Date/ { n = 1 } { a[n++] = $0 } END { for (i = 1; i < n; ++i) print a[i] }' file
这会将每一行写入数组a
,每次模式n
匹配时,将计数器1
重置为/Date/
。然后,一旦读取文件,它就会遍历数组,打印所有最近保存的值。