如何在awk命令中使用命令输出?

时间:2015-12-02 22:39:02

标签: bash variables awk pipe

我想打印出日志文件的最后一次更新,而不是它上面的任何内容(旧日志)。每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而不是变量的方法?

2 个答案:

答案 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/。然后,一旦读取文件,它就会遍历数组,打印所有最近保存的值。