কিভাবে একটি একক কলামে গ্রেপ চালানো যায়?


42

আমি আমার ls -lকমান্ডের আউটপুট গ্রেপ করতে চাই :

-rw-r--r--   1 root root       1866 Feb 14 07:47 rahmu.file
-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

আমি grep rahmuকেবল column 3 কলামে চালাতে চাই , সুতরাং আমার grepকমান্ডের আউটপুটটি দেখতে এই জাতীয় হওয়া উচিত:

-rw-r--r--   1 rahmu user     95653 Feb 14 07:47 foo.file
-rw-r--r--   1 rahmu user   1073822 Feb 14 21:01 bar.file

এটি করার সহজ উপায় কী? উত্তরটি অবশ্যই অনেক ইউনিসে পোর্টেবল হতে হবে, বিশেষত লিনাক্স এবং সোলারিসের দিকে মনোযোগ নিবদ্ধ করে।

এনবি: প্রদত্ত ব্যবহারকারীর সমস্ত ফাইল সন্ধানের জন্য আমি কোনও উপায় খুঁজছি না। এই উদাহরণটি কেবল আমার প্রশ্ন পরিষ্কার করার জন্য দেওয়া হয়েছিল।


5
দ্রষ্টব্য যে আউটপুটটি পার্সিং lsকরা স্বভাবগতভাবে নাজুক (চিন্তা করুন কোনও ব্যবহারকারীর নাম যদি সাদা অংশে থাকে তবে - এবং হ্যাঁ, এটি কিছু প্ল্যাটফর্মে ঘটে)। findপরিবর্তে ব্যবহার করুন।
গিলস 'অশুভ হওয়া বন্ধ করুন'

এটি শিরোনাম প্রশ্নের উত্তর দেয় না, তবে আমি উল্লেখ করব যে --printfবিকল্পগুলি সেই statজায়গায় কার্যকর হতে পারে যেখানে আপনি অন্যথায় বিশ্লেষণ বিবেচনা করতে পারেন ls। তবে সাধারণত, findআপনি যা চান (@ গিলিস উল্লিখিত হিসাবে)।
ওয়াইল্ডকার্ড

উত্তর:


49

আরও একবার সময় awkবাঁচায়!

তুলনামূলক সহজ বাক্য গঠন সহ এটি করার সহজ সরল উপায় এখানে:

ls -l | awk '{if ($3 == "rahmu") print $0;}'

বা আরও সহজ: (মন্তব্যগুলিতে পিটারকে ধন্যবাদ)

ls -l | awk '$3 == "rahmu"' 

9
বা: ls -l | awk '$3=="rahmu"'... এবং (ifawk '{if($3 ...'
যাইহোক

3
আমার কাছ থেকে @ পিটার.ও +1। আপনার কমান্ডটি আরও সংক্ষিপ্ত, সঠিক, যেহেতু মুদ্রণ একটি অ্যাজক ম্যাচের জন্য ডিফল্ট।
বিএসডি

স্থানীয়করণের সমস্যাগুলি এড়াতে (তারিখের ফর্ম্যাটটি কলাম অর্ডারকে প্রভাবিত করে) প্রায়শই স্ট্যান্ডার্ড ফর্ম্যাট এবং ভাষা নিশ্চিত করার পরামর্শ দেওয়া হয়:LANG=C ls -l | awk ...
fheub

16

আপনি যদি কোনও প্রদত্ত কলামের স্ট্রিংয়ের কেবলমাত্র অংশটিই মেলতে খুঁজছেন তবে আপনি https://stackoverflow.com/questions/17001849/awk-partly-string-match-if-column-partly-matches থেকে পরামর্শ ব্যবহার করতে পারেন

some_command | awk '$6 ~ /string/'

1
এটি শীর্ষ উত্তর হতে হবে
পেজোফিলো

11

যদি কলাম দ্বারা, আপনি স্থির আকারের কলামটি বোঝাতে পারেন, আপনি করতে পারেন:

ls -l | grep "^.\{15\}rahmu"

যেখানে ^লাইনটির শুরু .মানে, কোনও চরিত্রের \{15\}অর্থ এবং পূর্বের চরিত্রের ঠিক 15 উপস্থিতি (এই ক্ষেত্রে কোনও চরিত্র) এর অর্থ।


2

আমি জানি আমি পার্টিতে দেরি করেছি, তবে আমি বিশ্বাস করি যে এই সমস্যার একটি সাধারণ সমাধান হ'ল নিয়মিত প্রকাশের সাথে বিশৃঙ্খলা ব্যবহার করা:

awk '$3~/rahmu/{print}' input_file

'//' দ্বারা আবদ্ধ অংশটি কোনও ধরণের নিয়মিত প্রকাশ হতে পারে।


1

একক ব্যবহারকারীর কলামের উপর ভিত্তি করে গ্রেপ করতে (এবং কেবল ফাইলগুলি মুদ্রণ করুন), আপনি চেষ্টা করতে পারেন:

ls -la | grep "^-\S\+\s\+\S\+\s\+rahmu"

ডিরেক্টরিগুলির -জন্য d, কোনও ধরণের অপসারণের জন্য পরিবর্তিত করুন -

এটি মূলত প্রতিটি কলাম নির্বাচন করে \S\+\s\+যার দ্বারা একটি ফাঁকা অক্ষরগুলির পরে কোনও ফাঁকা অক্ষরের সাথে মিল থাকে, তাই আমরা তিনটি প্রথম কলাম এবং তারপরে ব্যবহারকারীর নামটি মিলছি।

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