【问题标题】:Parsing ps and grep output in shell在 shell 中解析 ps 和 grep 输出
【发布时间】:2013-08-07 22:25:50
【问题描述】:

当我执行“ps -ef | grep port”时收到以下消息

apache    6215     1  0 11:20 ?        00:00:00 perl /scripts/myscript.pl -sn 4123E -sku HSME01-HW -port 8

有没有办法解析以下内容:

  • 开始时间 (11:20)
  • sn (4123E)
  • sku (HSME01-HW)
  • 端口 (8)

【问题讨论】:

  • “grep”不应该出现在标题中,但这没有理由对新手进行-1而不是回答他的问题!
  • 更多的是“有多少种不同的方法来解析输出”而不是“有没有办法做到这一点”。
  • 您可能会发现ps -eo start_time,args 更容易解析

标签: linux bash shell grep cgi


【解决方案1】:

您可以使用awk 进行过滤和解析:

ps -ef | awk '/[p]ort/ {printf "start time: %s\nsn: %s\nsku: %s\nport: %s\n", $5, $11, $13, $NF}'

正如 glenn jackman 在 cmets 中指出的那样,过滤字符串中的方括号会阻止表达式匹配进程列表中的过滤字符串本身。

【讨论】:

  • 因为也可能从 ps 输出中选择 awk 命令,所以使用/[p]ort/ 进行过滤
  • 谢谢安斯加尔。有人可以向我解释一下 $5、$11、$13、$NF 的含义或对应的含义吗?
  • @Jeremy awk 自动将输入行拆分为字段(默认分隔符是空格)。这些字段可以通过变量$1$2$3 等访问。$NF 是一个特殊变量,具有输入行的最后一个字段的值(NF 表示“字段数”)。在您的情况下,您也可以使用$15,但有时如果您不需要事先知道实际的字段数,它会更方便。
【解决方案2】:

由于问题被标记为bash,因此首选使用 bash-only 解决方案(无 awk 或 perl)...

LINE='apache    6215     1  0 11:20 ?        00:00:00 perl /scripts/myscript.pl -sn 4123E -sku HSME01-HW -port 8'

## Convert string to bash array
ARR=($LINE)

echo "start time (${ARR[4]})"
echo "sn (${ARR[10]})"
echo "sku (${ARR[12]})"
echo "port (${ARR[14]})"

## How to save the value?
START_TIME=${ARR[4]}

【讨论】:

  • 我意识到这篇文章是几年前的,但是,作为一个新手,我想知道如何解析来自 ps 的多个结果,例如像 cups 或 sshd 这样的进程,而不是只是上面的“LINE = apache ...等”。 TIA
  • @endorpheus 你可以一次解析一行,对吧? (| while read LINE)我不确定你从 cups 或 sshd 得到什么输出。也许你应该把它当作一个新问题来问。
  • 不用了,你回答了我的问题,谢谢@saeedgnu
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2019-01-06
相关资源
最近更新 更多