сортувати на робочих місцях хронологічно


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 не працював би ні при стрибку роботи id.


Я добре з переформатуванням 2-го поля як 2012-03-23_13-11-01, що є зручним для сортування, що, на мою думку, dateможе зробити. З --date=STRINGпарам і +\%Y-\%m-\%d_\%H-\%M-\%S
Маркос

Відповіді:


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 - не завжди часові позначки у 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 натиснути на a в кінці, щоб добре вирівняти поля та розмістити пробіли.


Насправді, bash readlineзамістьawk
Маркос,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.