I'm trying to create a script which will find missing topics from multiple log files. These logfiles are filled top down, so the newest logs are at the bottom of the file. I would like to grep only the last line from this file which includes UNKNOWN_TOPIC_OR_PARTITION. This should be done in multiple files with completely different names. Is grep the best solution or is there another solution that suits my needs. I already tried adding tail, but that doesn't seem to work.
missingTopics=$(grep -Ri -m1 --exclude=*.{1,2,3,4,5} UNKNOWN_TOPIC_OR_PARTITION /app/tibco/log/tra/domain/)
CodePudding user response:
You could try a combination of find
, tac
and grep
:
find /app/tibco/log/tra/domain -type f ! -name '*.[1-5]' -exec sh -c \
'tac "$1" | grep -im1 UNKNOWN_TOPIC_OR_PARTITION' "sh" '{}' \;
tac
prints files in reverse, the -exec sh -c SCRIPT "sh" '{}' \;
action of find
executes the shell SCRIPT
each time a file matching the previous tests is found. The SCRIPT
is executed with "sh"
as parameter $0
and the path of the found file as parameter $1
.
If performance is an issue you can probably improve it with:
find . -type f ! -name '*.[1-5]' -exec sh -c 'for f in "$@"; do \
tac "$f" | grep -im1 UNKNOWN_TOPIC_OR_PARTITION; done' "sh" '{}'
which will spawn less shells. If security is also an issue you can also replace -exec
by -execdir
(even if with this SCRIPT
I do not immediately see any exploit).