urutkan pekerjaan secara kronologis

11

Mungkin solusi sederhana yang saya salah tempat. Bagaimana saya bisa mendapatkan output yang atqdiurutkan secara kronologis, sehingga saya dapat dengan mudah melihat siapa yang akan menjalankan selanjutnya? The manhalaman untuk sorttidak memiliki apa-apa built-in untuk mengenali cap waktu seperti berikut:

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 tidak akan bekerja baik di id pekerjaan melompat-lompat.

Marcos
sumber
Saya baik-baik saja dengan memformat ulang bidang 2 sebagai 2012-03-23_13-11-01 yang ramah sorting, yang saya pikir datebisa dilakukan. Dengan --date=STRINGparam dan +\%Y-\%m-\%d_\%H-\%M-\%S
Marcos

Jawaban:

14

Dengan asumsi Anda menggunakan Linux, output atqselalu memiliki tanggal dalam format yang sama. Urutkan bidang dalam urutan yang sesuai, dengan hati-hati untuk menyatakan mana yang merupakan angka atau nama bulan. Pastikan untuk menggunakan bahasa Inggris untuk nama bulan karena itulah yang atqdigunakan.

atq | sort -k 6n -k 3M -k 4n -k 5 -k 7 -k 1
#          year  month day   time queue id
Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

The sortperintah dapat melakukannya, tapi sayangnya, Anda tidak dapat menggunakan --month-sortdan --numeric-sortbersama-sama. Jadi gunakan:

$ 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

Ini akan mengonversi singkatan bulan menjadi nilai numeriknya, lalu mengurutkannya pertama kali pada tahun ( -k6,6), lalu bulan dan hari ( -k3,4). Output tidak akan memiliki nama bulan, tetapi jika Anda benar-benar menginginkannya, Anda dapat mengonversinya kembali dengan yang lain 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/'

Perhatikan bahwa s/12/Dec/perlu datang sebelumnya s/1/Jan/.

Arcege
sumber
1
Pada satu host dengan 200+ pekerjaan, output tampaknya diurutkan berdasarkan id terutama - tidak selalu timestamp di babak ke-2. Bagaimanapun, dateperintah memiliki kekuatan parsing timestamp khusus yang bisa membuat ini lebih sederhana ketika diberi makan bidang yang tepat misalnya. dengan cut.
Marcos
1
Anda bisa memberikan opsi pengurutan terpisah pada setiap -kopsi: -k 3Mdan seterusnya.
Gilles 'SANGAT berhenti menjadi jahat'
0

Terlihat rumit tetapi ini juga berfungsi:

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

Dibandingkan dengan saran lain saya suka bagaimana parsing sebenarnya dibiarkan dateyang memahami cap waktu tekstual, sehingga Anda dapat memformat ulang untuk apa pun yang Anda inginkan yang membuatnya mudah untuk menyaring atau mengurutkan nanti.

Anda dapat menempel pada |column -t pada akhirnya untuk menyelaraskan dan ruang keluar dengan baik.

Marcos
sumber
Sebenarnya, versi yang lebih pendek mungkin dapat dilakukan bash readlinealih - alihawk
Marcos