2013-10-17 90 views
1

我有一些來自某個命令的文本(例如它是echo -e "10 ABC \n5 DEF \n87 GHI")。這段文字經過了管道,我得到了想要的輸出(例如它是GHI)。通緝輸出發送到下面的流水線步驟(例如它是| xargs -I {} grep -w {} FILES |)。
我的問題是:
我想在發送到下一步之前將變量追加到「管道間」輸出 - 我該如何做到這一點?Bash:在流水線中間設置一個shell變量


例子:

echo -e "10 ABC \n5 DEF \n87 GHI" | 
    sort -nr -k1 | 
    head -n1 | 
    cut -f 2 | # Wanted output comes here. I want to append it to a variable before it goes to `grep` 
    xargs -I {} grep -w {} FILES | 
    # FOLLOWING ANALYSIS 
+0

你想存儲中間結果嗎?或者將一個變量的值插入流中? – eduffy

+0

將其插入流中。 – PoGibas

回答

1

如何像這樣

echo -e "10 ABC \n5 DEF \n87 GHI" | sort -nr -k1 | head -n1 | cut -f 2 | while read MYVAR; do echo "intermediate value: $MYVAR"; echo $MYVAR | xargs -I {} grep -w {} FILES; done 
+0

這是天才!謝謝。 – PoGibas

2

您不能設置在管道中間的shell變量,但你可以將輸出發送到使用tee命令文件,然後讀取該文件後來。

echo -e "10 ABC \n5 DEF \n87 GHI" | 
    sort -nr -k1 | 
    head -n1 | 
    cut -f 2 | 
    tee intermediate.txt | 
    xargs -I {} grep -w {} FILES | 
    # FOLLOWING ANALYSIS 

# intermediate.txt now contains 87 GHI 
+0

在xargs -I {} grep -w {} FILES'(或任何其他管道步驟)之前,我應如何'VARIABLE = $(cat intermediate.txt)'?我想在這裏做的是在管道中間放置一個命令。 – PoGibas

+1

@Pgibas你不能。如果你想分配給一個變量,你需要在某處分割管道。可能是'VAR = $(echo ... cut); <<< $ VAR xargs ...' – Kevin

1

它插入到流。所以我認爲你只是想添加?內容?一個變量的每個'行'從流?這預規劃 $例子

example="A String" 
    echo -e "10 ABC \n5 DEF \n87 GHI" | 
    sort -nr -k1 | 
    head -n1 | 
    cut -f 2 | 
    sed s/^/$example/ | 
    xargs -I {} grep -w {} FILES | 
    # FOLLOWING ANALYSIS 

SED S/$/$例子/追加內容

NB 傾向於做很多事情在bash這種方式,但是很長一段時間的切割,seds和頭等暗示也許它的時間爆發awk或perl。