在基于队列的集群上,挂起作业的队列通过命令显示,例如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 )
更新后就不再简单了,