時系列でジョブを並べ替える


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のジャンプでも機能しません。


2番目のフィールドを2012-03-23_13-11-01として再フォーマットしても問題ありdateません。--date=STRINGPARAMと +\%Y-\%m-\%d_\%H-\%M-\%S
マルコス

回答:


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以上のジョブを持つ1つのホストでは、出力は主に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.