Combining find grep and tail

17,483

| 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?

Share:
17,483

Related videos on Youtube

Shep Bryan
Author by

Shep Bryan

I am a physics PHD student at Arizona State University.

Updated on September 18, 2022

Comments

  • Shep Bryan
    Shep Bryan almost 2 years

    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?