Combining find grep and tail

findgreptail

I am trying to find all files that start with a certain name, then go through each file to find lines that contains a string, then only print out the last line of each file that contain the string. Step by step, I first find all files in my directory that start with "A123"

find . -name 'A123*'

then get each line in the file that contains "Trial"

find . -name 'A123*' -exec grep 'Trial' {} \;

and then from here I only want to print the last line,

find . -name 'A123*' -exec grep 'Trial' {} | tail -1 \;

however, this last command does not work. How do I fix this to get what I am trying to get?

Best Answer

| is a shell operator, so the whole output of find will be passed to tail. You need to run only a single command in exec by grouping all the commands to run and pass to sh or bash (or any shells you prefer)

find . -name 'A123*' -exec bash -c 'grep Trial "$1" | tail -1' grep {} \;

Or you can just use some other single commands for getting the last match from How to grep the last occurrence of a line pattern


If you can make sure that you files contain no special characters like #$/\`&*~-... in their names you can use this

find . -name 'A123*' -exec bash -c "grep 'Trial' {} | tail -1" \;

But please be aware that strange things may happen there when there are unexpected names you didn't know. For more information read Is it possible to use find -exec sh -c safely?

Related Question