从grep捕获输出并切割到tcsh shell

时间:2017-08-26 18:13:27

标签: shell tcsh

我正在尝试从此命令中捕获进程号

ps ax | grep catalina

到tcsh shell中的变量。

到目前为止,我可以使用此脚本将进程号回显到屏幕:

set pnum = `ps ax | grep catalina`
echo $pnum | cut -d' ' -f1

但是,当我尝试这样做以获得grepcut

的结果时
set pnum = `ps ax | grep catalina | cut -d' ' -f1`

结果是一个空字符串。

这个序列

set pnum = `ps ax | grep catalina`
set pnum = `$pnum | cut -d' ' -f1`

生成1104: Command not found.错误。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

你需要进一步解构你的过程(也许你有)。要了解您的问题,请先查看ps ax | grep catalina显示的内容,然后添加set pnum =..内容。

是的,您应该能够将其链接到一个管道中,但请注意,如果/当输出开头有空格时,您必须增加-f1以计算每个空间,因此4位PID将比6位PID需要更多-f**n**

另请注意,要删除将出现的grep行,请使用

| grep '[c]atalina'

最后,想一想您的错误消息1104: Command not found.告诉您的内容。

这是您在第二行前面的$pnum生成的processID。再次,养成解构失败代码的习惯,可以很容易地看出问题所在。您还可以使用#!/bin/tcsh -vx打开shell调试跟踪作为脚本的she-bang行。

可能更好的解决方案是使用

set pnum = `ps ax | awk '/[c]atalina/{sub(/^  */,"", $0);print $1}'`

我的csh / tcsh环境正在进行中,所以只进行了轻微的测试。

IHTH。

答案 1 :(得分:0)

尝试pgrep

set npid = `pgrep -n nginx`
echo $npid

-n是获得最新的(最近开始的)流程

这也有效(你正在使用的方法):

set pnum = `ps ax | grep nginx | cut -d ' ' -f1`

可能发生的事情是你的进程没有运行,或者在行的开头有一些额外的空格,也可能你必须做这样的事情:

set pnum = `ps ax | grep nginx | grep -v grep | cut -d ' ' -f3`

或者使用awk:

set pnum = `ps ax | awk '/nginx/{print $1}'`