कालानुक्रमिक रूप से नौकरियों में


11

संभवतः एक सरल समाधान जो मैंने गलत बताया। मैं क्रोनोगोलॉजिकल रूप से आउटपुट कैसे प्राप्त कर सकता हूं atq, इसलिए मैं आसानी से देख सकता हूं कि अगले भाग के कारण कौन है? manके लिए पेज sortके लिए कुछ भी निम्नलिखित की तरह टाइम स्टांप पहचान करने के लिए निर्मित नहीं है:

atq
1264    Sat Mar 24 15:03:00 2012 a master
1445    Sat Mar 24 20:28:00 2012 a master
1548    Sun Mar 25 15:09:00 2012 a master
1193    Sat Mar 24 11:03:00 2012 a master
1359    Sat Mar 24 17:13:00 2012 a master
1726    Mon Mar 26 21:24:00 2012 a master
1736    Mon Mar 26 22:04:00 2012 a master
1748    Mon Mar 26 22:46:00 2012 a master
1704    Mon Mar 26 20:19:00 2012 a master
1288    Sat Mar 24 15:38:00 2012 a master
1532    Sun Mar 25 11:53:00 2012 a master

atq |sort नौकरी आईडी के चारों ओर या तो काम नहीं करेगा।


मैं 2012-03-23_13-11-01 के रूप में 2 क्षेत्र को पुन: स्वरूपित करने के साथ ठीक हूं जो कि छंटाई के अनुकूल है, जो मुझे लगता है कि मैं dateकर सकता हूं। --date=STRINGपरम के साथ और +\%Y-\%m-\%d_\%H-\%M-\%S
मार्कोस

जवाबों:


14

यह मानते हुए कि आप लिनक्स पर हैं, आउटपुट atqहमेशा एक ही प्रारूप में होता है। खेतों को उचित क्रम में क्रमबद्ध करें, यह घोषित करने के लिए ध्यान रखें कि कौन से नंबर या महीने के नाम हैं। महीने के नामों के लिए अंग्रेजी लोकेल का उपयोग करना सुनिश्चित करें क्योंकि यह atqउपयोग करता है।

atq | sort -k 6n -k 3M -k 4n -k 5 -k 7 -k 1
#          year  month day   time queue id

2

sortआदेश यह कर सकते हैं, लेकिन दुर्भाग्य से, आप उपयोग नहीं कर सकते --month-sortऔर --numeric-sortएक साथ। तो उपयोग करें:

$ atq |
    sed 's/Jan/1/;s/Feb/2/;s/Mar/3/;s/Apr/4/;s/May/5/;s/Jun/6/;s/Jul/7/;s/Aug/8/;s/Sep/9/;s/Oct/10/;s/Nov/11/;s/Dec/12/' |
    sort -n -k6,6 -k3,4

यह महीने के संक्षिप्त रूपों को उनके संख्यात्मक मानों में बदल देगा, फिर पहले वर्ष ( -k6,6), फिर महीने और दिन ( -k3,4) को क्रमबद्ध करेगा । आउटपुट में महीने के नाम नहीं होंगे, लेकिन अगर आप वास्तव में चाहते हैं, तो आप उन लोगों को दूसरे के साथ बदल सकते हैं sed

$ atq |
    sed 's/Jan/1/;s/Feb/2/;s/Mar/3/;s/Apr/4/;s/May/5/;s/Jun/6/;s/Jul/7/;s/Aug/8/;s/Sep/9/;s/Oct/10/;s/Nov/11/;s/Dec/12/' |
    sort -n -k6,6 -k3,4 |
    sed 'h;s/^[0-9][0-9]*  *[A-Z][a-z][a-z] *\([0-9][0-9]*\).*/\1/;s/10/Oct/;s/11/Nov/;s/12/Dec/;s/1/Jan/;s/2/Feb/;s/3/Mar/;s/4/Apr/;s/5/May/;s/6/Jun/;s/7/Jul/;s/8/Aug/;s/9/Sep/;G;s/^\(.*\)\n\([0-9][0-9]*  *[A-Z][a-z][a-z] *\)[0-9][0-9]*\( .*\)/\2\1\3/'

नोटिस जो s/12/Dec/पहले आने की जरूरत है s/1/Jan/


1
200 + नौकरियों के साथ एक होस्ट पर आउटपुट मुख्य रूप से आईडी द्वारा क्रमबद्ध किया गया लगता है - 2 हॉफ में हमेशा टाइमस्टैम्प नहीं। वैसे भी, dateकमांड में विशेष टाइमस्टैम्प-पार्सिंग शक्तियां होती हैं जो सही क्षेत्रों जैसे कि तंग आने पर इसे सरल बना सकती हैं। के साथ cut
मार्कोस

1
आप प्रत्येक -kविकल्प पर एक अलग तरह का विकल्प पारित कर सकते हैं : -k 3Mऔर इसी तरह।
गिल्स एसओ- बुराई को रोकना '

0

जटिल लगता है, लेकिन यह भी काम करता है:

atq |awk '{system("echo "$1 "  $(date +%Y-%m-%d_%H-%M-%S \
--date \""$2" "$3" "$4" "$5" "$6"\")  "$7"  "$8 )}' |sort -k2 
    469  2012-03-24_01-30-00  a  master
    655  2012-03-24_02-03-00  a  master
    671  2012-03-24_02-04-00  a  master
    657  2012-03-24_02-09-00  a  master
    673  2012-03-24_02-11-00  a  master
    537  2012-03-25_00-38-00  a  master
    539  2012-03-25_00-43-00  a  master
    652  2012-03-27_12-57-00  a  master
    654  2012-03-27_13-03-00  a  master
    656  2012-03-27_13-09-00  a  master

अन्य सुझावों की तुलना में मुझे पसंद है कि कैसे वास्तविक पार्सिंग को छोड़ दिया जाता है, dateजो टेक्स्ट टाइमस्टैम्प को समझता है, इसलिए आप जो कुछ भी चाहते हैं उसे सुधार सकते हैं जो इसे फ़िल्टर करने या बाद में छाँटने के लिए एक हवा बनाता है।

आप |column -t अंत में अच्छी तरह से संरेखित कर सकते हैं और खेतों को खाली कर सकते हैं।


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