简体   繁体   中英

Bash: set a shell variable in the middle of the pipeline

I have text coming from some command (in example it's echo -e "10 ABC \\n5 DEF \\n87 GHI" ). This text goes through the pipeline and I get wanted output (in example it's GHI ). Wanted output is sent to the following pipeline step (in example it's | xargs -I {} grep -w {} FILES | ).
My question is:
I want to append a variable to an "inter pipe" output before it's sent to a following step - How can I do this?


Example:

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

You can't set a shell variable in the middle of the pipeline, but you can send the output to a file using the tee command, and then read that file later.

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

这样的事情怎么样?

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

Insert it to a stream. so I think your looking just to add the ?contents? of a variable to every 'line' from the stream? This prepends the contents of $example

ie

   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/ to append

NB I tend to do lot of things this way in bash, but a long pipeline of cuts, seds and heads etc does suggest maybe its time to break out awk or perl.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM