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.


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

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/.


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.


En fait, une version plus courte peut être faisable avec bash readlineau lieu deawk
Marcos
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.