bash معنى حسابات التاريخ والوقت لتتبع الوقت باستخدام سطر الأوامر في أونيكس/لينكس




git bash (4)

أبحث عن طريقة سهلة لتتبع الوقت أعمل على مشروع باستخدام سطر الأوامر. أنا افعل

echo "$(date) : Start" >>worktime.txt

عندما أبدأ العمل و

echo "$(date) : End" >>worktime.txt

عندما أوقف العمل. والنتيجة هي ملف من النموذج:

[email protected]:~/work$ cat worktime.txt 
Fri Jan  2 19:17:13 CET 2009 : Start
Fri Jan  2 19:47:18 CET 2009 : End
Fri Jan  2 21:41:07 CET 2009 : Start
Fri Jan  2 22:39:24 CET 2009 : End

"بداية" و "نهاية" يقصد بها وصفا، وكان يمكن أن يكون أي نص آخر. ومن المؤكد أن كل سطر غريب يحتوي على تاريخ البدء والوقت قبل: وكل سطر حتى يحتوي على تاريخ الانتهاء والوقت.

ما أود القيام به هو تلخيص وقت عملي من خلال تحليل ملف نصي باستخدام باش، تر، سيد، أوك وغيرها من الأدوات المشتركة يونكس / لينكس. أنا أفضل استخدام هذا النهج بدلا من استخدام بايثون، بيرل، هاسكل، جافا الخ.

جميع الأفكار نرحب!


يجب أن يقوم البرنامج النصي أوك التالي بذلك (لم يتم اختباره بالرغم من ذلك):

BEGIN {
    total_secs = 0
    FS = OFS = ":"
}

function snip_it() {
    $NF = ""; $0 = substr($0, 1, length($0)-1);
}

!(NR % 2) {
    snip_it();
    ("date -d \"" $0 "\" +%s") | getline start_secs
}

NR % 2 {
    snip_it();
    ("date -d \"" $0 "\" +%s") | getline end_secs
    total_secs += (end_secs - start_secs)
}

END {
    print "Total work time of " total_secs " seconds"
}

والمفتاح هو أن date +%s ترجع مقدار الثواني منذ عام 1970، ويحدد -d وقت / تاريخ بديل، بدلا من now .


حيث أن الهدف هو إجراء حساب شامل مثل:

total= (FirstEnd - FirstStart ) + (ScndEnd - ScndStart) 

والتي يمكن كتابتها:

total= - FirstStart + FirstEnd - ScndStart + ScndEnd ...

والشرط الوحيد هو أن هناك أزواج الانتهاء فقط في worktime.txt (كل بداية لها نهاية المقابلة).

هناك طريقة سريعة جدا:

echo $(sed <worktime.txt 's/ : .*$//g'|date -f - +%s|xargs printf "-%s+%s")|bc
5302

هذا الحل هو حقا سريعة جدا، كما أن هناك فقط شوكة 3 على الإطلاق، وليس اعتمادا على كيفية الكثير من التواريخ يجب أن تتم معالجتها. يتم كل الشوك فقط 1 مرة.

ويمكن كتابة ذلك:

echo $(
    sed <worktime.txt 's/ : .*$//g' |
        date -f - +%s |
        xargs printf "-%s+%s"
  ) | bc


على افتراض أن كنت تستخدم النواة غنو، تشغيل date +%s بدلا من ذلك.

echo $(date +%s) : Start

العنصر النائب٪ s غير متوافق مع بوسيكس وهو محدد لتاريخ غنو. يتم استبدالها بعدد الثواني مرت منذ عصر. التالي كتابة السيناريو الذي يأخذ الاختلافات ويجمع لهم. عليك أن تفعل شيئا من هذا القبيل

#!/bin/bash

total=0
while read LINE; do
  t1=$(echo $LINE |cut -d' ' -f1)
  read LINE
  t2=$(echo $LINE |cut -d' ' -f1)
  total=$(($total+$t2-$t1))
done
echo "$(echo "scale=2; $total/(60*60)" |bc -l)" hours

إذا قمت باستدعاء sq_time.sh النصي ثم يمكنك استدعاء البرنامج النصي مع

~$ ./sum_time.sh <worktime.txt







bash