STDOUT এর নবম লাইন পাওয়ার জন্য আদেশ


210

এমন কোনও বাশ কমান্ড রয়েছে যা আপনাকে STDOUT এর নবম লাইন পেতে দেবে?

এটি বলতে হবে যে এটি গ্রহণ করবে এমন কিছু

$ ls -l
-rw-r--r--@ 1 root  wheel my.txt
-rw-r--r--@ 1 root  wheel files.txt
-rw-r--r--@ 1 root  wheel here.txt

এবং মত কিছু করতে

$ ls -l | magic-command 2
-rw-r--r--@ 1 root  wheel files.txt

আমি বুঝতে পেরেছিলাম যে স্ক্রিপ্টগুলি পুনরায় ব্যবহারের অর্থ যখন লেখার চেষ্টা করা হয়েছিল তখন এটি খারাপ অভ্যাস হবে, তবে দিনের বেলা শেল নিয়ে কাজ করার সময় এটি আমার স্টাটআউটটি এমনভাবে ফিল্টার করতে সক্ষম হবে আমার পক্ষে দরকারী।

আমি বুঝতে পারি এটি লিখার জন্য অর্ধ-তুচ্ছ কমান্ড হবে (বাফার STDOUT, একটি নির্দিষ্ট লাইনটি ফিরিয়ে দিন), তবে আমি জানতে চাই যে এটি করার জন্য কিছু স্ট্যান্ডার্ড শেল কমান্ড রয়েছে যা আমার কাছে স্ক্রিপ্ট না ফেলেই পাওয়া যাবে।


5
আমি কেবল শব্দের ব্যবহারের জন্য এটিকে ভোট দিয়েছিmagic-command
সেরিয়ারনেথস

উত্তর:


332

sedবিভিন্ন ধরণের জন্য ব্যবহার করে :

ls -l | sed -n 2p

এই বিকল্পটি ব্যবহার করা, যা প্রয়োজনীয় লাইনটি মুদ্রিত হওয়ার পরে ইনপুট পড়া বন্ধ করে দেয় বলে এটি আরও কার্যকর দেখায়, খাওয়ানোর প্রক্রিয়াতে একটি সিপাইপিইপি তৈরি হতে পারে, যার ফলে অনাকাঙ্ক্ষিত ত্রুটি বার্তা উত্পন্ন হতে পারে:

ls -l | sed -n -e '2{p;q}'

আমি দেখেছি যে প্রায়শই যথেষ্ট যে আমি সাধারণত প্রথমটি ব্যবহার করি (যা টাইপ করা সহজ, যাইহোক যাইহোক) যদিও lsসাইনপাইপ পাওয়ার পরে অভিযোগ করে এমন কোনও আদেশ নয়।

বিভিন্ন রেখার জন্য:

ls -l | sed -n 2,4p

বিভিন্ন রেঞ্জের রেঞ্জের জন্য:

ls -l | sed -n -e 2,4p -e 20,30p
ls -l | sed -n -e '2,4p;20,30p'

পি মানে কি? 2p 3p এর মত? অর্থে আমি বুঝতে পারি যে এটি 2/3 লাইনের জন্য, তবে এর পিছনে তত্ত্ব / বোঝাপড়াটি কী?
লিও উফিম্টসেভ

4
@ লিওউফিমটসেভ: এটি pহল একটি sedবিবৃতি যা এর আগে যে রেখাগুলি রেখা দ্বারা চিহ্নিত রেখাগুলি প্রিন্ট করে। এর 2,4pঅর্থ মুদ্রণ লাইনগুলি 2, 3, 4।
জোনাথন লেফলার

3
এবং এর nঅর্থ অন্য সমস্ত লাইন মুদ্রণ করা নয়
টিমো

85
ls -l | head -2 | tail -1

13
+2, তবে আমি পরামর্শ দেব head -n 2 | tail -n 1- আধুনিক মাথা এবং লেজ অন্যথায় সতর্কতা জারি করে to
মাইকেল ক্রেলিন - হ্যাকার

