сортировать на рабочих местах в хронологическом порядке

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 не будет работать ни на прыжке вокруг удостоверения личности.

Marcos
источник
Я в порядке с переформатированием 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/.

Arcege
источник
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 в конце, чтобы хорошо выровнять и разнести поля.

Marcos
источник
На самом деле, bash readlineвместоawk
Marcos