Bash:在管道中间设置一个shell变量

时间:2013-10-17 14:59:46

标签: bash

我有来自某个命令的文本(例如echo -e "10 ABC \n5 DEF \n87 GHI")。这个文本通过管道,我得到了想要的输出(例如它是GHI)。通缉输出被发送到以下管道步骤(例如,它是| xargs -I {} grep -w {} FILES |) 我的问题是:
我想在发送到下一步之前将变量附加到“inter pipe”输出 - 我该怎么做?


示例:

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

将其插入流中。所以我认为您只想添加?内容?变量到流中的每一行'?这个预先 $ example

的内容

   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 / $ / $ example /追加

NB 倾向于在bash中以这种方式做很多事情,但是一长串切割,seds和head等确实建议也许是时候突破awk或者perl。