【问题标题】:use 'grep' command the way column names would be preserved使用“grep”命令保留列名的方式
【发布时间】:2017-06-19 21:57:59
【问题描述】:

我注意到“grep”命令会删除列名。 我需要根据以下命令自定义进程的输出:

ps -ef | egrep "java|mysql" | awk {'print $1, $2, $8'}

常规的“ps”(甚至是“awk”)都有列名:UID、PID 等... 但是,当我添加“grep”时,列名消失了。 理想情况下,我必须具有显示 4 列的“ps”输出 - PID、用户名、CMD 和内存使用情况。 我如何让它保留列名。

【问题讨论】:

  • top -p$pid 怎么样?

标签: linux bash


【解决方案1】:

grep 命令将去除标题,因为它们不匹配。只需使用awk 并匹配第一行条件以及搜索模式。

ps -ef |  awk 'NR==1{print $1,$2,$8} /java|mysql/{print $1, $2, $8}'

【讨论】:

  • 谢谢,它可以工作,但不幸的是,它不能完全满足我的需要。我正在尝试使用ps -aux | awk 'NR==1{print $1,$2,$8} /java|mysql/{print $1, $2, $8}' 来使用内存。问题是我必须只监视从“/ opt”目录启动的进程,而这里的“grep”会修剪标题。 @merlin2011 - 除了 'grep' 有什么过滤方法吗?
  • 我不清楚您的问题与使用或不使用 grep 有什么关系。我的答案不使用 grep。
  • 是的,它满足我的需要,但只是部分满足。我只想过滤来自特定目录的进程:ps -aux | awk 'NR==1{print $2,$1,$4,$3,$11} /java|mysql/{print $2,$1,$4,$3,$11}' 其中 $11 是命令本身(标题 COMMAND)。在其他情况下,我会使用| grep /opt 对其进行过滤,但在您的解决方案的情况下,它会破坏标题。你知道如何在没有 grep 的情况下按目录过滤吗?
  • 忘记标记 - @merlin2011
  • 嗨@merlin2011,我对您的解决方案进行了一些修改,现在它100% 满足了我的需求。它看起来像:ps -aux | awk 'NR==1{print $2,$1,$4,$3,$11} /java|mysql/{print $2,$1,$4,$3,$11}' | sed -e '1b' -e '/opt/!d'
【解决方案2】:

利用bash 的力量。

$ cat pid_top.sh
#!/bin/bash

echo "Enter String:"
read p

top -n 1 -b -p $(ps -e | grep $p | awk '{print $1}') | tail -n 2

别忘了chmod +x pid_top.sh

创建别名或按名称运行脚本,输入字符串,例如对于 firefox,只需 fire 你将拥有并输出如下:

$ ./p*
Enter String:
fire
PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     ZEIT+ BEFEHL
2983 bang      20   0 1605624 600168 108940 S   0,0 15,1  40:28.10 firefox

【讨论】:

  • 嗨@John,感谢您的评论。但是,您的建议似乎与台式机更兼容,而不是强化服务器。无论如何,我用另一个应用程序尝试了它并得到以下输出:top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]
猜你喜欢
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2019-04-02
相关资源
最近更新 更多