我有一个巨大的日志文件。我需要找到一些东西并打印最后一行。像这样:
tail -n +1 "$log" | awk '$9 ~ "'$something'" {print $0}' | tail -n1
但是当我执行此命令时,tail
从第1行开始并读取所有行。并且运行几分钟。
如何从最后一行开始阅读并在找到某些内容时停止?所以也许我不需要读取所有行并运行几秒钟。因为我需要关于$something
的最后一行。
答案 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
tac
:cat
的反面: - )
grep -m
:首次搜索并停止
答案 3 :(得分:1)
tail -1000
仅占用文件中的最后1000行。
你可以grep那个部分,但你不知道你grep的东西是否发生在早期的行中。没有办法向后退“。”