2014-09-19 55 views
2

我無法從我的bash腳本中獲取變量以在awk管道上工作。如何獲得bash變量在awk管道上的工作

SERVER_PORT="27018" 
... 
HOLDER=`netstat -tlpn | awk -v sp=$SERVER_PORT '/:sp */ {split($NF,a,"/"); print a[1]}'` 

執行該變量的命令後,下一個等式爲TRUE!

... 
if [ "$HOLDER" == "" ]; then 
... 

如果我將shell窗口上運行

netstat -tlpn | awk '/:27018 */ {split($NF,a,"/"); print a[1]}' 

一切都很好,這讓我的進程的PID。

所以我的問題是:如何正確地將變量傳遞給awk或者有什麼壞的? 運行CentOS 7

回答

7

在正則表達式常量awk中不擴展變量。所以/:sp */實際上是/:sp */

你需要讓那場比賽的字符串:$0 ~ ":"sp" *"

的awk腳本是由的pattern {action}雙。 /:27018 */是一種模式(使用正則表達式常量)。正如我在開始時所說awk不擴展變量裏面一個正則表達式常量,所以/:sp */是匹配那些文字字符。

除了正則表達式常量之外,還有其他可能的模式。即使靜態字符串也可以是模式(它們總是正確的,但它們工作)。

~是awk中的正則表達式匹配運算符。您可以使用它來手動執行與正則表達式常量模式相同的匹配類型。 ~需要兩個字符串參數。

把我們一起可以匹配(~)的":"sp" *"對字符串常量,正則表達式的整條生產線($0)(而不是一個正則表達式常數)(字符串":",我們的變量sp和字符串" *")。

其中,當放在一起,讓你(如我上面寫的)$0 ~ ":"sp" *"作爲模式,而不是正則表達式常量。

+0

我不太明白你在「匹配字符串:'$ 0〜」:「sp」*「'」下的意思。你能爲我解釋嗎? – 2014-09-19 18:07:52

+0

@АртёмDoe編輯。希望澄清事情。 – 2014-09-19 18:15:17

+2

@АртёмDoe請閱讀http://www.gnu.org/software/gawk/manual/gawk.html#Regexp,並特別注意'字符串常量'和'regexp常量'之間的區別以及「使用動態正則表達式'。另外,如果您打算進行更多的awk編程,請閱讀Arnold Robbins編寫的書「Effective Awk Programming,Third Edition」。 – 2014-09-19 18:17:51