parsing a tail file to process commands

143 views Asked by At

I have found some info on this, but not enough to get me going with this project. I have limited bash experience, trying to learn.

I have a log file that I would like to read (tail) and process lines as they come in based on timestamp in the log.

Log example: from a tail -f filename.txt | grep --line-buffered RXKEY,MAIN:

20230913200618,12345,RXKEY,MAIN
20230913200620,12345,RXKEY,MAIN
20230913200627,12345,RXKEY,MAIN
20230913200629,12345,RXKEY,MAIN

(Timestamp,id,type,location)

I would like to read this file and perform an action, if the last entry was X amount of seconds before the previous entry. IE, if 2 logs hit in 4 or 5 seconds apart, run a command locally. Then keep monitoring for future logs and repeat as needed.

I have the log working but not sure how to read the timestamps and then process an action.

1

There are 1 answers

6
Sean Breckenridge On BEST ANSWER

You can pipe grep into while read, which lets you loop over each line received.

#!/usr/bin/env bash

declare allow_difference=5
declare last=

# 'while read -r' to prevent backslashes from being interpreted
# https://unix.stackexchange.com/questions/192786/what-is-the-meaning-of-read-r
tail -f filename.txt | grep --line-buffered RXKEY,MAIN | while read -r line; do
    # read into array 'linearray', splitting on ',' by setting
    # the IFS (how bash chooses to split word boundaries)
    IFS=',' read -ra linearray <<< "$line"
    # [[ -z "$somevariable" ]] checks if the variable is empty
    # if its empty, then we havent set a last time yet, so set it and continue the while loop
    if [[ -z "$last" ]]; then
        last="${linearray[0]}"
        continue
    fi
    # get the difference between the current time and the last time
    # $(()) for bash arithmetic
    difference="$((linearray[0] - last))"
    # if the difference is smaller than the allowed difference, then run some command
    if ((difference < allow_difference)); then
        echo "difference between ${last} and ${linearray[0]} is ${difference}, running command"
        # could add some other command here...
    fi
    last="${linearray[0]}"
done

Tried to comment more than usual as you said you're new to bash but let me know if something isn't understandable.

 $ ./script 
difference between 20230913200618 and 20230913200620 is 2, running command
^C