Parse lines of output from bash loop
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.
Related videos on Youtube
dotancohen
Updated on September 18, 2022Comments
-
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 commandgit 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 ofgit 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 almost 10 yearsYou 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 withwc -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 (typetype [
and thenhelp [
),if
or||
or something similar, andbreak
orexit
to exit for loop. -
dotancohen almost 10 years@ArkadiuszDrabczyk: Thanks. With
grep -v '^*'
after thecontains
command I can get the name of the branch. Now, how might I output$i
and break only when grep matches something?
-
-
dotancohen almost 10 yearsThank you! I was not sure how to use the
[[]]
if in this context though I had found it used elsewhere online. The use ofawk
is creative. -
John B almost 10 yearsNo 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 likecase
does with*
. I've updated the post to use the single braces which makes it POSIX shell compliant. -
dotancohen almost 10 yearsI see, thanks. I'm looking at some of your older posts as well to learn some Bash as you give excellent examples. Thank you!