将awk输出保存到变量中

49

有人可以帮我解决这个问题吗?

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

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

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

谢谢!


问题并不是很清楚。你得到了什么错误? ps -ef命令的输出是什么?你期望在$variable中得到什么? (如果您无法提供真实数据,则生成一个经过消毒的示例以代替显示问题。) - NiKiZe
问题:变量在printf语句中没有显示出来。最终目标:$12对应于正在运行该进程的序列号。我想将该参数保存到一个变量中,以便我可以处理它。 - Jeremy
4个回答

67
#!/bin/bash

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

注意等号后面没有空格。

您还可以使用$(),它允许嵌套并且易读。


感谢RUI和NiKiZe,问题出在等号前后的空格。 - Jeremy
@wens,如何从单个命令中保存多个变量? - user2713461

24

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

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

但实际问题可能是$12不应该用""引用。

自问题更改后进行了编辑,这会返回有效数据,但不清楚ps -ef的期望输出以及变量中期望的内容。


2
最后一个管道符号和'{printf之间应该有一个awk。当回答被编辑时,可能意外地删除了它。 - aDroid

3

如前所述,设置bash变量时,在'='号的左侧的变量名和右侧的变量值之间不允许有空格。

awk可以完成所有操作并避免 "awk"ward 额外的 'grep'。使用awk的printf是为了在字符串中不添加不必要的 "\n",否则这会导致perl-ish匹配程序出现问题。在bash中,您的变量/参数扩展没有这个问题,因此以下任何一种方法都可以:

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

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

在awk记录匹配模式中的'-'可以避免将awk本身从搜索结果中删除。

0
variable=$(ps -ef | awk '/[p]ort 10/ {print $12}')

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接