ordenar en trabajos cronológicamente

11

Posiblemente una solución simple que extravié. ¿Cómo puedo obtener la salida de atqorden cronológico, para que pueda ver fácilmente quién debe ejecutar a continuación? La manpágina sortno tiene nada incorporado para reconocer marcas de tiempo como las siguientes:

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 tampoco funcionaría en el salto de la identificación del trabajo.

Marcos
fuente
Estoy de acuerdo con volver a formatear el segundo campo como 2012-03-23_13-11-01, que es fácil de clasificar, lo que creo que datepuede hacer. Con el --date=STRINGparam y +\%Y-\%m-\%d_\%H-\%M-\%S
Marcos

Respuestas:

14

Suponiendo que está en Linux, la salida de atqsiempre tiene la fecha en el mismo formato. Ordene los campos en el orden apropiado, teniendo cuidado de declarar cuáles son números o nombres de mes. Asegúrese de usar una configuración regional en inglés para los nombres de los meses, ya que eso es lo que atqusa.

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

El sortcomando puede hacerlo, pero desafortunadamente, no se puede usar --month-sorty --numeric-sortjuntos. Entonces 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

Esto convertirá las abreviaturas de mes a sus valores numéricos, luego se ordenarán primero por año ( -k6,6), luego mes y día ( -k3,4). La salida no tendrá los nombres de los meses, pero si realmente lo desea, puede convertirlos de nuevo con otro 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/'

Tenga en cuenta que s/12/Dec/debe venir antes s/1/Jan/.

Arcege
fuente
1
En un host con más de 200 trabajos, la salida parece estar ordenada principalmente por id, no siempre con la marca de tiempo en la segunda mitad. De todos modos, el datecomando tiene poderes especiales de análisis de marca de tiempo que podrían simplificar esto cuando se alimentan los campos correctos, por ejemplo. con cut.
Marcos
1
Puede pasar una opción de clasificación por separado en cada -kopción: -k 3My así sucesivamente.
Gilles 'SO- deja de ser malvado'
0

Parece complicado pero esto también 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

En comparación con otras sugerencias, me gusta cómo se deja el análisis real para dateque comprenda la marca de tiempo textual, para que pueda volver a formatear lo que quiera que haga que sea muy fácil filtrar u ordenar más tarde.

Puede agregar una |column -t al final para alinear y espaciar bien los campos.

Marcos
fuente
En realidad, una versión más corta puede ser factible con bash readlineen lugar deawk
Marcos