কালানুক্রমিকভাবে কাজ বাছাই


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 হিসাবে 2 য় ক্ষেত্রটি পুনরায় ফর্ম্যাট করার মাধ্যমে ঠিক আছি যা বাছাই-বান্ধব, যা আমি dateকরতে পারি বলে মনে করি। পরম --date=STRINGএবং +\%Y-\%m-\%d_\%H-\%M-\%S
মার্কোস

উত্তর:


14

ধরে নিচ্ছি আপনি লিনাক্সে 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+ জব সহ একটি হোস্টে আউটপুটটি মূলত আইডি দ্বারা সাজানো মনে হয় - সর্বদা দ্বিতীয়ার্ধে টাইমস্ট্যাম্প নয়। যাইহোক, dateকমান্ডটিতে একটি বিশেষ টাইমস্ট্যাম্প-পার্সিং শক্তি রয়েছে যা সঠিক ক্ষেত্রগুলি যেমন খাইয়ে দেওয়া হয় যখন এইটিকে আরও সহজ করে তুলতে পারে। সঙ্গে cut
মার্কোস

1
আপনি প্রতিটি -kঅপশনে একটি পৃথক বাছাই করতে পারেন বিকল্প: -k 3Mএবং আরও।
গিলস 'অশুভ হওয়া বন্ধ করুন'

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 ক্ষেত্রগুলি সুন্দরভাবে সারিবদ্ধ করতে এবং স্থান নির্ধারণ করতে শেষে একটি ট্যাক করতে পারেন ।


প্রকৃতপক্ষে, একটি সংক্ষিপ্ত সংস্করণ এর bash readlineপরিবর্তে ডাবল হতে পারেawk
মার্কোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.