ordenar tarefas cronologicamente

11

Possivelmente uma solução simples que eu extraviei. Como posso atqclassificar cronologicamente a saída , para que eu possa ver facilmente quem deve executar a seguir? A manpágina para sortnão possui nada interno para reconhecer registros de data e hora como o seguinte:

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 também não funcionaria no salto da identificação do trabalho.

Marcos
fonte
Eu estou bem com a reformatação do segundo campo como 2012-03-23_13-11-01, que é fácil de classificar, o que eu acho que datepode fazer. Com o --date=STRINGparam e +\%Y-\%m-\%d_\%H-\%M-\%S
Marcos

Respostas:

14

Supondo que você esteja no Linux, a saída de atqsempre tem a data no mesmo formato. Classifique os campos na ordem apropriada, declarando quais são os números ou os nomes dos meses. Certifique-se de usar uma localidade em inglês para os nomes dos meses, pois é isso que atqusa.

atq | sort -k 6n -k 3M -k 4n -k 5 -k 7 -k 1
#          year  month day   time queue id
Gilles 'SO- parar de ser mau'
fonte
2

O sortcomando pode fazer isso, mas, infelizmente, você não pode usar --month-sorte --numeric-sortjuntos. Então use:

$ 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

Isso converterá as abreviações do mês em seus valores numéricos e, em seguida, classificará primeiro no ano ( -k6,6), depois mês e dia ( -k3,4). A saída não terá os nomes dos meses, mas se você realmente quiser, poderá convertê-los com outro 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/'

Observe que s/12/Dec/precisa vir antes s/1/Jan/.

Arcege
fonte
1
Em um host com mais de 200 trabalhos, a saída parece ser classificada principalmente por ID - nem sempre com registro de data e hora no segundo semestre. De qualquer forma, o datecomando possui poderes especiais de análise de registro de data e hora que podem tornar isso mais simples quando alimentados nos campos corretos, por exemplo. com cut.
Marcos
1
Você pode passar uma opção de classificação separada em cada -kopção: -k 3Me assim por diante.
Gilles 'SO- stop being evil'
0

Parece complicado, mas isso também funciona:

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

Comparado com outras sugestões, eu gosto de como a análise real é deixada para a datequal compreende o carimbo de data / hora do texto, para que você possa reformatar para o que quiser, tornando mais fácil filtrar ou classificar mais tarde.

Você pode aplicar um |column -t no final para alinhar e espaçar os campos.

Marcos
fonte
Na verdade, uma versão mais curta pode ser factível com bash readlineem vez deawk
Marcos