如何增加“用户”列的 ps 列宽度?

如何增加“用户”列的 ps 列宽度?

我喜欢这个图案ps aux | grep something

这样我就可以轻松找到所需的信息,而无需记住命令的命令行选项ps

不幸的是,ps 命令将 Linux 用户名(第一列)截断为 7 个字符后,+如果用户名较长,则添加 a。

就我而言,这很重要,因为用户名类似于“foobar_123”和“foobar_234”。

我知道我可以使用以下命令,但如果我仍然可以使用该模式,那就太好了ps aux | grep something

ps ax o user:16,pid,pcpu,pmem,vsz,rss,stat,start_time,time,cmd

如何通过配置获得上述格式,以便ps aux | grep something不删除用户名?

提示:诸如“use ps ...special...args...”之类的答案与上述问题不匹配。

版本:procps-ng 版本 3.3.5

答案1

如果您知道带有多个选项的长命令可以满足您的要求,但您不想每次都键入它,那么(假设您使用的是 Bash)您可以创建一个别名使该命令变得更容易。例如:

alias ps_mod='ps ax o user:16,pid,pcpu,pmem,vsz,rss,stat,start_time,time,cmd'

然后你只需输入这个简单的命令即可。您可以将此行添加到 ~/.bash_profile (或 ~/.bashrc,具体取决于您的系统)文件中,以便在登录时自动定义它。

如果您不使用 Bash,那么您可能可以通过定义 shell 函数来执行类似的操作。

答案2

小补丁procps-ng 源

似乎对源代码进行快速修补就可以解决问题;通常,用户列设置为 8,并将按如下详述进行截断。

补丁适用于标记为 v3.3.5 的提交 64fa8898(上面链接)

如果你要编译它,你最好下载最新的源代码 - 我建议下载最新的源代码并将 procps-ng 源文件中的“USER”行ps/output.c从 8 编辑到 16,如下所示,而不是修补旧的(2013 年左右)版本:

---
 ps/output.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/ps/output.c b/ps/output.c
index 9644ed3..41c2eda 100644
--- a/ps/output.c
+++ b/ps/output.c
@@ -1564,7 +1564,7 @@ static const format_struct format_array[] = {
 {"uname",     "USER",    pr_euser,    sr_euser,   8, USR,    DEC, ET|USER}, /* man page misspelling of user? */
 {"upr",       "UPR",     pr_nop,      sr_nop,     3,   0,    BSD, TO|RIGHT}, /*usrpri*/
 {"uprocp",    "UPROCP",  pr_nop,      sr_nop,     8,   0,    BSD, AN|RIGHT},
-{"user",      "USER",    pr_euser,    sr_euser,   8, USR,    U98, ET|USER}, /* BSD n forces this to UID */
+{"user",      "USER",    pr_euser,    sr_euser,  16, USR,    U98, ET|USER}, /* BSD n forces this to UID */
 {"usertime",  "USER",    pr_nop,      sr_nop,     4,   0,    DEC, ET|RIGHT},
 {"usrpri",    "UPR",     pr_nop,      sr_nop,     3,   0,    DEC, TO|RIGHT}, /*upr*/
 {"util",      "C",       pr_c,        sr_pcpu,    2,   0,    SGI, ET|RIGHT}, // not sure about "C"
-- 

附录

根据消息来源ps

// The Open Group Base Specifications Issue 6 (IEEE Std 1003.1, 2004 Edition)
// requires that user and group names print as decimal numbers if there is
// not enough room in the column.  However, we will now truncate such names
// and provide a visual hint of such truncation.  Hopefully, this will reduce
// the volume of bug reports regarding that former 'feature'.
//
// The UNIX and POSIX way to change column width is to rename it:
//      ps -o pid,user=CumbersomeUserNames -o comm
// The easy way is to directly specify the desired width:
//      ps -o pid,user:19,comm
//

答案3

这个问题是 2014 年在 askubuntu.com 论坛上提出的

我的解决方案受到上述链接的启发,但具有一些可移植性。将此函数添加到您的 .bashrc 中并继续使用它!

ps() {
    if [[ $@ =~ .u* || *u ]]; then
        command getent passwd |\
        awk -F':' ' \
        !len || length($1) > len {len=length($1);s=$1}\
        END{print s, len; system("ps axo user:"len",pid,pcpu,pmem,vsz,rss,tty,stat,start,time,comm");}'
    else
        command ps "$@"
    fi
}

ps aux | grep someshit像平常一样,将上述函数添加到您的 ~/.bashrc 中,并享受格式化为最大可能用户名的输出,该用户名是使用 getent 从 /etc/passwd 以友好的常规用户方式确定的 - 然后通过 awk 进行解析bash 帮助保存与最长用户名字符串相关的整数值。

现在当我

$ ps axu | grep this

或者

$ ps uaz | grep this

或者

$ ps aux | grep this

输出:

thisisareallylonguser 9289 0.0 0.0 23192 4716 pts/6 S 17:59:54 00:00:00 bash

如果您希望我单步执行 bash 函数(如果不清楚),请告诉我。

相关内容