sortuj chronologicznie w miejscach pracy


11

Prawdopodobnie proste rozwiązanie, które zgubiłem. Jak mogę uzyskać dane wyjściowe atqposortowane chronologicznie, dzięki czemu mogę łatwo zobaczyć, kto ma zostać uruchomiony w następnej kolejności? manAktualizacja sortnie ma nic wbudowaną rozpoznawania znaczników czasu tak:

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 nie zadziałałby też przy skoku identyfikatora pracy.


Nie mam nic przeciwko przeformatowaniu drugiego pola na 2012-03-23_13-11-01, co jest przyjazne dla sortowania, co moim zdaniem datemoże zrobić. Z --date=STRINGparam i +\%Y-\%m-\%d_\%H-\%M-\%S
Marcos

Odpowiedzi:


14

Zakładając, że jesteś w systemie Linux, wyjście atqzawsze ma datę w tym samym formacie. Posortuj pola w odpowiedniej kolejności, zwracając uwagę na to, które z nich są liczbami lub nazwami miesięcy. Pamiętaj, aby używać nazw narodowych w języku angielskim dla nazw miesięcy, ponieważ tego właśnie atqużywa.

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

2

sortKomenda może to zrobić, ale niestety, nie można używać --month-sorti --numeric-sortrazem. Więc użyj:

$ 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

Spowoduje to konwersję skrótów miesiąca na ich wartości liczbowe, a następnie sortowanie według roku ( -k6,6), a następnie miesiąca i dnia ( -k3,4). Dane wyjściowe nie będą miały nazw miesięcy, ale jeśli naprawdę tego chcesz, możesz przekonwertować je z innym 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/'

Zauważ, że s/12/Dec/musi to nastąpić wcześniej s/1/Jan/.


1
Na jednym hoście z ponad 200 zadaniami wyjście wydaje się być posortowane głównie według id - nie zawsze znacznik czasu w drugiej połowie. W każdym razie datepolecenie ma specjalne właściwości analizujące znaczniki czasu, które mogą uprościć to, gdy zostaną podane odpowiednie pola, np. z cut.
Marcos

1
Możesz przekazać osobną opcję sortowania dla każdej -kopcji: -k 3Mi tak dalej.
Gilles 'SO - przestań być zły'

0

Wygląda na skomplikowane, ale działa to również:

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

W porównaniu z innymi sugestiami podoba mi się sposób, w jaki pozostawiono rzeczywistą analizę, datektóra rozpoznaje tekstowy znacznik czasu, dzięki czemu można sformatować wszystko, co chcesz, dzięki czemu filtrowanie lub sortowanie jest dziecinnie proste.

Możesz przyczepić się |column -t na końcu, aby ładnie wyrównać i rozmieścić pola.


W rzeczywistości krótsza wersja może być wykonalna bash readlinezamiastawk
Marcos
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.