যাদের হোম ফোল্ডারটি / বাড়িতে রয়েছে তাদের সমস্ত তালিকাভুক্ত করার জন্য প্রক্রিয়া / ইত্যাদি / পাসডাব্লুডি ফাইল


10

আমার কাছে এ জাতীয় উদাহরণ / ইত্যাদি / পাসডব্লুডি রয়েছে:

tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash

আমি একটি হোম ফোল্ডার সহ সমস্ত ব্যবহারকারীদের তালিকাভুক্ত করার চেষ্টা করছি /home/

আমি লিখেছিলাম

cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'

যেখানে e.txt এখানে লেখা অনুলিপি করা পাঠ্য।

আমি বুঝলাম ব্যাকস্ল্যাশ নিয়ে একটি সমস্যা আছে যা একটি পালানোর চরিত্র, তবে আমি কীভাবে এটি ঠিক করব যাতে আমি তাদের একটি আদেশের এক লাইনে তালিকাবদ্ধ করতে পারি?


11
উত্তরের পাশাপাশি একটি সাধারণ পরামর্শ (যেগুলির মধ্যে কেবলমাত্র এক সেকেন্ডের সাথে আসছে!): এটি প্রায়শই কখনও বোঝায় না catএবং যেমন awkবা অন্যান্য জাতীয় সরঞ্জামগুলিকে পাইপ sedদেয় না কারণ তাদের যুক্তি হিসাবে ফাইলের নাম দেওয়া যেতে পারে।
ফিলিপস

1
বিড়াল e.txt | গ্রেপ হোম | কাট-ডি ":" -ফ 1
অর্পিত আগরওয়াল

3
সমস্ত ব্যবহারকারীর 1000 টির একটি ইউআইডি থাকায় কিছুটা জটিল হতে পারে।
স্ট্রংব্যাড

1
@ArpitAgarwal grep home e.txt | cut -d ":" -f 1। আপনার ইউইউসি পুরষ্কারের জন্য অভিনন্দন। তবে এটি কোনও ভাল সমাধান নয়। যদি কোনও পরিষেবা "হোমব্যাকআপস" থাকে যা ডিমনটির নামে পৃথক ব্যবহারকারীর অধীনে চলে? এটি একটি মিথ্যা ইতিবাচক।
নিডজেজেকোব

2
@ ফিলিপোস পুনরায় "হাতিয়ারগুলিতে বিড়াল এবং পাইপটিকে প্রায় কখনও বোঝায় না" [কারণ] একটি যুক্তি হিসাবে ফাইলের নাম দেওয়া যেতে পারে "- আমি সাধারণত cat > toolকমান্ড লাইনের বিভিন্ন রূপ ব্যবহার করি কারণ এটি বাম থেকে ডান প্রবাহ বজায় রেখে স্পষ্টতা উন্নত করতে পারে পাইপ চেইনের ইনপুট-প্রসেসিং-আউটপুট এর। এটা তোলে হয় কম দক্ষ, কিন্তু প্রায় সবসময় ন্যূনতমরূপে তাই। এটি একটি অগ্রগতি বার যেখানে প্রাসঙ্গিক & দরকারী যখন ইন্টারেক্টিভ খুব সুস্পষ্ট চলমান যোগ করে তোলে (শুধু প্রতিস্থাপন catসঙ্গে pvযে যদি ইনস্টল করা)।
ডেভিড স্পিললেট

উত্তর:


11

আপনি নীচে দেখানো হিসাবে ফরোয়ার্ড স্ল্যাশ পালাতে পারে:

awk -F':' '$6~/^\/home\//{ print $1 }' ~/Desktop/e.txt

অন্য কৌশলটি জটিল ক্ষেত্র বিভাজক ব্যবহার করা হবে:

awk -F'[:/]' '$7=="home"{ print $1 }' ~/Desktop/e.txt
  • -F'[:/]'- উভয়কেই আচরণ করুন :এবং /একটি ক্ষেত্র বিভাজক হতে হবে

