【问题标题】:How to display a few line from the last few lines for a given number of files?对于给定数量的文件,如何显示最后几行中的几行?
【发布时间】:2017-05-01 18:34:30
【问题描述】:

我有一个包含许多不同文件的文件夹。 我想显示文件列表最后 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

上面显示的几乎是我需要的,但我还需要每个结果的文件名来自,但对于我的生活,我不知道该怎么做。

【问题讨论】:

标签: linux grep find tail


【解决方案1】:

使用 GNU awk 处理 ENDFILE:

$ 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

【讨论】:

  • 好一个!恭喜你的 80K :)
【解决方案2】:
for f in file_*
do
    echo "$f"
    tail -n 10 "$f" | grep test_result
done

【讨论】:

  • 这很棒。我没有使用 echo,而是使用了 printf,这会将结果放在每个文件名后面,从而更容易处理数据。
【解决方案3】:

你可以这样做:

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

这是可行的,因为默认情况下,当与 glob (*) 一起使用时,tail 将打印如下所示的文件名:

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

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

==> file7 <==
11

请注意,这将打印不匹配的文件名,例如:

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

这种行为可能会或可能不会被接受(我个人想知道与 test_result 不匹配的文件)

【讨论】:

  • 这行得通,虽然我更喜欢结果和它的文件名在同一行。 'If' 语句非常适合这种用途。
  • /dev/null 添加到 arg 列表 (tail -n10 file* /dev/null) 中,即使 globbing 仅匹配 1 个真实文件名,您也可以获得文件名输出。否则,如果 file* 只匹配 1 个文件名,则 tail 不会输出该文件名。这是 grep 之前的一个技巧 -H 参数...
猜你喜欢
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多