Bash 方法查看文件开头和结尾

Bash 方法查看文件开头和结尾

在基于队列的集群上,挂起作业的队列通过命令显示,例如showqueue

该命令以列的形式返回合理数据的列表,例如名称等,但列/数据对于问题并不重要。

watch我喜欢有时使用该实用程序watch showqueue(使用别名来alias watch="watch "强制我的命令的别名扩展以观看)。前几行有有价值的数据(正在运行的作业),然后是待处理的作业等,最后有一些有价值的摘要。

然而,有时 showqueue 的输出会超出屏幕(难以置信,我知道)!理想情况下,我希望有某种方法能够同时看到文件的开头和结尾。

到目前为止我拥有的最好的是:showqueue > file; head -n 20 file > file2; echo "..." >> file2 ; tail -n 20 file >> file2; cat file2,并使用watch它的别名。

有谁知道有什么更灵活或更单一的实用程序吗?我的解决方案变得有点糟糕,bash 循环使“...”中断多行,它根本不适应调整终端窗口的大小,而且我确信我错过了更多。

有什么建议么?

答案1

您想做类似以下的事情吗?显示头部和尾部的输出。

$ showqueue | (head && tail)

答案2

使用与您相同的方法,使用临时文件,但稍微短一些:

showqueue >/tmp/q.out; head -n 20 /tmp/q.out; echo '...'; tail -n 20 /tmp/q.out

这不会遇到所讨论的相同问题在另一个答案下, 但如果输出少于 40 行,则可能会显示相同的行两次。

答案3

awk解决从头部和尾部显示任意数量的行(更改n=3设置数量):

$ seq 99999 | awk -v n=3 'NR <= n; NR > n { a[NR] = $0; delete a[NR-n]; } 
     END { print "..."; for (i = NR-n+1; i <= NR; i++) if (i in a) print a[i]; }'
1
2
3
...
99997
99998
99999

正如所写,头部和尾部将不是重叠,即使输入比2*n行短。

在某些 awk 实现中,使用for (x in a) print a[x];inEND部分也可以。但一般来说,它不能保证以正确的顺序返回数组条目,并且在例如 mawk 中也不是这样。

答案4

您可以使用简单的 awk 脚本。添加了循环缓冲区,其中 n=3 用于最后 3 行

awk 'NR<=n {print $0} { A[NR%n]=$0 } END { for (i=1; i<=n; ++i) if (NR+i>2*n)print A[(NR+i)%n] }' n=3 < <( seq 10 )

更新后就不再简单了,

相关内容