按时间排序


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 在工作编号跳来跳去也不会工作。


我可以将第二个字段的格式重新设置为2012-03-23_13-11-01,这对排序很友好,我认为date可以做到。与--date=STRING参数和 +\%Y-\%m-\%d_\%H-\%M-\%S
Marcos 2012年

Answers:


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)'所以

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 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.