2017-08-26 106 views
0

我想從這個命令從grep的捕獲輸出,並將其切割成變量在tcsh外殼

ps ax | grep catalina 

捕獲進程號在tcsh外殼的變量。

到目前爲止,我可以使用這個腳本來呼應進程號到屏幕上:

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.錯誤。

我錯過了什麼?

回答

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作爲腳本的she-bang行打開shell調試跟蹤。


一個可能更好的解決方案是使用

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

我的csh/tcsh的環境此刻演戲了,所以只等閒測試。 IHD。

IHTH。

+0

感謝您的提示。 我的grep輸出是'1104 s002 S 6:25.87/Library/Java/J ...'所以如果我這樣做:set pnum ='ps ax | grep catalina |剪切-d''-f 2 |削減-d''-f 1',pnum現在回來 –

+0

感謝您的提示。 我grep的輸出是 1104 s002 S 6:25.87 /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/jre/bin/java -Djava.util.logging.config.file = /用戶/ stephenschultz/apache-tomcat-7.0.55/conf/logging.properties -Djava.util.logging.manager = org.apache ... 因此,如果我這樣做而不是在我的初始職位 集pnum ='ps ax | grep catalina |剪切-d''-f 2 | cut -d''-f 2 pnum回來了 額外的8895從哪裏來? –

+0

如果獲得只有3個地方長的PID,會發生什麼情況?或5,或6?另外,你正在創建一個非常「昂貴」的解決方案,因爲你有3個過程來「修整」你所需要的值。我包含的awk解決方案可以處理任何大小的PID,並且只有一個進程。但很高興你正在自己搞點東西。祝你好運。 – shellter

0

給一個嘗試pgrep

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

-n是獲取最新(最近開始)工藝

這也適用(方法您正在使用):

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

可能發生的情況是您的流程沒有運行,或者在行首有一些額外的空間,也可能您會E要做到這樣的事情:

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

或者用awk:

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

這工作:設置pnum ='ps ax | grep catalina | grep -v grep |剪切-d''-f2'。謝謝! –