sắp xếp công việc theo thời gian


11

Có thể là một giải pháp đơn giản tôi đặt không đúng chỗ. Làm cách nào tôi có thể nhận được đầu ra của atqsắp xếp theo thứ tự thời gian, để tôi có thể dễ dàng biết ai sẽ chạy tiếp theo? Các mantrang cho sortkhông có bất cứ điều gì built-in để nhận timestamps như sau:

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 sẽ không làm việc ở bước nhảy của id công việc.


Tôi ổn với việc định dạng lại trường thứ 2 là 2012-03-23_13-11-01, đây là cách sắp xếp thân thiện, điều mà tôi nghĩ datecó thể làm được. Với thông số --date=STRING+\%Y-\%m-\%d_\%H-\%M-\%S
Marcos

Câu trả lời:


14

Giả sử bạn đang ở trên Linux, đầu ra atqluôn có ngày ở cùng định dạng. Sắp xếp các trường theo thứ tự thích hợp, chú ý khai báo trường nào là số hoặc tên tháng. Đảm bảo sử dụng ngôn ngữ tiếng Anh cho tên tháng vì đó là những gì atqsử dụng.

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

2

Các sortlệnh có thể làm điều đó, nhưng không may, bạn không thể sử dụng --month-sort--numeric-sortvới nhau. Vì vậy, sử dụng:

$ 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

Điều này sẽ chuyển đổi các chữ viết tắt tháng thành giá trị số của chúng, sau đó sắp xếp đầu tiên vào năm ( -k6,6), sau đó là tháng và ngày ( -k3,4). Đầu ra sẽ không có tên tháng, nhưng nếu bạn thực sự muốn, bạn có thể chuyển đổi chúng thành tên khác 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/'

Lưu ý rằng s/12/Dec/cần phải đến trước s/1/Jan/.


1
Trên một máy chủ có hơn 200 công việc, đầu ra dường như được sắp xếp theo id chủ yếu - không phải lúc nào cũng có dấu thời gian trong nửa sau. Dù sao, datelệnh có các khả năng phân tích dấu thời gian đặc biệt có thể làm cho việc này đơn giản hơn khi được cung cấp đúng các trường, ví dụ. với cut.
Marcos

1
Bạn có thể vượt qua một tùy chọn sắp xếp riêng biệt trên mỗi -ktùy chọn: -k 3Mvân vân.
Gilles 'SO- ngừng trở nên xấu xa'

0

Có vẻ phức tạp nhưng điều này cũng hoạt động:

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

So với các đề xuất khác, tôi thích cách phân tích cú pháp thực tế để datehiểu dấu thời gian văn bản, vì vậy bạn có thể định dạng lại bất cứ điều gì bạn muốn để dễ dàng lọc hoặc sắp xếp sau này.

Bạn có thể giải quyết vấn đề |column -t ở cuối để căn chỉnh độc đáo và không gian ngoài các lĩnh vực.


Trên thực tế, một phiên bản ngắn hơn có thể được thực hiện bash readlinethay vìawk
Marcos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.