시간순으로 작업을 정렬


11

아마도 내가 놓은 간단한 해결책 일 것입니다. atq시간순 으로 정렬 된 결과를 얻으려면 어떻게 해야 다음에 누가 실행해야하는지 쉽게 알 수 있습니까? 의 man페이지 sort에는 다음과 같은 타임 스탬프를 인식 할 수있는 기능이 내장 되어 있지 않습니다.

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 작업 ID의 점프에서 작동하지 않습니다.


정렬하기 쉬운 2012-03-23_13-11-01로 두 번째 필드를 다시 포맷해도 괜찮습니다 date. --date=STRING매개 변수와 함께+\%Y-\%m-\%d_\%H-\%M-\%S
Marcos

답변:


14

Linux를 사용한다고 가정하면 출력의 atq날짜 는 항상 같은 형식입니다. 숫자 또는 월 이름이있는 필드를 선언하도록주의하면서 필드를 적절한 순서로 정렬하십시오. 월 이름에 영어 로캘을 사용해야 atq합니다.

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

2

sort명령은 그것을 할 수 있지만, 불행하게도, 당신은 사용할 수 없습니다 --month-sort--numeric-sort함께. 따라서 다음을 사용하십시오.

$ 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

월 약어를 숫자 값으로 변환 한 다음 연도 ( -k6,6), 월, 일 ( -k3,4)을 기준으로 먼저 정렬 합니다. 출력에는 월 이름이 없지만 원하는 경우 다른 월 이름으로 다시 변환 할 수 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/앞에 와야 s/1/Jan/합니다.


1
200 개 이상의 작업이있는 한 호스트에서 출력은 주로 후반에 타임 스탬프가 아닌 ID별로 정렬 된 것으로 보입니다. 어쨌든, date명령에는 올바른 타임 필드를 제공 할 때이를 단순화 할 수있는 특별한 타임 스탬프 파싱 기능이 있습니다. 로 cut.
Marcos

1
-k옵션 마다 별도의 정렬 옵션을 전달할 수 있습니다 -k 3M.
Gilles 'SO- 악마 그만'

0

복잡해 보이지만 작동합니다.

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

다른 제안과 비교하여 실제 파싱이 date텍스트 타임 스탬프를 이해하는 방식을 좋아 하므로 나중에 필터링하거나 정렬하기가 쉬운 원하는 형식으로 다시 포맷 할 수 있습니다.

|column -t 마지막 에 a 를 쳐서 필드를 잘 정렬하고 간격을 맞출 수 있습니다.


실제로, bash readline대신에 더 짧은 버전을 사용할 수 있습니다awk
Marcos
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.