web-dev-qa-db-fra.com

Comment filtrer le dmesg par temps

Je voudrais filtrer par temps. par exemple:
dmesg -sec 30
La sortie serait des événements qui se sont produits au cours des 30 dernières secondes. Ou avec intervalle de temps. Tout filtrage avec le temps.

1
Rimski

Écrivez un script pour ajouter l'heure actuelle à l'horodatage dans l'entrée dmegs, puis comparez l'heure à l'heure actuelle et affichez les lignes plus récentes que l'intervalle souhaité.

Ceci est un exemple:

#!/bin/bash

if [ $# -eq 0 ]
  then
    echo "Argument Error.  Please specify the Time interval in seconds."
    exit
fi

timeinterval=$1 # change this to the desired time interval
currenttime=$(date +%s)

string="$(who -b | awk '{print $3"-"$4}')"

IFS='-' read -a array <<< "$string"

MONTHS=(X Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)

year="${array[0]}"
month=${MONTHS[${array[1]}]}
day="${array[2]}"
hour="${array[3]}"

daystring="$month $day $year $hour"

bootime=$(date --date="$daystring" +%s)

dmesg | while read line; do 
    dmesgstamp=$(echo "$line" | awk -F'[' '{print $2}' | awk -F\. '{print $1}')
    dmesgstamp=$((dmesgstamp += bootime))
    results=$((currenttime-dmesgstamp))
    if ((results < timeinterval)); then
        echo "$line"
    fi
done

Exécutez le script avec l'intervalle en secondes comme argument:

$ ./script.sh 30
1
L. D. James