在终端中仅输出“ ps”命令的COMMAND下的列


12

我知道我们可以轻松找到以下内容:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

使用以下命令来查看所有正在运行的进程:

sudo ps aux

我的问题是,是否可能仅显示下面的列的输出,COMMAND而没有其他显示?

Answers:


18

使用-o标志。

仅列出您自己的过程

 ps -o command  

列出所有系统进程

 ps -e -o command

这不是列出命令的唯一方法,它们既可以打印带有命令行标志,也可以仅作为可执行文件打印(这是command选项的作用)。

根据我的评论,答案是:

command,args和cmd都给出完整的命令。实际上,手册页状态command和cmd是args的别名,其中包括-标志。通讯只给出可执行文件的名称。别名为ucmd和ucomm。我误解了AIX选项,这些选项实际上可以用类似于printf的格式指定,%a表示args,%c表示comm

请参阅man ps有关用法和可用格式选项的更多信息

程序化方法可能有点多余,因为ps已经为我们提供了格式设置选项,但是可以使用来完成awk,这在处理列化输出时非常有用。

ps aux | awk '{ for(i=1;i<=NF;i++) {if ( i >= 11 ) printf $i" "}; printf "\n" }'

但是请注意,如果用户名包含空格,则此代码将中断john doe。可以通过添加gsub功能进行修改,该功能将从ps列表中删除您的用户名。但是,如果有多个用户登录到系统,则可能很难清除输出中的所有用户名。因此,您可以看到该-o标志更为可取。

旁注,sudo对于列出所有带有ps


谢谢!ps -eo command&之间有什么区别ps -eo comm?我发现的唯一区别是在command输出中是这样的:[kthreadd]而在comm输出中是这样的:kthreadd。这表示什么吗?
拉斐尔2015年

根据手册页,@ Raphael的区别comm是AIX格式,command标准GNU样式格式也是如此。AIX是另一个类似于* NIX的系统,因此该选项可用于兼容性。否则,没有区别
Sergiy Kolodyazhnyy 2015年

@Serg,我刚刚执行了diff <(ps -eo comm) <(ps -eo command),那里似乎有些吵闹声,您能澄清一下吗?
安德鲁(Andrew)

请注意,awk如果用户名包含空格(此处),则解决方案就会中断;也可能只是ps aux | awk '{ for(i=11;i<=NF;i++) {printf $i" "}; printf "\n" }'
kos

2
@Andrew因此,我已经阅读了更多手册。因此commandargscmd都给出了完整的命令。实际上,手册页指出commandcmd是的别名args,并带有-标志。该comm只给出exacutable的名称。的别名是ucmducomm。我误解了AIX选项,这些选项实际上可以用类似于printf的格式指定,%a表示args,%c表示comm
Sergiy Kolodyazhnyy

4

一种更通用的方式。我们确定命令的列。这样,使用哪个开关都没有关系ps

ps ax | awk -v p='COMMAND' 'NR==1 {n=index($0, p); next} {print substr($0, n)}'

样品输出

% ps aux | awk -v p='COMMAND' 'NR==1 {n=index($0, p); next} {print substr($0, n)}'
/sbin/init splash
[kthreadd]
[ksoftirqd/0]
[kworker/0:0H]
[rcu_sched]
[rcu_bh]
[migration/0]
[watchdog/0]
[watchdog/1]
[migration/1]
[ksoftirqd/1]
[kworker/1:0H]
[watchdog/2]
[migration/2]
[ksoftirqd/2]
[kworker/2:0H]
[khelper]
[kdevtmpfs]
[netns]
[perf]
[khungtaskd]
[writeback]
[ksmd]
[khugepaged]
[crypto]
[kintegrityd]
[bioset]
[kblockd]
[ata_sff]
[md]
[devfreq_wq]
[kswapd0]
[fsnotify_mark]
[ecryptfs-kthrea]
[kthrotld]
[acpi_thermal_pm]
[scsi_eh_0]
[scsi_tmf_0]
[scsi_eh_1]
[scsi_tmf_1]
[ipv6_addrconf]
[deferwq]
[charger_manager]
[kpsmoused]
[scsi_eh_2]
[scsi_tmf_2]
[kworker/0:1H]
[jbd2/sda1-8]
[ext4-rsv-conver]
[kauditd]
[kworker/0:2]
/lib/systemd/systemd-journald
/lib/systemd/systemd-udevd
[…]

那是什么pstree呢?

样品输出

