GNU/Linux >> Tutoriels Linux >  >> Linux

Disponibilité du format Bash pour afficher les jours, les heures et les minutes

J'ai créé un script shell universel, pour les systèmes prenant en charge uptime -p comme Linux plus récent et pour ceux qui ne le font pas, comme Mac OS X.

#!/bin/sh

uptime -p >/dev/null 2>&1

if [ "$?" -eq 0 ]; then
  # Supports most Linux distro
  # when the machine is up for less than '0' minutes then
  # 'uptime -p' returns ONLY 'up', so we need to set a default value
  UP_SET_OR_EMPTY=$(uptime -p | awk -F 'up ' '{print $2}')
  UP=${UP_SET_OR_EMPTY:-'less than a minute'}
else
  # Supports Mac OS X, Debian 7, etc
  UP=$(uptime | sed -E 's/^[^,]*up *//; s/mins/minutes/; s/hrs?/hours/;
  s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/;
  s/^1 hours/1 hour/; s/ 1 hours/ 1 hour/;
  s/min,/minutes,/; s/ 0 minutes,/ less than a minute,/; s/ 1 minutes/ 1 minute/;
  s/  / /; s/, *[[:digit:]]* users?.*//')
fi

echo "up $UP"

L'essentiel

Réponse John1024 référencée avec mes propres personnalisations.


Mon uptime produit une sortie qui ressemble à :

$ uptime
 12:49:10 up 25 days, 21:30, 28 users,  load average: 0.50, 0.66, 0.52

Pour convertir cela dans votre format :

$ uptime | awk -F'( |,|:)+' '{print $6,$7",",$8,"hours,",$9,"minutes."}'
25 days, 21 hours, 34 minutes.

Comment ça marche

  • -F'( |,|:)+'

    awk divise son entrée en champs. Cela indique à awk d'utiliser n'importe quelle combinaison d'un ou plusieurs espaces, virgules ou deux-points comme séparateur de champ.

  • print $6,$7",",$8,"hours,",$9,"minutes."

    Cela indique à awk d'imprimer le sixième champ et le septième champs (séparés par un espace) suivis d'une virgule, le 8ème champ, la chaîne hours, le neuvième champ, et enfin la chaîne minutes. .

Gestion des ordinateurs avec des temps de fonctionnement courts à l'aide de sed

A partir d'un redémarrage, mon uptime produit une sortie comme :

 03:14:20 up 1 min,  2 users,  load average: 2.28, 1.29, 0.50
 04:12:29 up 59 min,  5 users,  load average: 0.06, 0.08, 0.48
 05:14:09 up  2:01,  5 users,  load average: 0.13, 0.10, 0.45
 03:13:19 up 1 day, 0 min,  8 users,  load average: 0.01, 0.04, 0.05
 04:13:19 up 1 day,  1:00,  8 users,  load average: 0.02, 0.05, 0.21
 12:49:10 up 25 days, 21:30, 28 users,  load average: 0.50, 0.66, 0.52

Le sed suivant La commande gère ces formats :

uptime | sed -E 's/^[^,]*up *//; s/, *[[:digit:]]* users.*//; s/min/minutes/; s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/' 

Avec les temps ci-dessus, cela produit :

1 minutes
59 minutes
2 hours, 1 minutes
1 day, 0 minutes
1 day,  1 hours, 0 minutes
25 days, 21 hours, 30 minutes

Comment ça marche

  • -E active la syntaxe des expressions régulières étendues. (Sur les anciens GNU seds, utilisez -r à la place de -E )

  • s/^[^,]*up *//

    Cette commande de remplacement supprime tout le texte jusqu'à up .

  • s/, *[[:digit:]]* users.*//

    Cette commande de substitution supprime le nombre d'utilisateurs et tout le texte qui le suit.

  • s/min/minutes/

    Ceci remplace min avec minutes .

  • s/([[:digit:]]+):0?([[:digit:]]+)/\1 hours, \2 minutes/'

    Si la ligne contient une heure au format hh:mm, celle-ci sépare les heures des minutes et la remplace par hh hours, mm minutes .

Gérer les ordinateurs avec des temps de fonctionnement courts à l'aide d'awk

uptime | awk -F'( |,|:)+' '{d=h=m=0; if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'

Sur les mêmes cas de test que ci-dessus, cela produit :

0 days, 0 hours, 1 minutes.
0 days, 0 hours, 59 minutes.
0 days, 2 hours, 1 minutes.
1 days, 0 hours, 0 minutes.
1 days, 1 hours, 0 minutes.
25 days, 21 hours, 30 minutes.

Pour ceux qui préfèrent le code awk réparti sur plusieurs lignes :

uptime | awk -F'( |,|:)+' '{
    d=h=m=0;
    if ($7=="min")
        m=$6;
    else {
        if ($7~/^day/) { d=$6; h=$8; m=$9}
        else {h=$6;m=$7}
        }
    }
    {
        print d+0,"days,",h+0,"hours,",m+0,"minutes."
    }'

Solution :Afin d'obtenir la disponibilité de Linux en quelques secondes, allez dans bash et tapez cat /proc/uptime .Analysez le premier nombre et convertissez-le selon vos besoins.

À partir de la documentation RedHat :

Ce fichier contient des informations détaillant la durée d'activation du système depuis son dernier redémarrage . La sortie de /proc/uptime est assez minime :

350735.47 234388.90

Le Premier nombre est le nombre total de secondes pendant lesquelles le système a fonctionné.

Le deuxième nombre correspond à la durée d'inactivité de la machine, en secondes.


Juste pour être complet... de quoi s'agit-il :

$ uptime -p
up 2 weeks, 3 days, 14 hours, 27 minutes

Linux
  1. Un moyen simple de convertir HH:MM:SS (heures:minutes:secondes.secondes fractionnées) en secondes

  2. Comment comparer deux chaînes au format de version séparées par des points dans Bash ?

  3. soustraire des jours d'une date en bash

  4. Obtenir l'heure actuelle en heures et minutes

  5. crontab exécuté toutes les 15 minutes entre certaines heures

Variable d'exportation bash

Bash printf - Comment imprimer une variable dans Bash

Bash Shebang

Bash Scripting :comment générer et formater du texte sur le shell Linux

Existe-t-il un moyen d'afficher la notification du script bash dans Ubuntu ?

Afficher uniquement le nom du répertoire actuel (pas le chemin complet) à l'invite bash