I have a bunch of files, I'd like to find the last match of a string in each of them.
grep text *.file gives me all the matches not the last ones.
ls *.file | xargs grep text | tail -n 1 gives me the last line of the last file that matches.
So what I think I want is a way to say:
ls *.file | (xargs grep text | tail -n 1) But I'm not sure how to do this, or if it's possible.
2 Answers
Use tail -n 1 in a for loop. For example:
for name in *.file; do grep -H text "$name" | tail -n 1 done (The -H option will make grep always print the file name, even if only one file was given.)
There is a oneliner over a tac commad, that output file from end till begin:
find . -name *.log -exec sh -c "tac '{}' | grep -Hm1 text " \;