işleri kronolojik olarak sırala


11

Muhtemelen basit bir çözüm yanlış yerleştirdim. atqSıralanan çıktıyı kronolojik olarak nasıl edinebilirim , böylece sırada kimin çalışacağını kolayca görebilir miyim? manSayfa sortaşağıdaki gibi damgaları tanımak için yerleşik bir şey yok:

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 ya iş kimliğinin etrafında atlamak işe yaramaz.


2. alanı 2012-03-23_13-11-01 olarak yeniden sıralamakta sorun yok, ki bu sıralama dostu, ki dateyapabileceğimi düşünüyorum . İle --date=STRINGparam ve +\%Y-\%m-\%d_\%H-\%M-\%S
Marcos

Yanıtlar:


14

Linux'ta olduğunuzu varsayarsak, çıktı atqher zaman aynı biçimde tarih alır. Hangi alanların sayı veya ay adı olduğunu belirtmeye dikkat ederek alanları uygun sırayla sıralayın. Ay isimleri için İngilizce yerel ayar kullandığınızdan emin olun, çünkü bu atqkullanır.

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

2

sortKomut yapabilirsiniz, ancak ne yazık ki kullanamazsınız --month-sortve --numeric-sortbirlikte. Yani kullanın:

$ 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

Bu, ay kısaltmalarını sayısal değerlerine dönüştürecek, ardından önce yıl ( -k6,6), ardından ay ve gün ( -k3,4) olarak sıralayacaktır . Çıktının ay adları olmayacak, ancak gerçekten isterseniz, bunları başka biriyle dönüştürebilirsiniz 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/'

s/12/Dec/Önceden gelmesi gerektiğini fark ettim s/1/Jan/.


1
200'den fazla işi olan bir ana bilgisayarda, çıktı esas olarak kimliğe göre sıralanıyor gibi görünüyor - her zaman 2. yarıda zaman damgası değil. Her neyse, datekomutun doğru alanlarla beslendiğinde bunu basitleştirebilecek özel zaman damgası ayrıştırma güçleri vardır. ile cut.
Marcos

1
Her -kseçeneğe ayrı bir sıralama seçeneği iletebilirsiniz : -k 3Mvb.
Gilles 'SO- kötü olmayı kes'

0

Karmaşık görünüyor ama bu da işe yarıyor:

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

Diğer önerilere kıyasla date, metin zaman damgasını anlayan gerçek ayrıştırmanın nasıl kaldığını seviyorum , böylece daha sonra filtrelemek veya sıralamak için bir esinti yapan istediğiniz her şeyi yeniden biçimlendirebilirsiniz.

|column -t Alanları güzelce hizalamak ve boşluk bırakmak için sonunda a yapıştırabilirsiniz .


Aslında, bash readlinebunun yerine daha kısa bir sürüm yapılabilirawk
Marcos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.