어쩌면 내가 간단한 해결책을 놓쳤을 수도 있습니다. 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가 점프하는 경우에도 효과가 없습니다.
답변1
Linux를 사용한다고 가정하면 의 출력은 atq
항상 동일한 형식의 날짜를 갖습니다. 필드를 적절한 순서로 정렬하고 어느 것이 숫자인지 월 이름인지 선언하세요. 월 이름에는 영어 로캘이 사용되므로 이를 사용해야 합니다 atq
.
atq | sort -k 6n -k 3M -k 4n -k 5 -k 7 -k 1
# year month day time queue id
답변2
이 명령으로 그렇게 할 수 있지만 안타깝게도 and 를 함께 사용할 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/
.
답변3
복잡해 보이지만 이 방법도 작동합니다.
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
필드를 깔끔하게 정렬하고 구분할 수 있습니다.
답변4
atq
"strftime과 유사한 시간 형식"을 정의할 수 있습니다. 시대를 사용하여 쉽게 정렬한 다음 읽을 수 있는 것으로 변환할 수 있습니다. Epoch의 또 다른 장점은 시간 계산을 수행할 수 있다는 것입니다.
$ atq -o%s | sort -k2n | while read -r id epoch data; do
echo "$id $(date --date @$epoch) $data"
done
atqq
스크립트에서 이 방법을 사용하고 있습니다.
- 날짜별로 채용정보를 정렬하고,
- 작업 명령을 인쇄하고
- 이벤트가 만료되기 전의 기간을 표시합니다.
출력 예:
$ atqq
5515 2023-11-02 12:00:00 a user: "strobe blue" (1:59:08)
5514 2023-11-02 12:30:00 a user: "strobe red" (2:29:08)
#!/bin/bash
duration() {
local i=$1
local d=$((i / (3600 * 24)))
((i %= 3600 * 24))
local h=$((i / 3600))
((i %= 3600))
local m=$((i / 60))
local s=$((i % 60))
if [ $d -gt 0 ]; then
printf "%ud %u:%02u:%02u" $d $h $m $s
elif [ $h -gt 0 ]; then
printf "%u:%02u:%02u" $h $m $s
elif [ $m -gt 0 ]; then
printf "%u:%02u" $m $s
else
printf "%u" $s
fi
}
now=$(date +%s)
atq -o%s | sort -k2n | while read -r id epoch data; do
date=$(date --date @$epoch +%F\ %T)
cmd=$(at -c $id | sed '/^$/d' | tail -1)
diff=$((epoch - now))
if [ $diff -gt 0 ]; then
remaining="\e[32m$(duration $diff)\e[m"
else
remaining="\e[31m-$(duration ${diff#-})\e[m"
fi
echo -e "\e[1m$id\e[m $date $data: \e[33m\"$cmd\"\e[m ($remaining)"
done