我想使用管道从任何命令输出固定高度:
some_command | magic_command -40
例如,如果 some_command 打印 3 行,则 magic_command 应添加 37 个换行符,
或者如果 some_command 打印 50 行,magic_command 应该删除额外的行(如 head -40)
答案1
POSIXly:
{ command; while :; do echo; done; } | head -n 40
在 GNU 系统上:
{ command; yes ""; } | head -n 40
答案2
使用 awk:
awk -v c=40 'NR>c{exit} 1; END{for(i=NR+1;i<=c;i++)print""}'
怎么运行的
-v c=40
这定义了我们想要的行数。
NR>c{exit}
如果我们打印了多
c
行,则退出。1
这是 awk 打印该行的神秘简写。
END{for (i=NR+1; i<=c; i++) print ""}
如果我们已经到达输入的末尾,则继续打印空行,直到我们读取
c
输出的总行数。
例子
为了便于说明,我们将所需的输出缩短为五行:
$ seq 2 | awk -v c=5 'NR>c{exit} 1; END{for(i=NR+1;i<=c;i++)print""}'
1
2
$ seq 10 | awk -v c=5 'NR>c{exit} 1; END{for(i=NR+1;i<=c;i++)print""}'
1
2
3
4
5
答案3
这魔法命令可以遵循:
#!/bin/bash
#USAGE: Pass output of any command via ./magic.sh LINE_NUMBER
i=$1
while ((i--)) ; do
read && echo $REPLY || echo
done
例子:
seq 4 | ./magic.sh 3
1
2
3
seq 4 | ./magic.sh 6
1
2
3
4
-
-
- «-» 标记空行