একটি ফাইলের নির্দিষ্ট বিষয়বস্তু ধরুন


9

সুতরাং আমি জানি যে এই সমস্যার জন্য সরঞ্জামগুলি বিদ্যমান কারণ আমি তাদের সম্পর্কে শুনেছি, তবে সেগুলি কী তা আমি জানি না।

আমি সমস্ত ডেটা ফিল্টার আউট করার মতো কিছু করতে চাই কিন্তু / ইত্যাদি / পাসডাব্লুডে ব্যবহারকারীর নাম।

উদাহরণস্বরূপ, আমি নিম্নলিখিত ফাইলটি থেকে ব্যবহারকারী 1, ব্যবহারকারী 2 এবং ব্যবহারকারী 3 দখল করতে চাই। এই ক্ষেত্রে, যুক্তিটি "ফাইলের প্রতিটি লাইনে প্রথম ':' টেক্সটটি ধরতে পারে"।

user1:x:1:4
user2:x:2:5
user3:x:3:6

আউটপুটটি হবে:

user1
user2
user3

উত্তর:


19

cutঠিক এই উদ্দেশ্যে বিদ্যমান। -dপতাকা বিভেদক নির্দিষ্ট করে, এবং -fনির্দিষ্ট করে যা আউটপুট ক্ষেত্র:

cut -d: -f1 /etc/passwd

যুক্তিটি প্রথম এবং তৃতীয় ক্ষেত্রটি দেখানোর -fমতো 1,3বা 1-3প্রথম তিনটি দেখানোর মতো কিছু হতে পারে ; ক্ষেত্রগুলির পরিবর্তে বাইটস এবং অক্ষরগুলি পড়ার জন্য -bএবং -cপতাকাও রয়েছে। আপনার যদি আরও নমনীয় কিছু প্রয়োজন হয় তবে সাধারণত awkকৌশলটি সম্পাদন করবেন ( ম্যাথিউয়ের উত্তর দেখুন )


13

আপনি যখনই একটি সারণী ইনপুট থেকে ডেটা উত্তোলন করতে চান, আপনার উচিত বিশ্রী বিবেচনা করা উচিত । এটি কার্যত প্রতিটি ইউনিক্স সিস্টেমে পাওয়া যায়, তাই এটি নেওয়া ভাল অভ্যাস:

awk -F':' '{print $1}' /etc/passwd 
  • -F':': ":" কে কলাম ডিলিমিটার হিসাবে সংজ্ঞায়িত করে।
  • '{}': প্রতিটি লাইনের জন্য এই নির্দেশনা কার্যকর করুন।
  • print $1: স্ক্রিনে প্রথম কলামটি মুদ্রণ করুন।

3
এলোমেলো নোট: awkএকটি ফাইলের নাম নেয়, তাই আপনি পাইপটি এড়িয়ে যেতে পারেন এবং করতে পারেনawk -F: '{print $1}' /etc/passwd
মাইকেল মরোজেক

আমি সবসময় ভুলে যাব বলে মনে হয় যে awk কোনও ফাইলের নাম নেয়, আমি সবসময় পাইপলাইনে এটি ব্যবহার করি বলে মনে করি ... সেডের মতো কিছু | awk ইত্যাদি ...
ম্যাথু ব্রানিগান

ফাইলগুলির সাথে কাজ করে এমন প্রায় সবগুলিই ফাইলের নাম নেয় ( trএবং atএটি কয়েকটি জিনিসগুলির কয়েকটি উদাহরণ যা)।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।


1

পার্ল এবং অ্যাডকের নীচে, এই জাতীয় কাজের জন্য একটি তৃতীয় সরঞ্জাম রয়েছে, যা সেড:

sed 's/:.*//' FILE 

এটি সাবস্টিটিউশন কমান্ড: কোলন থেকে বিকল্প: এর পরে একটি বিন্দু, যা কোনও ধরণের, কোনও গণনার (*) অক্ষরের জন্য জোকার ok

এটি টি (খালি) / এফআরএম / টো / 'টি টি খালি থাকার সাথে, যার অর্থ' প্রথম থেকে সমস্ত মুছুন (যেহেতু সেড ডিফল্ট দ্বারা লোভী) কোলন (লাইনের শেষ অবধি, যেহেতু পুরো লাইনের সাথে ভালভাবে কাজ করে)।

অবশ্যই cutএকটি সূক্ষ্ম আদেশ আছে, তবে আমি অন্য পরিবার থেকে বলতে পারি।


1

আপনার উদাহরণে, সমস্ত 3 নাম একই দৈর্ঘ্যের। এ জাতীয় ক্ষেত্রে - যা ঘটতে পারে তবে / ইত্যাদি / পাসডাব্লুডের সাথে তেমন সম্ভাবনা নেই - আপনিও কলার ব্যবহার করতে পারেন:

echo "user1:x:1:4
> user2:x:2:5
> user3:x:3:6" | colrm 6
user1
user2
user3

বা অবশ্যই

cat FILE | colrm 6 

(বিরল ক্ষেত্রে যেখানে useless use of catপ্রয়োগ হয় না, কারণ প্যারামিটার হিসাবে কাজ করার জন্য আপনি কোনও ফাইল কলার হাতে দিতে পারেন না))


catএখনও সেখানে অনর্থক: colrm 6 < FILE
manatwork

ঠিক আছে, হ্যাঁ, তবে কল করার মতো এটি অকেজো নয় cat foo | grep bar
ব্যবহারকারী অজানা

1

কেবল সম্পূর্ণতার জন্য, বাহ্যিক কমান্ডের প্রয়োজন নেই, শেল (বোর্ন শেল বা সামঞ্জস্যপূর্ণ) এটিকে একা পরিচালনা করতে পারে:

while IFS=':' read -r needed garbage; do echo "$needed"; done < input_file

অবশ্যই, এটি সম্ভবত সমস্ত সম্ভাব্য সমাধানগুলির মধ্যে ধীরতম, তাই বিশাল ফাইলগুলির জন্য অন্য চয়ন করুন।

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