我想计算文件中的页数/var/log/messages
,以便我可以使用pr
命令从我想要的页面开始打印。
例如,假设该/var/log/messages
文件包含 300 页,那么我可以使用以下命令打印最后 5 页。
pr +295 /var/log/messages
注意:pr
当我们指定的页码超过文件中可用页数时,命令将列出页数,如下所述。
pr +400 /var/log/messages
pr: starting page number 400 exceeds page count 313
话虽如此,我想知道是否有特定的命令来查找页数。
答案1
pr
文本文件的默认页面长度为56
。因此您可以这样做:
$ perl -MPOSIX=ceil -nle 'END{print ceil($./56)}' file
如果您想计算许多文件,请尝试:
$ perl -MPOSIX=ceil -nle '
if (eof) {
print ceil($./56);
close ARGV;
}
' file1 file2 file3
答案2
pr
我构建了一个非常可怕的 hack 来从输出本身中提取这些信息。如果您pr
在文件上使用,默认情况下,它将在每个页面上输出一个带有表单页码的标题
2014-07-04 11:40 file.txt Page 1
因此,您可以运行pr
该文件,从输出中提取最后一个标头,然后从该标头中提取页码。
例如,使用以下命令之一:
pr file.txt | awk '/file.txt\s+Page/{ print $5; }' | tail -n1
或者
pr file.txt | awk '/file.txt/ && /Page/{ print $5; }' | tail -n1
您将获得所需的信息。
例子:
> pr grapher.cpp | awk '/file.txt .* Page/'
2014-07-04 11:40 file.txt Page 1
2014-07-04 11:40 file.txt Page 2
> pr file.txt | awk '/file.txt\s+Page/{ print $5; }' | tail -n1
2
此方法的优点之一是您可以通过选项调整行数和列数,pr
并且仍然获得正确的结果。唯一的问题是某些选项从输出中删除标题......