ordina i lavori in ordine cronologico


11

Forse una soluzione semplice che ho messo fuori posto. Come posso ottenere l'output dell'ordinamento in atqordine cronologico, in modo da poter vedere facilmente chi dovrebbe essere eseguito successivamente? La manpagina per sortnon ha nulla incorporato per riconoscere i timestamp come il seguente:

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 non funzionerebbe neanche al salto dell'id del lavoro.


Sono d'accordo con la riformattazione del 2 ° campo come 23-03-2012 che è facile da selezionare, cosa che penso datepossa fare. Con il --date=STRINGparam e +\%Y-\%m-\%d_\%H-\%M-\%S
Marcos,

Risposte:


14

Supponendo che tu sia su Linux, l'output di atqha sempre la data nello stesso formato. Ordinare i campi nell'ordine appropriato, avendo cura di dichiarare quali sono i numeri o i nomi dei mesi. Assicurati di utilizzare un'impostazione internazionale inglese per i nomi dei mesi poiché è questo che atqutilizza.

atq | sort -k 6n -k 3M -k 4n -k 5 -k 7 -k 1
#          year  month day   time queue id

2

Il sortcomando può farlo, ma sfortunatamente non puoi usarlo --month-sorte --numeric-sortinsieme. Quindi usa:

$ 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

Questo convertirà le abbreviazioni del mese nei loro valori numerici, quindi ordinerà prima su year ( -k6,6), quindi su mese e giorno ( -k3,4). L'output non avrà i nomi dei mesi, ma se lo desideri davvero, potresti riconvertirli con un altro 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/'

Si noti che s/12/Dec/deve venire prima s/1/Jan/.


1
Su un host con oltre 200 lavori, l'output sembra essere ordinato principalmente per id, non sempre nel timestamp nella seconda metà. Ad ogni modo, il datecomando ha speciali poteri di analisi del timestamp che potrebbero renderlo più semplice se alimentato con i campi giusti, ad es. con cut.
Marcos,

1
È possibile passare un'opzione di ordinamento separata su ciascuna -kopzione: -k 3Me così via.
Gilles 'SO- smetti di essere malvagio' il

0

Sembra complicato ma funziona anche:

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

Rispetto ad altri suggerimenti, mi piace il modo in datecui viene lasciato l'analisi effettiva che comprende il timestamp testuale, in modo da poter riformattare ciò che vuoi che rende un gioco da ragazzi filtrare o ordinare in un secondo momento.

Puoi attaccare |column -t alla fine per allineare e distanziare bene i campi.


In realtà, una versione più breve può essere fattibile con bash readlineinvece diawk
Marcos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.