बैश के साथ "अपटाइम" के आउटपुट को पार्स करना


2

मैं uptimeकमांड की आउटपुट को Bash स्क्रिप्ट में एक csv फाइल में सेव करना चाहूंगा । चूंकि uptimeअंतिम रिबूट के बाद से समय के आधार पर कमांड के अलग-अलग आउटपुट प्रारूप हैं, इसलिए मैं एक बहुत भारी समाधान पर आधारित हूं case, लेकिन निश्चित रूप से ऐसा करने का एक और अधिक सुरुचिपूर्ण तरीका है।

अपटाइम आउटपुट:

 8:58AM  up 15:12, 1 user, load averages: 0.01, 0.02, 0.00

वांछित परिणाम:

15:12,1 user,0.00 0.02 0.00,

वर्तमान कोड:

case "`uptime | wc -w | awk '{print $1}'`" in
#Count the number of words in the uptime output

10)
    #e.g.:  8:16PM  up  2:30, 1 user, load averages: 0.09, 0.05, 0.02
    echo -n `uptime | awk '{ print $3 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $4,$5 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $8,$9,$10 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;

12)
    #e.g.: 1:41pm  up 105 days, 21:46,  2 users,  load average: 0.28, 0.28, 0.27
    echo -n `uptime | awk '{ print $3,$4,$5 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $6,$7 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $10,$11,$12 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;

13)
    #e.g.: 12:55pm  up 105 days, 21 hrs,  2 users,  load average: 0.26, 0.26, 0.26
    echo -n `uptime | awk '{ print $3,$4,$5,$6 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $7,$8 }' | awk '{gsub ( ",","" ) ; print $0 }'`","`uptime | awk '{ print $11,$12,$13 }' | awk '{gsub ( ",","" ) ; print $0 }'`","
    ;;
esac

जवाबों:


8

मेरा सुझाव है कि आप अपटाइम (1) आउटपुट पार्स करने के बजाय सीधे स्रोत पर जाएं।

  • में है /proc/uptime
  • लोड औसत में है /proc/loadavg
  • उपयोगकर्ताओं की संख्या थोड़ी अधिक शामिल है, विकिपीडिया: utmp देखें , लेकिन w(1)या who(1)आदेश आपकी सहायता करेंगे।

निम्नलिखित वांछित आउटपुट नहीं है जो आपने पूछा था, लेकिन आपको यह विचार मिलता है:

$ echo $(cut -d ' ' -f 1 </proc/uptime),$(w -h | wc -l),$(cut -d ' ' -f 1-3 </proc/loadavg),
8545883.49,4,0.00 0.01 0.05

इसका मतलब है कि 8.55e6 सेकंड (लगभग 99 दिन), 4 उपयोगकर्ता, लोड औसत।


1
क्षमा करें, प्रश्न "लाइनक्स" को गलत तरीके से टैग किया गया था, मैं एक FreeBSD सिस्टम (FreeNAS) पर हूं, लेकिन मुझे आपकी बात मिल गई है और दृष्टिकोण समान होगा: संकेत के लिए पार्सिंग /sbin/sysctl kern.boottimeऔर /sbin/sysctl vm.loadavgधन्यवाद!
कीक

1

निम्न कोड सभी प्रकार के अपटाइम आउटपुट पर सूट करेगा। आशा है कि यह आपकी मदद करेगा,

uptime=`uptime`
upt=`echo $uptime | grep -ohe 'up .*user*' | awk '{gsub ( "user*","" ); print $0 }' | sed 's/,//g' | sed -r 's/(\S+\s+){1}//' | awk '{$NF=""}1'`
usrs=`echo $uptime | grep -ohe '[0-9.*] user[s,]'| sed 's/,//g'`
ldt=`echo $uptime | grep -ohe 'load average[s:][: ].*' | sed 's/,//g' | awk '{ print $3" "$4" "$5"," }'`
echo $upt, $usrs, $ldt

0

FWIW:

$ इको-ई "\ n $ (अपटाइम) \ n"; अपटाइम \
| sed -nre / s ++ up + ([\: 0-9] +), + ([^] [^,] +), +। *: + ([^] +), + ([^] +), + ([^] +) $ / \ 1, \ 2, \ 3 \ 4 \ 5 / p '

 12:58:47 ऊपर 5:53, 2 उपयोगकर्ता, लोड औसत: 0,21, 0,09, 0,10

5:53, 2 उपयोगकर्ता, 0,21 0,09 0,10

ध्यान दें कि संख्याओं के लिए दशमलव विभाजक आपकी स्थानीय सेटिंग्स पर निर्भर करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.