2
ডেটা ফিল্টার করতে দুটি প্রক্রিয়া ব্যবহার করা কিছুটা ওভারকিল (তবে, আজকাল মেশিনগুলির শক্তি দেওয়া, তারা সম্ভবত মোকাবেলা করতে পারবেন)। একটি ব্যাপ্তি পরিচালনা করার জন্য সাধারণকরণ সম্পূর্ণ তুচ্ছ নয় (রেঞ্জ এন..এম এর জন্য, আপনি ব্যবহার করেন head -n M | tail -n M-N+1) এবং একাধিক রেঞ্জগুলি পরিচালনা করতে সাধারণকরণ সম্ভব নয়।
জোনাথন লেফলার

3
মাথার লেজে লেপ? ভয়ঙ্কর। এটি করার একাধিক আরও ভাল উপায়।
ক্যামহ

16
* নিক্স কমান্ড লাইন সম্পর্কে দুর্দান্ত জিনিস: সমস্ত কিছু করার এক মিলিয়ন এবং একটি উপায় এবং প্রত্যেকেই একটি প্রিয় এবং অন্য সমস্ত উপায়ে ঘৃণা করে ... :-)
ভিক্ষা করে

1
লাইনের আরও একটি $ ls -l | awk '{if (NR>=4 && NR<=64) print}'
প্রান্ত

41

সুন্দর মাথা / লেজের উপায়ের বিকল্প:

ls -al | awk 'NR==2'

অথবা

ls -al | sed -n '2p'

1
আমার বিশ্রী ভাল, কিন্তু সেড ভাল।
মাইকেল ক্রেলিন - হ্যাকার

"যদি" দরকার নেই - হ্যাকারের উত্তর দেখুন ( সিস্টেমে প্রতিটি ফাইল সন্ধানের অংশ ব্যতীত )। ;-)
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

কি '2p'জন্য দাঁড়ানো?
কাটার

1
সংক্ষিপ্ত উত্তর মুদ্রণ দ্বিতীয় লাইনে শ্যাডডিং; দীর্ঘ -> ব্যবহৃত হলে, প্যাটার্নের সাথে মেলে এমন লাইনগুলিকে ঠিকানার পরে আদেশ দেওয়া হয়। সংক্ষেপে, / পি ফ্ল্যাগের সাথে ব্যবহার করার সময়, মিলের লাইনগুলি দু'বার মুদ্রণ করা হয়: সেড '/ PATTERN / p' ফাইল। এবং অবশ্যই ধরনে কোনো রেগুলার এক্সপ্রেশন হয় আরো
মেধাত

পরিবর্তনশীল হলে কী হবে 2? প্রতিটি উদাহরণ একক উদ্ধৃতি ব্যবহার করে, তবে একটি ভ্যার সহ আপনার ডাবল উদ্ধৃতি প্রয়োজন। ওয়ার্স ব্যবহার করার সময় আমরা কি একক উদ্ধৃতি দিয়েও কাজ করতে "প্রোগ্রাম" করতে পারি? উদাহরণ line =1; ls | awk 'NR==$line'। আমি জানি যে bashvars সহ ডাবল কোট ব্যবহার করে।
টিমো


9

শেষ করার জন্য ;-)

সংক্ষিপ্ত কোড

find / | awk NR==3

খাটো জীবন

find / | awk 'NR==3 {print $0; exit}'


আমি নয় ;-) আসলে, আমি জানি না কেন সবাই ব্যবহার করছে ls- মূল প্রশ্নটি কারও সম্পর্কে STDOUT, তাই আমি ভেবেছিলাম এটি আরও বড় করা ভাল।
মাইকেল ক্রেলিন - হ্যাকার

