可能是我放错了一个简单的解决方案。我怎样才能按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
该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
理解文本时间戳,这样您就可以重新格式化为您想要的任何内容,这使得以后过滤或排序变得轻而易举。
您可以在末尾添加 a|column -t
以很好地对齐和分隔字段。
答案4
atq
允许定义“类似 strftime 的时间格式”。人们可以使用纪元进行轻松排序,然后将其转换为可读的内容。纪元还有一个优点就是可以进行时间计算。
$ 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