【问题标题】:How to get rid of the headers in a ps command in Mac OS X ?如何摆脱 Mac OS X 中 ps 命令中的标题?
【发布时间】:2012-07-17 23:17:32
【问题描述】:

我使用了一个特定的 ps 命令,即

ps -p <pid> -o %cpu, %mem

这给了我这样的结果

 %CPU %MEM
 15.1 10.0

我想要做的只是打印这些数字,如 15.1 和 10.0,不带标题。我尝试使用 'cut' 。但它似乎适用于每一行。

echo "$(ps -p 747 -o %cpu,%mem)" | cut -c 1-5

给出类似的东西

 %CPU
  8.0

如何只获取没有标题的数字?

【问题讨论】:

  • 使用sed 1d而不是cut;它会删除第一行(并将其余部分保持不变)。
  • cut 操作列,而不是行。

标签: macos bash shell ps


【解决方案1】:

GNU 的 ps --no-headers 的 BSD(以及更普遍的 POSIX)等价物有点烦人,但是,从手册页来看:

 -o      Display information associated with the space or comma sepa-
         rated list of keywords specified.  Multiple keywords may also
         be given in the form of more than one -o option.  Keywords may
         be appended with an equals (`=') sign and a string.  This
         causes the printed header to use the specified string instead
         of the standard header.  If all keywords have empty header
         texts, no header line is written.

所以:

ps -p 747 -o '%cpu=,%mem='

就是这样。

如果您确实需要从任意命令中删除第一行,tail 可以轻松完成:

ps -p 747 -o '%cpu,%mem' | tail +2

或者,如果您想完全便携:

ps -p 747 -o '%cpu,%mem' | tail -n +2

cut 命令类似于更简单的基于行的命令headtail。 (如果你真的想削减列,它可以工作......但在这种情况下,你可能不这样做;传递你想要 ps 的 -o 参数要简单得多,而不是传递额外内容并尝试把它们剪掉。)

同时,我不确定您为什么认为需要评估某些东西作为 echo 的参数,而这与直接运行它具有相同的效果,并且只会使事情变得更加复杂。例如下面两行是等价的:

echo "$(ps -p 747 -o %cpu,%mem)" | cut -c 1-5
ps -p 747 -o %cpu,%mem | cut -c 1-5

【讨论】:

  • 这应该是公认的答案。居然告诉你怎么用ps.
  • @VivinPaliath:谢谢——但至少值得拥有其他答案。除了通常提供对 OP 学习有用的信息外,其中一些还为您提供了一个解决方案,可以在 BSD、GNU 和一些旧用户空间中可移植地工作,这可能对其他搜索者有帮助。
  • 这很好(关于其他 *nixes)。其他答案当然有用;只是我更喜欢告诉您如何使用该工具而不是必须输出的答案。 :)
  • @VivinPaliath:嗯,显然我同意(或者我不会写这个答案),我只是想确保没有人反对其他有用的答案或类似的东西。
  • 在 Solaris 上,您必须使用比 -o 更多的选项:ps -e -o pid= -o ppid= -o args=
【解决方案2】:

使用awk

ps -p 747 -o %cpu,%mem | awk 'NR>1'

使用sed

ps -p 747 -o %cpu,%mem | sed 1d

【讨论】:

  • 为什么使用sed '1d' 而不仅仅是tail +2,为什么使用echo "$(…)" 而不仅仅是?为什么要问ps %cpu,%mem,然后awk 其中一列而不是ps %cpups %mem?但是,最重要的是,为什么要求ps 打印标题只是为了剥离它们,而您可以要求它不打印它们?
  • @abarnert:在 Mac OS X 上,基于 BSD 的 ps(与 GNU ps 不同)没有记录在案的机制来抑制标题行。列的问题是有效的。 sed 1dtail +2 相比有什么问题;它们大致相当,sed 1d 的血统比tail +2 更长(很多年)。
  • @JonathanLeffler:是的,它确实具有抑制标题行的机制。看我的回答。此外,使用复杂/通用命令(如 sed、awk 等)而不是简单命令(如 tail)的问题在于,它们不会提出诸如 OP 的“NR>1 到底是什么意思”之类的问题(这会让他很多努力通过手册页弄清楚)。
  • @abarnert:好的-我寻找一个选项'抑制标题行'而不是40多个单词结尾'如果月亮处于正确的阶段并且行星正确对齐然后@987654339 @ 将省略标题。我的错! (实际上,我收回了这一点。这不是我的错;这是非常迂回且难以使用的。事实上,这很荒谬。)
  • 但格式不一样。 OP 正在执行 echo "$(…)" | foo,而您正在执行 echo "$(… | foo)",这是非常不同的。 (尽管因为它们只是不同的无操作,但事实证明这里并不重要。)这就是为什么保持简单很重要的原因——因为即使是有才华和经验丰富的编码人员(你显然知道你的东西)也可以并且确实进行这样的转换不知不觉。
【解决方案3】:

使用ps --no-headers:

--no-headers print no header line at all

或使用:

ps | tail -n +2

【讨论】:

  • 这可能适用于 Linux;它不适用于使用 ps 的 BSD 实现的 Mac OS X,而不是 GNU 版本。
  • 为 Mac 指定。 Mac 不采用--no-header 参数
【解决方案4】:

已经选出了获胜者。大佬……

如果您已经在使用-o 参数,您可以通过在名称和列名称后面加上等号来指定要打印的特定列的标题。如果你输入一个空字符串,它不会打印任何标题:

使用标准标题(如您所见):

$ ps -p $pid -o%cpu,%mem
 %CPU %MEM
  0.0  0.0

带有自定义标题(只是为了向您展示它是如何工作的):

$  ps -p $pid -o%cpu=FOO,%mem=BAR
  FOO  BAR
  0.0  0.0

带有空标题(注意它甚至不打印空行):

$ ps -p $pid -o%cpu="",%mem=""
 0.0   0.0

【讨论】:

  • 你不需要引号;你可以做-o%cpu=,%mem=(正如我在回答中所展示的那样)。
  • @abarnert 我做了我的之后看到了你的答案。我以前从未尝试过不带引号的方法,但它确实有效。
  • 是的,加上引号从来没有什么坏处,如果我在命令行即兴创作,我可能也会添加它们......(你会注意到我有一组不同的不必要的引号—从理论上讲,某些 sh ​​派生的 shell 可能会给 %cpu 赋予特殊含义,但我不相信任何实际的 shell 都会对 % 进行特殊处理,除非后面跟着一个数字,所以我只是在毫无意义地偏执。)所以,这不是批评,只是有朝一日可能会为您节省一些按键的评论。
【解决方案5】:

你可以使用下面的命令,你不需要添加 pcpu="",它对我有用:

ps -Ao pcpu=

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2021-07-30
    • 2011-03-31
    相关资源
    最近更新 更多