2009-11-15 6 views
2

J'aimerais couper la sortie de disponibilitéAfficher seulement le temps de fonctionnement de disponibilité [unix]

20:10 up 23 days, 3:28, 3 users, load averages: 3.84 1.06 0.64 

afin qu'il montre juste:

23 days 

J'ai essayé d'utiliser sed, mais Je ne suis pas sûr que ce soit le bon outil pour le travail, et je n'ai pas beaucoup d'expérience pour l'utiliser.

Comment puis-je atteindre la sortie que je veux?

Répondre

11

Envisagez d'utiliser cut.

uptime | tr "," " " | cut -f6-8 -d" " 

semble fonctionner sur mon MacBook. Ici, j'ai également utilisé tr pour tuer un «,» étranger. Il y a un peu de problème avec différents formats pour des temps de disponibilité courts et longs.


Une solution possible sed:

uptime | sed 's/.*up \([^,]*\), .*/\1/' 

qui ne repose pas sur la chaîne "jours" apparaissant dans la sortie de uptime.

+0

Étrange bas vote ... fonctionne très bien, donc + 1. –

+0

N'étaient pas moi qui downvoted ... les deux semblent logiques - peut-être qu'ils étaient juste de mauvaise humeur! –

+0

Conduisez par downvotes arriver. J'aime juste savoir si ma solution est cassée. – dmckee

5
uptime | sed -E 's/^.+([0-9]+ days).+$/\1/' 
+0

\ 1 était ce que je ne pouvais pas travailler! –

+0

\ 1 signifie le premier groupe capturé (entre parenthèses). – jtbandes

+1

Notez que lorsque la sous-chaîne 'days' n'est pas présente (lorsqu'un redémarrage a eu lieu il y a moins d'un jour), cette solution ne fonctionnera pas. –

4

vous pouvez simplement utiliser le shell sans outils externes

$ var="20:10 up 23 days, 3:28, 3 users, load averages: 3.84 1.06 0.64" 
$ var=${var/#*up} 
$ echo ${var%%,*} 
23 days 
+0

C'est intelligent - je ne savais pas que vous pouviez faire ça! –

+0

Nice. Je savais, en théorie, mais je ne me souviens jamais d'utiliser les extensions bash. (et il pourrait être intéressant de noter que cela ne fonctionnera pas avec tous les obus ...) – dmckee

+0

@dmckee, quels sont les obus sur lesquels il ne fonctionnera pas? – ghostdog74

3

Les solutions ci-dessus afficher seulement soit les jours ou les heures. Je réalise que c'est ce que le PO recherchait mais je cherchais des heures et des minutes aussi. Cela affiche à la fois les jours et les heures/minutes lorsque le système a été pendant plus d'une journée ou seulement les heures où il y a moins d'un jour:

uptime | sed 's/^.* up \+\(.\+\), \+[0-9] user.*$/\1/' 

Props à ceinture noire regex ninja Zach W pour obtenir ce travail.

+0

Cela ne fonctionne pas, je reçois la sortie de disponibilité brute. – CMCDragonkai

+1

Pour un utilisateur unique, la sortie 'uptime' est" 1 utilisateur ", donc elle ne correspond pas à" users "(pluriel) dans ce qui précède. Changez-le simplement en "user" et cela semble fonctionner. –

+0

Pour faire correspondre 'user' ou' users', vous pouvez modifier la fin de l'expression régulière en '... users?. * $'. Cependant, comme '. * $' Correspond tout à la fin de la ligne en omettant simplement le 's', comme le suggère @PeterGibson, donner' ... user. * $ 'Devrait fonctionner. – AdrianHHH

2
uptime=$(</proc/uptime) ; uptime=${uptime%%.*} ; days=$((uptime/60/60/24)); echo $days days 
5

Je pense que cela est solution la plus simple:

uptime | awk '{print $3}' 

disponibilité | awk '{print $ 3}'

0
uptime | cut -d',' -f 1 | cut -d 'p' -f 2- 

S'il yan jours depuis le dernier redémarrage il sera imprimé n jours. Il imprimera une heure en hh: mm si la disponibilité est inférieure à un jour.

$ uptime 
12:20 up 1:36, 1 user, load averages: 2.75 2.63 2.26 
$ uptime | cut -d',' -f 1 | cut -d 'p' -f 2- 
    1:36 
0

Au-dessus de réponses sont correctes, mais si l'un de vous vouliez utiliser awk puis utilisez:

uptime | awk '{ print $3,$4 }' 

Résultat:

15 days, 
Questions connexes