Parse lines of output from bash loop

6,448

Something like this might be what you want.

for i in $(git log --format='%H'); do
    branch="$(git branch --contains $i|awk 'NR==1{print $1}')"
    [ "$branch" != "*" ] && echo "commit '$i' is in branch '$branch'"
done

Prints the commit and its branch if not the current branch.

Share:
6,448

Related videos on Youtube

dotancohen
Author by

dotancohen

Updated on September 18, 2022

Comments

  • dotancohen
    dotancohen over 1 year

    I'm trying to parse the output of commands run in a bash loop. Here is an example:

    $ for i in `git log --format='%H'`; do echo $i ; git branch --contains $i; done | head -n 8
    5f11ce7da2f9a4c4899dc2e47b02c2d936d0468e
    * foobar
    e1c3f6fabd45715b527a083bc797e9723c57ac89
      dev1
    * foobar
    7053e08775d2c1da7480a988a235e445799cbca5
      dev1
    * foobar
    

    The command git log --format='%H' prints out only the commit ID for each Git commit. The command git branch --contains $i prints out which Git branches contain the commit.

    I'm trying to find the latest git commit that is not on branch 'foobar'. I would like to echo $i for the first branch whose output of git branch --contains $i contains a line that does not start with the * character, which specifies "current branch". What Bash documentation should I be reading?

    Note that I am aware of other solutions to this problem. However, I plan on making additions that the other answers do not account for. Furthermore, this is how I improve my Bash scripting abilities.

    • Arkadiusz Drabczyk
      Arkadiusz Drabczyk almost 10 years
      You can achieve what you want in at least 2 ways - by grepping output of git branch --contains command or by checking how many lines this command returned with wc -l. In either way, you will likely need to use command substitution (you are already doing that but look up on differences between $() and backticks), [ command (type type [ and then help [), if or || or something similar, and break or exit to exit for loop.
    • dotancohen
      dotancohen almost 10 years
      @ArkadiuszDrabczyk: Thanks. With grep -v '^*' after the contains command I can get the name of the branch. Now, how might I output $i and break only when grep matches something?
  • dotancohen
    dotancohen almost 10 years
    Thank you! I was not sure how to use the [[]] if in this context though I had found it used elsewhere online. The use of awk is creative.
  • John B
    John B almost 10 years
    No problem! The use of double braces here is actually not necessary, and it's a Bash only syntax that's only really required for using Bash regex =~ or glob comparisons against variables like case does with *. I've updated the post to use the single braces which makes it POSIX shell compliant.
  • dotancohen
    dotancohen almost 10 years
    I see, thanks. I'm looking at some of your older posts as well to learn some Bash as you give excellent examples. Thank you!