เรียงลำดับที่งานตามลำดับเวลา


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 จะไม่ทำงานทั้งที่รหัสงานกระโดดไปมา


ฉันโอเคกับการจัดรูปแบบฟิลด์ที่ 2 อีกครั้งเป็น 2012-03-23_13-11-01 ซึ่งเป็นมิตรกับการเรียงลำดับซึ่งฉันคิดว่าdateสามารถทำได้ กับ--date=STRINGparam และ +\%Y-\%m-\%d_\%H-\%M-\%S
Marcos

คำตอบ:


14

สมมติว่าคุณอยู่บน Linux ผลลัพธ์ของการ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 งานผลลัพธ์จะถูกเรียงลำดับตาม id ส่วนใหญ่ไม่ใช่การประทับเวลาในครึ่งหลังเสมอไป อย่างไรก็ตามdateคำสั่งมีพลังการประทับเวลาพิเศษที่สามารถทำให้สิ่งนี้ง่ายขึ้นเมื่อป้อนฟิลด์ที่ถูกต้องเช่น cutกับ
Marcos

1
คุณสามารถผ่านตัวเลือกการจัดเรียงแยกต่างหากในแต่ละ-kตัวเลือก: -k 3Mและอื่น ๆ
Gilles 'หยุดความชั่วร้าย'

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
Marcos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.