Bash Awk多列顶部

Bash Awk多列顶部,bash,awk,newline,eol,Bash,Awk,Newline,Eol,在RedHat上,使用此命令,前十位cpu用户: top -n 1 -b -c|head -17|tail -11 我只需要PID、USER、%CPU、%MEM、TIME+、和COMMAND列 理想情况下,我希望第一列之间的制表符,然后命令列通常使用空格分隔符打印 因此,类似于: top -n 1 -b -c|head -17|tail -11|awk '{print $1"\t"$2"\t"$9"\t"$10"\t"$11"\t"} {for (i=12;i<=NF;i++) prin

在RedHat上,使用此命令,前十位cpu用户:

top -n 1 -b -c|head -17|tail -11
我只需要PID、USER、%CPU、%MEM、TIME+、和COMMAND列

理想情况下,我希望第一列之间的制表符,然后命令列通常使用空格分隔符打印

因此,类似于:

top -n 1 -b -c|head -17|tail -11|awk '{print $1"\t"$2"\t"$9"\t"$10"\t"$11"\t"} {for (i=12;i<=NF;i++) printf("%s ",$i)} {print ""}'
任何协助都将不胜感激。谢谢

额外帮助:如果可以将命令的第二个print语句的字符输出减少到一定长度,这可能也会有帮助。

只需更改此部分:{printf%s,$1\t$2\t$9\t$10\t$11\t}

您也可以跳过头部和尾部:

top -n 1 -b -c| awk 'NR >= 7 && NR <= 17 {printf "%s", $1"\t"$2"\t"$9"\t"$10"\t"$11"\t"; for (i=12;i<=NF;i++) printf("%s ",$i); print ""}'
您可以使用OFS输出字段分隔符变量,以便print为您处理选项卡:

top -n 1 -b -c| awk -vOFS="\t" 'NR>6 && NR<18 {s=""; for (i=12;i<=NF;++i) s=s FS $i; print $1,$2,$9,$10,$11,s}'

其中N是命令的最大长度。

看起来不错。谢谢你的帮助!这里唯一的问题是命令部分只打印程序的第一个空格分隔的部分——从技术上讲,这是top命令的默认值,除了我添加了-c以获取更多内容之外。@user2802708刚刚发现了这一点。我刚刚对它进行了编辑,以便打印整个命令。@user2802708我还演示了如何限制命令字符串的长度。我对它进行了一些修改,以适应格式,它看起来很棒!谢谢top-n1-b-c | grep-v top-n | awk-vOFS=\t'NR>6&&NR
top -n 1 -b -c| awk -vOFS="\t" 'NR>6 && NR<18 {s=""; for (i=12;i<=NF;++i) s=s FS $i; print $1,$2,$9,$10,$11,s}'
print $1,...,substr(s,0,N)