কমপক্ষে জিএনইউ অ্যাজকের সাথে, ডিফল্ট ক্রিয়া হয় { print $0 }, তাই `awk 'এনআর == 3' একই লেখার জন্য একটি ছোট উপায়।
প্রশংসাপত্র

আপনার সম্ভবত সেই ক্রিয়াতে "; প্রস্থান" যুক্ত করা উচিত। আপনি যখন তাদের সাথে কিছু করতে যাবেন না তখন বাকী রেখাগুলি প্রক্রিয়া করার কোনও বিষয় নেই।
ক্যামহ

@ ক্যাম: জনাথন লেফারের এই সম্পর্কে উত্তর দেখুন: "খাওয়ানোর প্রক্রিয়াতে একটি চিহ্ন তৈরি করতে পারে, যার ফলস্বরূপ একটি অযাচিত ত্রুটি বার্তা উত্পন্ন হতে পারে"।
প্রশংসাপত্র


6

আপনি awk ব্যবহার করতে পারেন:

ls -l | awk 'NR==2'

হালনাগাদ

উপরের কোডটি একের পর এক ত্রুটির কারণে আমরা যা চাই তা পাবে না: ls -l কমান্ডের প্রথম লাইনটি মোট লাইন। তার জন্য, নিম্নলিখিত সংশোধিত কোডটি কাজ করবে:

ls -l | awk 'NR==3'

4

পার্ল আপনার জন্য সহজেই উপলব্ধ?

$ perl -n -e 'if ($. == 7) { print; exit(0); }'

স্পষ্টতই আপনি 7 এর জন্য যে সংখ্যাটি চান তা প্রতিস্থাপন করুন।


এটি আমার পক্ষে যেহেতু আমি ব্যক্তিগতভাবে যা করেছি তার মধ্যে সাধারণীকরণ করা সবচেয়ে সহজ বলে মনে হচ্ছে যা প্রতি নবম, পার্ল-এন-ই 'যদি ($।% 7 == 0) {মুদ্রণ; প্রস্থান (0); } '
মাদুর কেলসি

@ ম্যাটকেলসিও আপনি $ awk 'NR % 7' filenameপ্রতি 7th ম লাইনে ফাইলটি মুদ্রণ করতে পারেন ।
ব্যবহারকারী 10607

3

আরেকটি পোস্টার প্রস্তাবিত

ls -l | head -2 | tail -1

তবে আপনি যদি লেজটিতে মাথাটি পাইপ করেন তবে দেখে মনে হচ্ছে এন লাইন অবধি সমস্ত কিছু দুবার প্রক্রিয়াজাত করা হবে।

মাথার মধ্যে লেজ পাইপ করা

ls -l | tail -n +2 | head -n1

আরও দক্ষ হবে?


0

হ্যাঁ, সবচেয়ে কার্যকরী উপায় (যেমন ইতিমধ্যে জোনাথন লেফলার নির্দেশ করেছেন) হ'ল মুদ্রণের সাথে সেড ব্যবহার করুন এবং প্রস্থান করুন:

set -o pipefail                        # cf. help set
time -p ls -l | sed -n -e '2{p;q;}'    # only print the second line & quit (on Mac OS X)
echo "$?: ${PIPESTATUS[*]}"            # cf. man bash | less -p 'PIPESTATUS'

পাইপফেইল এবং পাইপেসটাস ব্যবহার খুব আকর্ষণীয় এবং এটি এই পৃষ্ঠায় অনেক কিছু যুক্ত করে।
মাইক এস

0

হুম

আমার ক্ষেত্রে কাজ করেনি। আমি উত্থাপন:

"বিজোড়" লাইনের জন্য 1,3,5,7 ... ls | awk '0 == (এনআর + 1)% 2'

"এমনকি" লাইনের জন্য 2,4,6,8 ls | awk '0 == (এনআর)% 2'


-1

আরও সম্পূর্ণতার জন্য ..

ls -l | (for ((x=0;x<2;x++)) ; do read ; done ; head -n1)

দ্বিতীয়টিতে না আসা পর্যন্ত লাইন ফেলে দিন, তারপরে তার পরে প্রথম লাইনটি মুদ্রণ করুন। সুতরাং, এটি 3 য় লাইন প্রিন্ট করে।

যদি এটি কেবল দ্বিতীয় লাইন ..

ls -l | (read; head -n1)

প্রয়োজনীয় হিসাবে অনেকগুলি পড়ুন Put


-1

আমি এটি আমার .বাশ_ প্রোফাইলে যুক্ত করেছি

function gdf(){
  DELETE_FILE_PATH=$(git log --diff-filter=D --summary | grep delete | grep $1 | awk '{print $4}')
  SHA=$(git log --all -- $DELETE_FILE_PATH | grep commit | head -n 1 | awk '{print $2}')
  git show $SHA -- $DELETE_FILE_PATH
}

এবং এটি কাজ করে

gdf <file name>

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