41

谁能帮我解决这个问题?

我正在尝试将 awk 输出保存到变量中。

variable = `ps -ef | grep "port 10 -" | grep -v "grep port 10 -"| awk '{printf "%s", $12}'`
printf "$variable"

编辑: $12 对应于在该进程上运行的参数。

谢谢!

4

4 回答 4

61
#!/bin/bash

variable=`ps -ef | grep "port 10 -" | grep -v "grep port 10 -" | awk '{printf $12}'`
echo $variable

注意等号后面没有空格。

您还可以使用$()which 允许嵌套并且是可读的。

于 2013-09-06T01:25:01.870 回答
17

我认为 $()​​ 语法更容易阅读......

variable=$(ps -ef | grep "port 10 -" | grep -v "grep port 10 -"| awk '{printf "%s", $12}')

但真正的问题可能是$12不应该用“”来引用

由于问题已更改,因此已进行编辑,这将返回有效数据,但尚不清楚预期的输出ps -ef是什么以及变量中的预期是什么。

于 2013-09-06T01:16:12.410 回答
2

如前所述,设置 bash 变量不允许在 LHS 上的变量名和 RHS 上的变量值之间使用“=”号空格。

awk 可以做任何事情并避免“awk”病房额外的“grep”。使用 awk 的 printf 是为了不在字符串中添加不必要的“\n”,这会给 perl-ish 匹配器程序带来麻烦。您在 bash 中的情况的变量/参数扩展没有这个问题,所以这些都可以工作:

variable=$(ps -ef | awk '/port 10 \-/ {print $12}')

variable=`ps -ef | awk '/port 10 \-/ {print $12}'`

'-' int awk 记录匹配模式消除了从搜索结果中删除 awk 本身的需要。

于 2013-09-06T03:40:06.003 回答
0
variable=$(ps -ef | awk '/[p]ort 10/ {print $12}')

[p]是一个巧妙的技巧,可以从显示中删除搜索ps

@Jeremy如果您发布 的输出ps -ef | grep "port 10",以及您需要的内容,那么帮助您获得正确的语法会更容易

于 2013-09-06T04:48:13.660 回答