Combining find grep and tail
|
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 videos on Youtube
![Shep Bryan](https://lh6.googleusercontent.com/-7wwCyoVriWc/AAAAAAAAAAI/AAAAAAAAAAA/APUIFaO3mLws956ViF2Tqybsm-ysZWjB9g/mo/photo.jpg?sz=256)
Shep Bryan
I am a physics PHD student at Arizona State University.
Updated on September 18, 2022Comments
-
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?