如何为给定数量的文件显示最后几行的几行?

时间:2017-05-01 18:34:31

标签: linux grep find tail

我有一个包含许多不同文件的文件夹。 我想显示文件列表最后100行的特定行。

到目前为止,我已经尝试了Grep和Tail,但都没有给我我想要的东西:

示例:该文件夹包含以下文件:

  • file_1.txt
  • file_2.txt
  • file_3.txt
  • other_file.txt
  • other_file2.txt

file_n.txt 的内容为:

  • 第88行:test_result:18209102
  • 第89行:再见
  • ......
  • 第98行:test_result:18202232
  • 第99行:再见

目标: 仅列出每个 file_n.txt 的最后10行的 test_result (第90行到第99行)

到目前为止我尝试过:

tail -n 10 file_* | grep test_result

上面的显示几乎是我需要的,但我也需要每个结果的文件名来自,但对于我的生活,我无法弄清楚如何去做。

3 个答案:

答案 0 :(得分:2)

使用ENDFILE的GNU awk:

$ seq 20 > file1
$ seq 30 > file2

$ awk '/5/{hits[FNR]=$0} ENDFILE{for (i=FNR-10;i<=FNR;i++) if (i in hits) print FILENAME, hits[i]; delete hits}' file1 file2
file1 15
file2 25

上面打印了每个输入文件的最后10行中出现的所有数字5

答案 1 :(得分:1)

你可以这样做:

tail -n10 file* |grep -e '==>' -e 'test_result'

这是有效的,因为默认情况下尾部与globs(*)一起使用时会打印文件名,如下面的文字:

$ tail -n10 file*
==> file5 <==
home
help
variables
compatibility
#modelines

==> file6 <==
[ $# != 2 ] && echo ok;

==> file7 <==
11

请注意,这将打印与以下内容不匹配的文件名:

==> file1 <==
==> file2 <==
==> file3 <==
test_result: XXXX
==> file4 <==

此行为可能是也可能不可接受(我个人想知道与test_result不匹配的文件)

答案 2 :(得分:1)

for f in file_*
do
    echo "$f"
    tail -n 10 "$f" | grep test_result
done