2012-08-22 67 views
7

我想管的尾部命令的輸出到另一個bash腳本來處理:管尾輸出到另一個腳本

tail -n +1 -f your_log_file | myscript.sh 

然而,當我運行它,$ 1參數(myscript.sh內)永遠不會達到。我錯過了什麼?如何將輸出管道作爲腳本的輸入參數?

PS - 我想讓尾巴永久運行,並繼續將每個單獨的行傳送到腳本中。

編輯 現在myscripts.sh的全部內容是:

echo $1; 
+0

你缺少變量分配到'$ 1'。管道將尾部的輸出連接到腳本的標準輸入。你可以發佈'myscript.sh',或者至少可以確定是否需要參數(以及該參數應該是什麼),以及它如何處理其標準輸入中呈現的數據。 – chepner

回答

13

一般來說,這裏是處理標準輸入腳本的一種方法:

#!/bin/bash 

while read line; do 
    echo $line 
done 

這是一個非常粗糙的bash相當於cat。它確實證明了一個關鍵事實:腳本中的每個命令從shell繼承它的標準輸入,所以你並不需要做任何特殊的事情來訪問數據。read從shell獲取它的輸入,在你的情況)是從tail過程中通過管道連接到它的輸入。

作爲另一個例子,考慮這個腳本;我們將其稱爲'mygrep.sh'。

#!/bin/bash 

grep "$1" 

現在管道

some-text-producing-command | ./mygrep.sh bob 

行爲相同

some-text-producing-command | grep bob 

$1如果你打電話給你這樣的腳本設置:

./myscript.sh foo 

然後$1具有值「foo」。

位置參數和標準輸入是分開的;你可以這樣做

tail -n +1 -f your_log_file | myscript.sh foo 

現在的標準輸入還是從tail過程中來,並$1仍設置爲「富」。

+0

不知道我關注。 foo來自哪裏/來自哪裏? – slthomason

+0

'foo'只是命令行上的一個任意字符串。如果你的命令後面有一個字符串,那就是分配給'$ 1'的東西。如果還有第二個字符串,它被分配到'$ 2',等等。在你最初的例子中,你在'myscript.sh'後沒有參數,這就是爲什麼'$ 1'沒有價值。 – chepner

+0

正確 - 那麼如何將尾部輸出管道輸入到myscript.sh?我只是將它合併到myscript.sh中?如果是這樣,怎麼樣? – slthomason

1

也許你與awk混淆?

tail -n +1 -f your_log_file | awk '{ 
    print $1 
}' 

將打印tail命令輸出中的第一列。

在shell中,類似的效果可以達到:

tail -n +1 -f your_log_file | while read first junk; do 
    echo "$first" 
done 

或者,你可以把整個while ... done循環內myscript.sh

相關問題