如何从尾部的最后一行开始?

时间:2014-12-01 15:54:36

标签: bash awk grep tail

我有一个巨大的日志文件。我需要找到一些东西并打印最后一行。像这样:

tail -n +1 "$log" | awk '$9 ~ "'$something'" {print $0}' | tail -n1

但是当我执行此命令时,tail从第1行开始并读取所有行。并且运行几分钟。

如何从最后一行开始阅读并在找到某些内容时停止?所以也许我不需要读取所有行并运行几秒钟。因为我需要关于$something的最后一行。

4 个答案:

答案 0 :(得分:3)

请注意,您说tail -n +1 "$log",由tail解释为:从第1行开始阅读。所以你实际上在做cat "$log"

您可能想说tail -n 1 "$log"+之前没有1)来获取最后n行。

此外,如果您想获得$something的最后一场比赛,您可能需要使用tac。这会向后打印一个文件:首先是最后一行,然后是倒数第二行......最后是第一行。

所以,如果你这样做

tac "$log" | grep -m1 "$something"

这将打印$something的最后一个匹配项,然后退出,因为-mX会打印第一个X个匹配项。

当然,您也可以使用awk

tac "$log" | awk -v pattern="$something" '$9 ~ pattern {print; exit}'

请注意使用-v来为awk提供变量。这样就可以避免在代码中混淆单引号和双引号。

答案 1 :(得分:2)

而不是tail,请使用tac。它会反转文件,你可以在第一次grep时退出:

tac "$log" | awk '$9 ~ "'$something'" {print $0;exit}'

答案 2 :(得分:2)

tac $FILE | grep $SOMETHING -m 1

taccat的反面: - )

grep -m:首次搜索并停止

答案 3 :(得分:1)

tail -1000仅占用文件中的最后1000行。 你可以grep那个部分,但你不知道你grep的东西是否发生在早期的行中。没有办法向后退“。”