Bash generic";ps aux";按严格名称处理

Bash generic";ps aux";按严格名称处理,bash,generics,awk,ps,Bash,Generics,Awk,Ps,我正在尝试使用一个ps aux命令,该命令只列出真正的ssh代理进程。我注意到在一些发行版上,出现了一些不需要的进程,比如命令颜色等等。我需要这样做,因为我需要确保真正的ssh代理进程在脚本中运行(不用麻烦,我已经有了一个循环…) 所以我发现我需要在我的测试程序中使用类似的东西: #!/bin/bash ps aux | grep ssh-agent | grep -v grep | awk '{print $12}' 我的问题是:awk$12是否可以在任何unix/linux环境中使用bas

我正在尝试使用一个ps aux命令,该命令只列出真正的ssh代理进程。我注意到在一些发行版上,出现了一些不需要的进程,比如命令颜色等等。我需要这样做,因为我需要确保真正的ssh代理进程在脚本中运行(不用麻烦,我已经有了一个循环…)

所以我发现我需要在我的测试程序中使用类似的东西:

#!/bin/bash
ps aux | grep ssh-agent | grep -v grep | awk '{print $12}'
我的问题是:awk$12是否可以在任何unix/linux环境中使用bash和任何bash版本?

另外,如果我删除“grep-vgrep”并执行以下操作:

ps aux | grep ssh-agent | awk '{print $12}'
输出为:

ssh-agent
ssh-agent
foo 18153478  0.0  0.0  536  844      - A      Apr 25  0:00 ssh-agent
foo 31260886  0.0  0.0  252  264  pts/0 A    22:38:41  0:00 grep ssh-agent
现在:

输出为:

ssh-agent
ssh-agent
foo 18153478  0.0  0.0  536  844      - A      Apr 25  0:00 ssh-agent
foo 31260886  0.0  0.0  252  264  pts/0 A    22:38:41  0:00 grep ssh-agent
这意味着,awk命令将“grep ssh agent”之间的空格解释为分隔符。有什么办法克服这个问题?我已经尝试使用制表符分隔符,但不是这样。命令的分隔符似乎是简单的“空格”字符。是否可以为“ps”命令输出强制使用制表符分隔符


有什么想法吗?

第一个$12与ps输出的字段数有关。这与bash无关

grep-vgrep
是删除grep进程的一个好方法,因此将其保留在中

现在你不确定最后一个字段是字段12还是什么,我不太确定

ps aux | grep ssh-agent | grep -v grep | awk '{ print $NF }' 
假设您只希望看到ssh代理(并且它没有命令行参数)

下面是一些快速而肮脏的东西,它将抛出pid和完整的命令行

ps aux | grep ssh-agent | grep -v grep | awk '{ print $1 " "; for (k = 12; k < NF; k++ ) { printf "%s", k; } printf "\n"; }' 
ps aux | grep ssh agent | grep-v grep | awk'{print$1'';for(k=12;k
NF是awk中的字段数,$NF是最后一个字段


看看这是否适合你。虽然有很多更干净的方法可以做到这一点,但我建议对类似于
“[s]sh agent”
之类的东西进行
grep
。这样可以防止获取
grep
本身

我还建议不使用
awk
(打印第12列),而是使用
cut
打印行的特定字符范围,例如。g、 :

ps aux | grep '[s]sh-agent' | cut -c 66-
这当然取决于
ps
的输出格式

您可以查看
/proc/
文件系统:

(
  cd /proc
  for p in [0-9]*
  do
    [ "$(readlink $p/exe)" = "/bin/bash" ] &&
      echo "$p $(cat $p/cmdline | tr '\0' ' ')"
  done
)
(当然,用更合适的东西代替
/bin/bash


另一方面,这将取决于
/proc/
文件系统的存在。你自己决定哪个对你更有利。

好吧,我想我发现了,非常简单明了:

ps -e -o pid,comm | grep ssh-agent
很好用

答案如下:

并使用| grep ssh代理进行了调整


马丁也建议。谢谢大家分享你的经验

pgrep ssh agent
是否足够,或者您真的需要
ps
将提供给您的信息?或者甚至
ps aux | grep-f我只需要PID和进程名称,就是这样。但是,我在各种unix/linux上运行这个脚本。我刚刚在AIX上测试了pgrep,当然,它还没有安装。我希望它是尽可能通用的,只使用纯GRIP。您可以考虑使用<代码> GRP[s] SH代理< /代码>或类似的方法来防止自匹配,从而避免<代码> GRIP-V GRP。此外,查看<代码> -O/C>选项>代码> PS < /代码>,您可以使用它来格式化输出,所以你只需要得到你需要的。非常感谢$我在找什么。关于grep-vgrep,我知道,尽管你不能正确地定义ps命令似乎有点尴尬。。。只需说.ps aux | grep ssh agent | awk'{print$1”“$NF}'foo ssh agent foo ssh agent并应返回:foo ssh agent foo grep ssh agentwoop hehe将$1替换为$2。。或者随便什么,或者不要用它。。那只是一个例子当然,谢谢你,你的回答帮助很大。我对它很在行,我想它可以在任何unix/linux上运行$NF应该做到这一点。可惜我不知道这件事:);-)我曾经教过shell编程,很久以前(超过15年前)我就为它开发了一门课程。我认为我过去教过的一些东西实际上一直困扰着我,heheusing/proc文件系统通常是一种不兼容的脚本编写方式。如果他想将此脚本移动到BSD或solaris计算机或其他设备,该怎么办?你基本上是在你的for循环中做ps在Linux上所做的事情(它读取/proc),可能做得不好,因为ps实际上会做其他测试,例如faccess,所以你不会被拒绝权限,因为你没有访问权限的进程很丑陋。我说过,什么更适合他取决于他的(未提及的)环境。要依赖于这个特定的ps实现在第12列中打印命令名的事实,也可能假设得太多。是的,非常感谢Alfe,我也将尝试您的方法。我猜/proc不适合我,因为如上所述,我希望我的脚本基本上可以运行在任何看起来毫无意义的东西上。真的:真正的可移植代码不是用shell编写的;-)为什么不是Python呢。我会调查的。再次感谢您的帮助!Stackoverflow社区rox!