如何使用标题grep ps输出

Web*_*net 33 linux

如何在标头就位的情况下 grep PS 输出?

这两个进程组成了一个在我的服务器上运行的应用程序......

root     17123 16727  0 16:25 pts/6    00:00:00 grep GMC
root     32017     1 83 May03 ?        6-22:01:17 /scripts/GMC/PNetT-5.1-SP1/PNetTNetServer.bin -tempdir /usr/local/GMC/PNetT-5.1-SP1/tmpData -D
Run Code Online (Sandbox Code Playgroud)

6-22:01:17意味着它已经运行了6天?我正在尝试确定进程运行了多长时间......

第二列是进程ID吗?所以如果我这样做kill 32017会杀死第二个进程?

Hyp*_*ppy 54

ps -ef | egrep "GMC|PID"
Run Code Online (Sandbox Code Playgroud)

ps根据需要更换“GMC”和开关。

示例输出:

root@xxxxx:~$ ps -ef | egrep "disk|PID"

UID        PID  PPID  C STIME TTY          TIME CMD
paremh1  12501 12466  0 18:31 pts/1    00:00:00 egrep disk|PID
root     14936     1  0 Apr26 ?        00:02:11 /usr/lib/udisks/udisks-daemon
root     14937 14936  0 Apr26 ?        00:00:03 udisks-daemon: not polling any devices
Run Code Online (Sandbox Code Playgroud)

  • 添加一些关于“为什么”有效的信息会很好。 (8认同)
  • 所以 `ps -e` 选择所有进程,而 `ps -f` 是显示列标题的完整格式列表。然后我们将列标题和输出通过管道传输到 egrep,它是 grep 的扩展,并允许管道 `|` 具有特殊含义,即 OR(这个 OR 那)。因此,您最终会匹配列标题中的 PID 以及重要的输出行。 (7认同)
  • 不,这是用户的练习。 (2认同)

Vic*_*Lau 24

感谢 geekosaur,我想用这个命令来满足你的需求,而不是一个单独的命令:

ps -ef | head -1; ps -ef | grep "your-pattern-goes-here"
Run Code Online (Sandbox Code Playgroud)

棘手的是使用“;” shell 支持链接命令。

  • 哦等等......你已经重复了`ps -ef`。更好的是`ps -ef | {头-1; grep "你的模式" ; }` (5认同)
  • 找到关于这种技术的解释,称为“分组命令”,为了其他人的好奇心,请参阅:http://www.gnu.org/software/bash/manual/html_node/Command-Grouping.html (3认同)
  • 这比公认的答案更清洁、更可靠。它不会断言标头中包含 PID,并且不会增加 grep 字符串的复杂性。 (2认同)
  • 经过一些实验,看起来 `head`(来自 `coreutils 8.32` 的 GNU `head`)读取了前 1024 个字节,这些字节然后不再可用于后续命令。完全反驳构造`cmd1 | { cmd2; cmd3; }` 将 `cmd1` 的整个输出复制到 `cmd2` 和 `cmd3`,我们只需要使用一个完全消耗输出的命令作为第一个命令: `printf 'foo\nbar\nbaz \n' | { grep nomatch; 猫 - }`。输出将为空(如果使用副本,人们会期望`cat -` 打印整个输入)。 (2认同)

gee*_*aur 6

第二列是进程ID;4th 是创建进程的时间(这通常是您的程序启动的时间,但并非总是如此;请考虑execve()和朋友们);第 6 个是消耗的 CPU 时间量。所以它已经运行了 8 天并使用了将近 7 天的 CPU 时间,我认为这令人担忧。

在同一个调用中获取标头充其量是棘手的;我只是做一个单独的ps | head -1. 您可能会考虑使用ps自己的选择方法或类似的方法pgrep代替grep,这并不是真正设计用于传递标题。


Edu*_*nec 5

egrep 解决方案既简单又有用,但当然您依赖于始终包含“PID”的标头(尽管这是一个非常合理的假设)以及在其他地方不出现的相同字符串。我猜这足以满足您的需求,但是如果有人想要替代方案,则可以使用 sed。

Sed 让您只需说“打印第一行,然后打印包含该模式的任何行”。例如:

ps auxwww | sed -n '1p; /PROCESS_NAME_TO_SEARCH/p;'
Run Code Online (Sandbox Code Playgroud)

添加/sed -n/d;以过滤 sed 本身:

ps auxwww | sed -n '1p; /sed -n/d; /PROCESS_NAME_TO_SEARCH/p;'
Run Code Online (Sandbox Code Playgroud)


All*_*ckt 5

更简单的选择: ps -ef | { head -1; grep GMC; }

用显示标题的行数替换数字。

  • 我喜欢这种方法,但命令最后需要另一个分号。`ps -ef | {头-1; grep GMC; }`。我也喜欢它在如下函数中:`function pgrep() { ps -ef | {头-1; grep $@; } }` (2认同)