% pstree -alU
systemd splash
  ├─ModemManager
  │   ├─{gdbus}
  │   └─{gmain}
  ├─NetworkManager --no-daemon
  │   ├─dhclient -d -q -sf /usr/lib/NetworkManager/nm-dhcp-helper -pf /run/sendsigs.omit.d/network-manager.dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-57cfb005-1dc6-410d-aebc-16d8d152abfd-eth0.lease -cf /var/lib/NetworkManager/dhclient-eth0.conf eth0
  │   ├─dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d
  │   ├─{gdbus}
  │   └─{gmain}
  ├─VBoxClient --clipboard
  │   └─VBoxClient --clipboard
  │       └─{SHCLIP}
  ├─VBoxClient --display
  │   └─VBoxClient --display
  │       └─{VT_MONITOR}
  ├─VBoxClient --seamless
  │   └─VBoxClient --seamless
  │       └─{X11 events}
  ├─VBoxClient --draganddrop
  │   └─VBoxClient --draganddrop
  │       ├─{dndHGCM}
  │       └─{dndX11}
  ├─VBoxService --pidfile /var/run/vboxadd-service.pid
  │   ├─{automount}
  │   ├─{control}
  │   ├─{cpuhotplug}
  │   ├─{memballoon}
  │   ├─{timesync}
  │   ├─{vminfo}
  │   └─{vmstats}
  ├─VBoxService
  │   ├─{automount}
  │   ├─{control}
  │   ├─{cpuhotplug}
  │   ├─{timesync}
  │   ├─{vminfo}
  │   └─{vmstats}
  ├─accounts-daemon
  │   ├─{gdbus}
  │   └─{gmain}
  ├─agetty --noclear tty1 linux
  ├─apache2 -k start
  │   ├─apache2 -k start
  │   ├─apache2 -k start
  │   ├─apache2 -k start
  │   ├─apache2 -k start
  │   └─apache2 -k start
  ├─at-spi-bus-laun
  │   ├─dbus-daemon --config-file=/etc/at-spi2/accessibility.conf --nofork --print-address 3
  │   ├─{dconf worker}
  │   ├─{gdbus}
  │   └─{gmain}
  ├─at-spi2-registr --use-gnome-session
  │   ├─{gdbus}
  │   └─{gmain}
  ├─atd -f
  ├─avahi-daemon
  │   └─avahi-daemon
  ├─cgmanager -m name=systemd
  ├─colord
  │   ├─{gdbus}
  │   └─{gmain}
  ├─console-kit-dae --no-daemon
  │   ├─62*[{console-kit-dae}]
  │   ├─{gdbus}
  │   └─{gmain}
  ├─cron -f
  ├─cups-browsed
  │   ├─{gdbus}
  │   └─{gmain}
  ├─cupsd -l
  │   └─dbus dbus:// 
  ├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
  ├─dnsmasq -u lxc-dnsmasq --strict-order --bind-interfaces --pid-file=/run/lxc/dnsmasq.pid --listen-address 10.0.3.1 --dhcp-range 10.0.3.2,10.0.3.254 --dhcp-lease-max=253 --dhcp-no-override --except-interface=lo --interface=lxcbr0 --dhcp-leasefile=/var/lib/misc/dnsmasq.lxcbr0.leases --dhcp-authoritative
  ├─gdm
  │   ├─gdm-session-wor
  │   │   ├─gdm-x-session /usr/bin/gnome-session --autostart /usr/share/gdm/greeter/autostart
  │   │   │   ├─Xorg vt7 -displayfd 3 -auth /run/user/120/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3
  │   │   │   │   ├─{llvmpipe-0}
  │   │   │   │   ├─{llvmpipe-1}
  │   │   │   │   └─{llvmpipe-2}
  │   │   │   ├─dbus-daemon --print-address 4 --session
  │   │   │   ├─gnome-session-b --autostart /usr/share/gdm/greeter/autostart
  │   │   │   │   ├─gnome-settings-
  │   │   │   │   │   ├─{dconf worker}
  │   │   │   │   │   ├─{gdbus}
  │   │   │   │   │   ├─{gmain}
  │   │   │   │   │   └─{pool}
  │   │   │   │   ├─gnome-shell --mode=gdm
  │   │   │   │   │   ├─ibus-daemon --xim --panel disable
  │   │   │   │   │   │   ├─ibus-dconf
  │   │   │   │   │   │   │   ├─{dconf worker}
  │   │   │   │   │   │   │   ├─{gdbus}
  │   │   │   │   │   │   │   └─{gmain}
  │   │   │   │   │   │   ├─ibus-engine-sim
  │   │   │   │   │   │   │   ├─{gdbus}
  │   │   │   │   │   │   │   └─{gmain}
  │   │   │   │   │   │   ├─{gdbus}
  │   │   │   │   │   │   └─{gmain}
  │   │   │   │   │   ├─{JS GC Helper}
  │   │   │   │   │   ├─{JS Sour~ Thread}
  │   │   │   │   │   ├─{Sync}
  │   │   │   │   │   ├─{dconf worker}
  │   │   │   │   │   ├─{gdbus}
  │   │   │   │   │   ├─{gmain}
  │   │   │   │   │   ├─{llvmpipe-0}
  │   │   │   │   │   ├─{llvmpipe-1}
  │   │   │   │   │   ├─{llvmpipe-2}
  │   │   │   │   │   └─{threaded-ml}
  │   │   │   │   ├─{dconf worker}
  │   │   │   │   ├─{gdbus}
  │   │   │   │   └─{gmain}
  │   │   │   ├─{gdbus}
  │   │   │   └─{gmain}
  │   │   ├─{gdbus}
  │   │   └─{gmain}

[…]

添加了更通用的方式。
AB

布拉沃,AB!您解决了我和@kos试图找出的问题-消除了用户名
Sergiy Kolodyazhnyy 2015年

1

我从这里找到了一种轻松的方法来实现这一目标

sudo ps aux | rev | cut -d ' ' -f 1 | rev

rev反转的输出,ps然后进行剪切可以帮助您界定第一个字段(最后一个字段),然后再次反转它...

为我工作。


2
用这种方法无法正确列出名称中带有空格的进程:ps aux其本身将列为aux
科斯

1
sudops该命令不是必需的,并且该命令会裁剪很多命令,所以它不是很准确,如果您想与colums一起使用,awk则对于该任务使用它要好得多。实际上,确切的命令是ps aux | awk '{ for(i=1;i<=NF;i++) {if ( i >= 11 ) printf $i" "}; printf "\n" }'
Sergiy Kolodyazhnyy

@kos是的,我才意识到这一点,感谢您指出,Serg awk应该可以解决。
安德鲁

@Serg + 1,OP提出了要求sudo ps,我认为awk对于此任务而言太复杂了,于是提出了cut。无论如何,您是否不应该使用该代码更新答案,以便OP可以接受它?
安德鲁

更好,但是从技术上讲,Linux上的用户名可以包含空格,这也可能导致该命令混乱。ps它不是盲目的解析。我认为这里唯一安全的方法是ps -e -o
kos
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.