在Bash中动态修剪stdout线宽


9

最近,我一直在试验该ps命令,有时长路径会绕到下一行(或两行)并使其难以阅读。我想将ps输出传递到另一个程序中,以将输出限制x为字符数。

这是我到目前为止所拥有的,但是它并不正确:

ps aux | cut -c1-$(stty size | cut -d' ' -f2)

$(stty size | cut -d' ' -f2)计算结果为167,但似乎不是有效的输入cut

有没有一种方法可以使这种语法在bash中工作?


这项工作对我来说。你能提供一些输出吗?
cuonglm

动态部分在哪里?您想要在某些情况下使用不同的长度吗?似乎您想将所有输出限制为一个最大长度

@awk_FTW根据情况,我有不同的窗口设置。在全屏模式下,我的宽度为167。但是在其他尺寸下,我需要缩小。这就是为什么我要打电话给Ssty以获取尺寸。
小扁豆

尝试tput rmam; ps aux
斯特凡Chazelas

某些壳喜欢zshksh93bash端子宽度存储在$COLUMNS
斯特凡Chazelas

Answers:


5

以下作品:

ps aux | cut -c1-$(stty size </dev/tty | cut -d' ' -f2)

这也适用:

v=$(stty size | cut -d' ' -f2) ; ps aux | cut -c1-$v

问题似乎在于,stty要使其功能正常,需要在其标准输入上包含tty。以上两种方法可以解决该问题。

还有另一种选择。虽然stty在上述命令中都重定向了stdin和stdout,但其stderr却没有:它仍然指向终端。奇怪的是,stty如果给定stderr作为输入,它也将起作用:

ps aux | cut -c1-$(stty size <&2 | cut -d' ' -f2)

确实如此!这正是我想要的。很好奇,为什么要在最后添加三通tt?
小扁豆

@lentils糟糕,tee是在我调试时添加的。现在不见了。
John1024

<&2指的是什么?我以前从未见过这种记法。
小扁豆

@lentils在外壳中,文件编号。零表示标准输入,一表示标准输出,二表示标准误差。该表达式<&2表示从标准错误中获取输入。
John1024

1
stty获取在其stdin上打开的终端的设置(例如,您stty < /dev/other-tty要获取另一个终端的设置)。因此,这不是奇怪,它不会,如果它的标准输入是管道或工作<&2的作品。
斯特凡Chazelas

8

某些外壳程序(例如zshbashmksh自动将$COLUMNS变量设置为终端的宽度,因此您无需在stty此处调用。

的所有的实施方式中ps我试图支持该非标(BSD型)的语法的查询本身的终端的宽度。我很惊讶你的没有。我希望它会查看COLUMNS 环境变量的内容。

因此,您可以执行以下操作:

export COLUMNS; ps aux

如果不,

ps aux | cut -c"1-$COLUMNS"

您还可以告诉终端不要换行:

tput rmam
ps aux

4

您还可以ps更好地处理输出。

ps --width ${n:-$COLUMNS} ${opts} #set ps terminal width

ps -ww ${opts} #no word wrap

ps -o ${only_interesting_output} ${opts} #trim output

这将告诉ps您根据需要将其输出解析为您的规范。

当然,如果您不自动换行,那么就会遇到信息丢失的问题。您真的对所有流程都需要吗?如果是这样,则在寻呼机中打开它:

ps ww ${opts} | $PAGER

如果没有,请指定您要查看的内容:

ps -o args= -p $pid

另外,您可以显式通知ps您的终端--width

man ps

...

w 宽输出。两次使用此选项可获得无限宽度。

-w 宽输出。两次使用此选项可获得无限宽度。

--width n 设置屏幕宽度。

--width完全符合您所要求的规格,而不必涉及任何其他过滤器或辅助过程(这可能只会使您的-aux输出更加混乱)。而且,$COLUMNS如上所示,Stephane指出,它甚至可以动态工作。

不过,可能值得注意的是,我发现人们经常尝试添加这些不必要的过滤器,以便他们可以|pipe通过另一个过滤器来容纳a 来解析输出,这也很有可能是不必要的。当然,按人,我主要是指我。

-o我上面提到的utput操作数允许您过滤ps显示的列,并且在添加分配时,您=甚至可以根据需要命名该列。我将分配保留为空,并将其分配给目标-p进程,$pid因此唯一的输出ps就是$pid命令名称及其args调用时的输出。而且-o几乎不涉及如何定义ps将显示或不显示的表面。这是我建议您采取的方向,尤其是通过以下方式:

man ps

... 

要使用BSD语法查看系统上的每个进程:

ps ax

ps axu

要打印过程树:

ps -ejH

ps axjf

获取有关线程的信息:

ps -eLf

ps axms

获取安全信息:

ps -eo euser,ruser,suser,fuser,f,comm,label

ps axZ

ps -eM

要以用户格式查看以root(真实和有效ID)身份运行的每个进程,请执行以下操作:

ps -U root -u root u

要查看用户定义格式的每个进程,请执行以下操作:

ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm

ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm

ps -Ao pid,tt,user,fname,tmout,f,wchan

仅打印syslogd的进程ID:

ps -C syslogd -o pid=

仅打印PID 42的名称:

ps -p 42 -o comm=

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.