trier les travaux par ordre chronologique

11

Peut-être une solution simple que j'ai égarée. Comment puis-je obtenir la sortie de atqtri chronologiquement, afin que je puisse facilement voir qui doit s'exécuter ensuite? La manpage pour sortn'a rien intégré pour reconnaître les horodatages comme le suivant:

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 ne fonctionnerait pas non plus au saut de l'id du travail.

Marcos
la source
Je suis d'accord pour reformater le 2ème champ en 2012-03-23_13-11-01 qui est facile à trier, ce qui, je pense, datepeut le faire. Avec le --date=STRINGparam et +\%Y-\%m-\%d_\%H-\%M-\%S
Marcos

Réponses:

14

En supposant que vous êtes sous Linux, la sortie de a atqtoujours la date au même format. Triez les champs dans l'ordre approprié, en prenant soin de déclarer lesquels sont des nombres ou des noms de mois. Assurez-vous d'utiliser une locale en anglais pour les noms de mois, car c'est ce qui atqutilise.

atq | sort -k 6n -k 3M -k 4n -k 5 -k 7 -k 1
#          year  month day   time queue id
Gilles 'SO- arrête d'être méchant'
la source
2

La sortcommande peut le faire, mais malheureusement, vous ne pouvez pas utiliser --month-sortet --numeric-sortensemble. Alors utilisez:

$ 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

Cela convertira les abréviations du mois en leurs valeurs numériques, puis les triera d'abord sur l'année ( -k6,6), puis sur le mois et le jour ( -k3,4). La sortie n'aura pas les noms de mois, mais si vous le vouliez vraiment, vous pourriez les reconvertir avec un autre 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/'

Notez que cela s/12/Dec/doit venir avant s/1/Jan/.

Arcege
la source
1
Sur un hôte avec plus de 200 tâches, la sortie semble être principalement triée par identifiant - pas toujours d'horodatage au cours de la seconde moitié. Quoi qu'il en soit, la datecommande a des pouvoirs d'analyse d'horodatage spéciaux qui pourraient rendre cela plus simple lorsqu'elle est alimentée par les bons champs, par exemple. avec cut.
Marcos
1
Vous pouvez passer une option de tri distincte pour chaque -koption: -k 3Met ainsi de suite.
Gilles 'SO- arrête d'être méchant'
0

Cela semble compliqué, mais cela fonctionne aussi:

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

Par rapport à d'autres suggestions, j'aime la façon dont l'analyse réelle est laissée à datequi comprend l'horodatage textuel, de sorte que vous pouvez reformater ce que vous voulez, ce qui facilite le filtrage ou le tri plus tard.

Vous pouvez clouer sur un |column -t à la fin pour bien aligner et espacer les champs.

Marcos
la source
En fait, une version plus courte peut être faisable avec bash readlineau lieu deawk
Marcos