2
আমি বিশ্বাস করি যে মন্তব্য ক্ষেত্রটি (হোম ডিরেক্টরি হওয়ার সাথে সাথেই) স্ল্যাশ ধারণ করার অনুমতি দেওয়া হয়েছে।

12

এর /থেকে পালাতে বাঁচতে আপনি রেজেক্সের পরিবর্তে উদ্ধৃতিগুলি ব্যবহার করতে পারেন /:

awk -F: '$6 ~ "^/home/" {print $1}' ~/Desktop/e.txt

সঙ্গে awk, {if (foo) ... }প্রায়শই সরল করা যেতে পারে foo {...}


8

ধরে e.txtনেওয়া আসলে /etc/passwd, আপনার getent passwdফাইলটি পার্সিংয়ের পরিবর্তে আসলে ব্যবহার করা উচিত যেহেতু ব্যবহারকারীর অ্যাকাউন্টের তথ্য /etc/nsswitch.confএলডিএপি-র মতো নির্দিষ্ট একাধিক স্থানে সংরক্ষণ করা যেতে পারে ।

getent passwd | awk -F ':' '$6 ~ "^/home"'

নোট করুন যে printশর্তটি সত্য হলে বিবৃতিটি নিহিত থাকে। যদিও পুরো লাইনটি মুদ্রণ করবে। এটি কেবল ব্যবহারকারীর নাম মুদ্রণ করবে:

getent passwd | awk -F ':' '$6 ~ "^/home" {print $1}'

4

আমাদের মধ্যে যারা কেবল বিশ্রী পছন্দ করেন না তাদের বিকল্প:

grep -E '^([^:]*:){5}/home/' ~/Desktop/e.txt | cut -d: -f1

ব্যাখ্যা:

  • grep -E কয়েকটি বর্ধিত নিয়মিত অভিব্যক্তি বৈশিষ্ট্যগুলি সক্ষম করে
  • ([^:]*:)নিম্নলিখিত ':' বিভাজক সহ এক্সপ্রেশনটি একটি কলামের সাথে মেলে
  • ^([^:]*:){5} প্রতিটি লাইনের প্রথম পাঁচটি কলামের সাথে মেলে
  • ^([^:]*:){5}/home/ line ষ্ঠ কলামটি '/ home /' দিয়ে শুরু হয় এমন প্রতিটি লাইনের সাথে মেলে
  • cut -d: -f1:কলাম বিভাজক হিসাবে ব্যবহার করে এর ইনপুটটির কেবলমাত্র প্রথম কলামটি নির্বাচন করে

3

আপনি indexস্থির স্ট্রিংয়ের মতো ম্যাচিংয়ের জন্যও ব্যবহার করতে পারেন এবং স্ট্রিংয়ের grep -Fশুরুর সাথে মেলে তা নিশ্চিত করতে রিটার্ন মানটি ব্যবহার করতে পারেন

$ awk -F: 'index($6,"/home/")==1{print $1}' ip.txt
tom
george
bla
boo

অথবা যদি রেজেক্সের প্রয়োজন হয় তবে এটি পরিবেশের পরিবর্তনশীল হিসাবে পাস করুন

$ r='^/home/' awk -F: '$6 ~ ENVIRON["r"]{print $1}' ip.txt
tom
george
bla
boo

3

শুধু বিভিন্ন জন্য

$ perl -F: -lane 'print $F[0] if m(/home/)' e.txt
tom
george
bla
boo

ব্যাখ্যা

-F:     use ":" as field separator  
-lane
    l   add newline line-ending to every print statement
    a   auto-split input lines into @F array
    n   apply expression line by line to named file (or STDIN)
    e   evaluate perl commands given on command line

print $F[0]   print (only) the first field of each line
if m(/home/)  but only if the line contains the text /home/

কোথায় /home/পাওয়া যায় সে সম্পর্কে আপনি যদি পিক হতে চান তবে তারতম্য

perl -F: -lane 'print $F[0] if $F[5] =~ m(^/home/)' e.txt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.