bei Jobs chronologisch sortieren

11

Möglicherweise eine einfache Lösung, die ich verlegt habe. Wie kann ich die Ausgabe atqchronologisch sortieren, damit ich leicht sehen kann, wer als nächstes ausgeführt wird? Auf der manSeite für sortist nichts zum Erkennen von Zeitstempeln wie den folgenden integriert:

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 würde auch nicht funktionieren, wenn die Job-ID herumspringt.

Marcos
quelle
Ich bin damit einverstanden, das 2. Feld als 2012-03-23_13-11-01 neu zu formatieren, was sortierungsfreundlich ist, was meiner Meinung nach möglich dateist. Mit dem --date=STRINGparam und +\%Y-\%m-\%d_\%H-\%M-\%S
Marcos

Antworten:

14

Angenommen, Sie arbeiten unter Linux, hat die Ausgabe von atqimmer das Datum im gleichen Format. Sortieren Sie die Felder in der entsprechenden Reihenfolge und geben Sie dabei an, welche Zahlen oder Monatsnamen sind. Stellen Sie sicher, dass Sie ein englisches Gebietsschema für die Monatsnamen verwenden, da dies atqverwendet wird.

atq | sort -k 6n -k 3M -k 4n -k 5 -k 7 -k 1
#          year  month day   time queue id
Gilles 'SO - hör auf böse zu sein'
quelle
2

Der sortBefehl kann es tun, aber leider können Sie nicht --month-sortund --numeric-sortzusammen verwenden. Verwenden Sie also:

$ 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

Dadurch werden die Monatsabkürzungen in ihre numerischen Werte konvertiert und dann zuerst nach Jahr ( -k6,6), dann nach Monat und Tag ( -k3,4) sortiert . Die Ausgabe hat nicht die Monatsnamen, aber wenn Sie es wirklich wollten, können Sie diese mit einem anderen zurückkonvertieren 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/'

Beachten Sie, dass s/12/Dec/vorher kommen muss s/1/Jan/.

Arcege
quelle
1
Auf einem Host mit mehr als 200 Jobs scheint die Ausgabe hauptsächlich nach ID sortiert zu sein - nicht immer nach dem Zeitstempel in der 2. Hälfte. Auf jeden Fall verfügt der dateBefehl über spezielle Zeitstempel-Analysefunktionen, die dies vereinfachen könnten, wenn die richtigen Felder eingegeben werden, z. mit cut.
Marcos
1
Sie können für jede -kOption eine separate Sortieroption übergeben : -k 3Mund so weiter.
Gilles 'SO - hör auf böse zu sein'
0

Sieht kompliziert aus, funktioniert aber auch:

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

Im Vergleich zu anderen Vorschlägen gefällt mir, wie die eigentliche Analyse datedem Textzeitstempel entspricht, sodass Sie nach Belieben neu formatieren können, sodass das Filtern oder Sortieren später zum Kinderspiel wird.

Sie können am |column -t Ende eine anheften, um die Felder schön auszurichten und zu platzieren.

Marcos
quelle
Tatsächlich kann eine kürzere Version mit bash readlinestattawk
Marcos