grep包含特殊字符的变量

时间:2016-04-18 15:08:03

标签: linux bash grep

我是bash脚本的新手,我必须确定一个进程是否在linux环境中运行。 实际上我使用follow命令来完成这项工作:

#ps -ef | awk '{print substr($0, index($0,$8))}' | grep -v grep | grep -w -F $PROCESSNAME

其中

awk '{print substr($0, index($0,$8))}' 

允许我忽略UID PID PPID C STIME TTY TIME字段和

grep -v grep 

允许我忽略包含命令本身的行。所以在这一点上,我有一个在系统上运行的所有进程的列表。

最后:

 grep -w -F $PROCESSNAME

读取一个变量,其中包含我要检查的进程的名称。 据我所知,full命令应该只返回具有$ PROCESSNAME

的确切值的行

实际上,对于遵循模式" [processname]"以及可能还有其他模式的流程,这不能正常工作。

例如为了简化,如果我有一个名为&#34的正在运行的进程; [vmmemctl]"我跑:

#ps -ef | grep -v grep | grep -w -F "vmmemctl]"

它实际上会返回一个结果:

#root       615     2  0 Feb26 ?        00:01:00 [vmmemctl]

但命令中的实际进程名称与结果中的进程名称不同。 没有这种行为的正确命令是什么?

谢谢

1 个答案:

答案 0 :(得分:0)

awk救援!

ps -ef | awk '$8=="[command]"{NF=8;print}'

ps -ef | awk -v c="vmmemctl]" '$8==c{NF=8;print}'

请注意,这是完全匹配而不是模式。

因为这是完全匹配,所以命令可以包含空格和其他特殊字符(它不是模式匹配而是字符串相等)。使用您的变量名称,它将如下所示

ps -ef | awk -v c="$PROCESSNAME" '$8==c{NF=8;print}'