awk: একটি রিটার্ন স্ট্যাটাস জোর?


18

এটা আমার জন্য একটি ফলোআপ হয় তার আগে প্রশ্ন

আমি এই হ্যান্ডি স্নিপিটটি ব্যবহার করে / ইত্যাদি / পাসডাব্লুডে ক্ষেত্রের সংখ্যাটি যাচাই করছি। নিম্নলিখিত উদাহরণে, ব্যবহারকারীদের 'ফিল্ডকাউন্ট 1' এবং 'ফিল্ডকাউন্ট 2' ক্ষেত্রের ভুল সংখ্যা রয়েছে:

$ awk -F: ' NF!=7 {print}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
fieldcount2:blah::blah:1002:100:fieldcount2:/home/fieldcount2:/bin/bash:
$ echo $?
0

আপনি লক্ষ্য করবেন যে, awk 0 এর রিটার্নের স্থিতি দিয়ে প্রস্থান করবে it's এর অবস্থান থেকে, এখানে কোনও সমস্যা নেই।

আমি এই বিশ্রী বিবৃতিটি শেল স্ক্রিপ্টে অন্তর্ভুক্ত করতে চাই। আমি ত্রুটিযুক্ত সমস্ত লাইন মুদ্রণ করতে চাই এবং রিটার্ন কোডটি 1 (ত্রুটি) হিসাবে সেট করব।

আমি একটি নির্দিষ্ট প্রস্থান স্থিতি জোর করার চেষ্টা করতে পারি, কিন্তু তারপর এডক শুধুমাত্র একটি লাইন প্রিন্ট করে:

$ awk -F: ' NF!=7 {print ; exit 1}' /etc/passwd
fieldcount1:x:1000:100:fieldcount1:/home/fieldcount1:/bin/bash::::
$ echo $?
1

আমি কি '1' এর রিটার্নের স্থিতি দিয়ে জোর করে প্রস্থান করতে বাধ্য করতে পারি এবং মেলে সমস্ত লাইন মুদ্রণ করতে পারি?

উত্তর:


23

স্থিতিটি একটি চলকতে রাখুন এবং এটি একটি ENDব্লকে ব্যবহার করুন ।

awk -F: 'NF != 7 {print; err = 1}
         END {exit err}' /etc/passwd

খুব ভালো. তবে আমি এটিকে ব্যাশ স্ক্রিপ্টে অন্তর্ভুক্ত করতে সমস্যায় পড়ছি। আমি এই অ্যাডক স্টেটমেন্টের মতো কিছু যুক্ত করে এই অ্যাডক স্টেটমেন্টের রিটার্নের স্ট্যাটাসটি ক্যাপচার করার চেষ্টা করছি ; echo $?। যাইহোক, echo $?কখনও চালানো হয় না কারণ END {exit err}'স্ক্রিপ্টটি সমাপ্ত করে। প্রস্থান না করে ফেরতের স্থিতি নির্ধারণ করার কোনও উপায় আছে কি?
স্টেফান লাসিউইস্কি

6
@ স্টেফানলাসিউস্কি অ্যাজকে exit errশেষ করে, এটি স্ক্রিপ্টটি শেষ করে না। আপনার set -eকোনও স্ক্রিপ্টটিতে কোনও সুযোগ আছে? যদি তাই হয়, আপনি যদি শেলকে প্রস্থান করতে বলেছেন তবে যদি কোনও আদেশ একটি ননজারো স্থিতি ফিরিয়ে দেয়; আপনি যদি স্থিতিটি পরীক্ষা করতে চান তবে ব্যবহার করুন if awk …; then echo ok; else echo fail; fi
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গাইলস: হ্যাঁ, এই স্ক্রিপ্টটি set -eসেট করেছে। এটি আমি যে অদ্ভুত আচরণটি দেখছি তা ব্যাখ্যা করে। যে ইশারা জন্য ধন্যবাদ।
স্টিফান লাসিউইস্কি

1
যদি আপনি বাশের &&অপারেটরের সাথে আউটপুট ব্যবহার করার পরিকল্পনা করেন তবে এটি মনে রাখা উচিত যে "0 সত্য তবে শেলের মধ্যে 1 টি মিথ্যা"
স্কিপি লে গ্র্যান্ড গৌরু

8

আমি গ্রেপের অনুরূপ কিছু সন্ধান করছিলাম, যেখানে কোনও মিল খুঁজে পাওয়া না গেলে এটি 1 থেকে প্রস্থান করবে। এখানে Awk এর সমতুল্য:

#!/usr/bin/awk -f
BEGIN {
   b1 = 1
}
index($0, "sunday") > 0 {
   b1 = 0
   print
}
END {
   exit b1
}

0

এটি ওপি সঠিক প্রয়োজনীয়তার উত্তর দেয় না, তবে আপনি যদি কেবলমাত্র রিটার্ন কোডের বিষয়ে যত্নশীল হন এবং একই সাথে মেলে এমন লাইনগুলি মুদ্রণের প্রয়োজন না হয়grep -q তবে আপনি প্রথম ম্যাচের পরে প্রস্থান করার জন্য @ গিগাসৌসরের উত্তরটি পরিবর্তন করতে পারেন, যা বিশাল ইনপুটটির জন্য ত্রুটিটি ফাইলের প্রথম দিকে হলে ফাইলগুলি সময় সাশ্রয় করতে পারে। আশা করি /etc/passwdআপনার জন্য যোগ্যতা অর্জন করবে না!

awk -F: 'NF != 7 {err = 1; exit;}
     END {exit err}' /etc/passwd

1
awk -F: 'NF != 7 {exit 1}'একই কাজ করবে।
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.