বাশ: আউটপুটটির এন-তম কলাম পাওয়ার সবচেয়ে সংক্ষিপ্ততম উপায়


165

ধরা যাক যে আপনার কর্ম দিবসের সময় আপনি বার বার কিছু কমান্ড থেকে নিম্নরূপের কলামযুক্ত আউটপুটটির মুখোমুখি হন (আমার ক্ষেত্রে svn stআমার রেল ওয়ার্কিং ডিরেক্টরিতে কার্যকর করা থেকে ):

?       changes.patch
M       app/models/superman.rb
A       app/models/superwoman.rb

আপনার কমান্ডের আউটপুট নিয়ে কাজ করার জন্য - এই ক্ষেত্রে ফাইলের নামগুলি - কিছু ধরণের পার্সিং প্রয়োজন যাতে পরবর্তী কমান্ডের জন্য দ্বিতীয় কলামটি ইনপুট হিসাবে ব্যবহার করতে পারে।

আমি যা করছি তা হ'ল awkদ্বিতীয় কলামে আসার জন্য ব্যবহার করা, যেমন যখন আমি সমস্ত ফাইল সরিয়ে ফেলতে চাই (যে এটি একটি সাধারণ ব্যবহারের হাত থেকে নয় :), আমি করতাম:

svn st | awk '{print $2}' | xargs rm

যেহেতু আমি এটিকে অনেক বেশি টাইপ করি, তাই একটি প্রাকৃতিক প্রশ্ন হ'ল: বাশকে এটি সম্পাদন করার কোনও ছোট (এইভাবে শীতল) উপায় আছে কি?

দ্রষ্টব্য: আমি যা জিজ্ঞাসা করছি তা মূলত শেল কমান্ডের প্রশ্ন যদিও আমার কংক্রিটের উদাহরণটি আমার এসএনএন ওয়ার্কফ্লোতে রয়েছে। যদি আপনি মনে করেন যে কর্মপ্রবাহটি নির্বোধ এবং কোনও বিকল্প পদ্ধতির পরামর্শ দিচ্ছে, আমি সম্ভবত আপনাকে ভোট দেব না, তবে অন্যরা হয়ত বলবেন, যেহেতু এখানে প্রশ্নটি হ'ল ন্যাশনাল-কলাম কমান্ড আউটপুটটি কীভাবে সংক্ষিপ্ততম পদ্ধতিতে পাওয়া যায়? । ধন্যবাদ :)


1
আপনি যখন কোনও কমান্ড ব্যবহার করেন আপনি প্রায়শই স্ক্রিপ্টটি তৈরি করে আপনার পথে রাখবেন। আপনি যদি পছন্দ করেন তবে আপনি সহজেই আপনার বাশার্কে একটি ফাংশন তৈরি করতে পারেন। আমি কলাম নির্বাচন এক্সপ্রেশন কমাতে পয়েন্ট দেখতে চাই না।
লঞ্চ

1
আপনি ঠিক বলেছেন, এবং আমি এটি করতে পারে। 'বিন্দু' হ'ল
বাশগুলিতে

1
এছাড়াও কোথাও এসএসএন-ইন করার সময় আপনার .bashrc নেই so সুতরাং এটি ছাড়া আপনার পথটি জেনে রাখা দরকারী।
কোস

উত্তর:


125

আপনি cutদ্বিতীয় ক্ষেত্রটি অ্যাক্সেস করতে ব্যবহার করতে পারেন :

cut -f2

সম্পাদনা: দুঃখিত, বুঝতে পারি নি যে এসভিএন তার আউটপুটটিতে ট্যাব ব্যবহার করে না, তাই এটি কিছুটা অকেজো। আপনি cutআউটপুটে টেইলারিং করতে পারেন তবে এটি কিছুটা নাজুক - এর মতো কিছু cut -c 10- কাজ করবে তবে সঠিক মানটি আপনার সেটআপের উপর নির্ভর করবে।

অন্য বিকল্পটি হ'ল কিছু: sed 's/.\s\+//'


1
আউটপুট cut -f2সঙ্গে ব্যবহার করার চেষ্টা করুন svn st। দেখবেন এটি কাজ করে না।
লঞ্চ

আমি ধরে নিয়েছি যে আসল svn stতার আউটপুটটিতে ট্যাব ব্যবহার করবে। কিছু পরীক্ষার পরে মনে হচ্ছে এটি তেমন নয়। অভিশাপ।
ছিনিয়ে দিন

21
-dএটি কাজ করার অনুমতি দেওয়ার জন্য একটি উপযুক্ত ডিলিমিটার পাস করা ।
ইয়োগ

6
@ ইওগ যা বলেছিলেন তার প্রসারিত করার জন্য, সীমানার হিসাবে ফাঁকা স্থানগুলির জন্য এটি দেখতে ভাল লাগবে cut -d" " -f2
অ্যাডামায়ঙ্ক

স্ট্যান্ডআউটে ডাব্লু / ও অ্যাওজি ব্যবহার করুন xargs: এসএনএন স্ট্র্যান্ড xargs | কাট-ডি "" -f2
vr286

106

একই জিনিস সম্পাদন করতে:

svn st | awk '{print $2}' | xargs rm

শুধুমাত্র ব্যাশ ব্যবহার করে আপনি ব্যবহার করতে পারেন:

svn st | while read a b; do rm "$b"; done

মঞ্জুর, এটি সংক্ষিপ্ত নয়, তবে এটি খানিকটা দক্ষ এবং এটি আপনার ফাইলের নামগুলিতে সাদা স্থানকে সঠিকভাবে পরিচালনা করে।


কী aএবং bকীভাবে সেগুলি পাবেন?
টিমো

1
@ টিমো aপ্রথম কলামটি bউপস্থাপন করে এবং অবশিষ্ট কলামগুলিকে উপস্থাপন করে। আপনি যদি দ্বিতীয় কলামটি মুদ্রণ করতে চান read a b c;তবে ব্যবহার করুন এবং তার echoপরিবর্তে ব্যবহার করুন rm। আমি গ্রেড প্যাটার্ন অনুসরণকারী আইডিগুলির একগুচ্ছ প্রক্রিয়া পেতে এটি ব্যবহার করেছি, যাতে আমি তাদের সকলকে বাধা দিতে পারি।
ম্যাট ক্লিনস্মিথ

36

আমি নিজেকে একই পরিস্থিতিতে পেয়েছি এবং এই .profileফাইলটি আমার ফাইলে যুক্ত করেছি:

alias c1="awk '{print \$1}'"
alias c2="awk '{print \$2}'"
alias c3="awk '{print \$3}'"
alias c4="awk '{print \$4}'"
alias c5="awk '{print \$5}'"
alias c6="awk '{print \$6}'"
alias c7="awk '{print \$7}'"
alias c8="awk '{print \$8}'"
alias c9="awk '{print \$9}'"

যা আমাকে এই জাতীয় জিনিস লিখতে দেয়:

svn st | c2 | xargs rm

15
বাশ ফাংশন সাধারণত আরও দরকারী। আমি এটি করেছি: function c() { awk "{print \$$1}" } তারপরে আপনি এটি করতে পারেন: svn st | c 2 | xargs rm
আইসেন

8
তবে তারপরে আমার একটি অতিরিক্ত স্থান টাইপ করতে হবে। এটি অত্যন্ত ক্লান্তিকর :)
স্ট্যাকডক্রোকড

16

Zsh চেষ্টা করুন। এটি প্রত্যয় ওরফে সমর্থন করে, তাই আপনি আপনার .zshrc এ এক্স সংজ্ঞায়িত করতে পারেন

alias -g X="| cut -d' ' -f2"

তাহলে আপনি এটি করতে পারেন:

cat file X

আপনি এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে এবং নবম কলামের জন্য এটি সংজ্ঞায়িত করতে পারেন:

alias -g X2="| cut -d' ' -f2"
alias -g X1="| cut -d' ' -f1"
alias -g X3="| cut -d' ' -f3"

যা "ফাইল" ফাইলের নবম কলামকে আউটপুট দেয়। আপনি গ্রেপ আউটপুট বা কম আউটপুট জন্যও এটি করতে পারেন। এটি খুব সহজ এবং zsh এর একটি হত্যাকারী বৈশিষ্ট্য।

আপনি আরও একধাপ এগিয়ে যেতে পারেন এবং ডিটিকে সংজ্ঞায়িত করতে পারেন:

alias -g D="|xargs rm"

এখন আপনি টাইপ করতে পারেন:

cat file X1 D

"ফাইল" ফাইলের প্রথম কলামে উল্লিখিত সমস্ত ফাইল মুছতে।

যদি আপনি বাশ জানেন, তবে কিছু নতুন বৈশিষ্ট্য বাদে zsh তেমন কোনও পরিবর্তন হয় না।

এইচটিএইচ ক্রিস


আহ্, আমি দেখতে পেয়েছি আপনি উপরে আমার মন্তব্যটি টাইপ করার সময় আপনি নিজের উত্তরটি আপডেট করেছেন :) আপনি কি কোনওরূপে কোন কলামটি পাবেন তা গতিশীলভাবে নির্দিষ্ট করতে পারেন, বা আমার .zshrc এ আমার কোনও এন-লাইন দরকার হবে (এটি গুরুত্বপূর্ণ নয়, কেবল উত্সাহী)
এসভি 1

আমি আমার পোস্টটি আরও সম্পাদনা করেছি এবং ফাইলগুলি মুছতে একটি প্রত্যয় "ডি" সংজ্ঞায়িত করেছি। আমি যতদূর জানি আপনার প্রতিটি প্রত্যয়ের জন্য আপনাকে একটি লাইন যুক্ত করতে হবে।
ক্রিস

অথবা এটি X কমান্ডের প্রথম পরামিতি করুন। এর কোনওটির জন্যই জেডএস বা এলিয়াসের প্রয়োজন নেই, সম্ভবত একটি উপনামে পাইপ স্থাপন করার অদ্ভুত ধারণা ছাড়া।
ট্রিপলি

1
আপনারা সবাই কেন cutঅপশনটি পছন্দ করছেন বলে আমি বুঝতে পারি না । এটি কেবল আউটপুট ব্যবহার করে আমার মেশিনে কাজ করে না svn stsvn st | cut -d' ' -f2কী ঘটেছিল তা দেখার চেষ্টা করুন ।
লিচ

@ এসভি 1 আপনি এলিয়াস সংজ্ঞায়নের জন্য একটি লুপ লিখতে পারেন, যেহেতু ওরফে কেবল একটি আদেশ।
ড্রিফ্যাচ্যাচার

8

যেহেতু আপনি স্ক্রিপ্টগুলির সাথে অপরিচিত বলে মনে হচ্ছে, এখানে একটি উদাহরণ।

#!/bin/sh
# usage: svn st | x 2 | xargs rm
col=$1
shift
awk -v col="$col" '{print $col}' "${@--}"

যদি আপনি এটি সংরক্ষণ করেন ~/bin/xএবং নিশ্চিত হন ~/binযে এটি আপনার PATH(এখন এটি এমন কিছু যা আপনি করতে পারেন এবং এটি আপনার দেওয়া উচিত .bashrc) আপনার কাছে সাধারণত কলাম এন বের করার জন্য সবচেয়ে কমতম কমান্ড রয়েছে; x এন।

স্ক্রিপ্টটিতে যথাযথ ত্রুটি পরীক্ষা করা এবং জামিন করা উচিত যদি কোনও অ-সংখ্যাসূচক যুক্তি বা ত্রুটিযুক্ত সংখ্যার যুক্তি ইত্যাদির সাহায্য নেওয়া হয়; তবে এই নগ্ন-হাড়ের প্রয়োজনীয় সংস্করণটি প্রসারিত করা হবে 102 ইউনিটে।

অন্য কোনও কলাম ডিলিমিটারের অনুমতি দেওয়ার জন্য আপনি স্ক্রিপ্টটি প্রসারিত করতে চাইবেন। অজগর ডিফল্টভাবে হোয়াইটস্পেসের ক্ষেত্রগুলিতে ইনপুটকে বিশ্লেষণ করে; একটি ভিন্ন সীমানা ব্যবহার করতে, নতুন ডিলিমিটারটি -F ':'কোথায় ব্যবহার করুন use :স্ক্রিপ্টের বিকল্প হিসাবে এটি প্রয়োগ করা এটি কিছুটা দীর্ঘতর করে তোলে, তাই আমি এটিকে পাঠকের অনুশীলন হিসাবে রেখে দিচ্ছি।


ব্যবহার

একটি ফাইল দেওয়া হয়েছে file:

1 2 3
4 5 6

আপনি এটি স্ট্ডিনের মাধ্যমে পাস করতে পারেন ( আরও দরকারী কোনও কাজের জন্যcat কেবল স্থানধারক হিসাবে অকেজো ব্যবহার করে );

$ cat file | sh script.sh 2
2
5

বা স্ক্রিপ্টে এটি একটি আর্গুমেন্ট হিসাবে সরবরাহ করুন:

$ sh script.sh 2 file
2
5

এখানে, sh script.shধরে নেওয়া হচ্ছে যে স্ক্রিপ্টটি script.shবর্তমান ডিরেক্টরি হিসাবে সংরক্ষণ করা হয়েছে; যদি আপনি এটিকে আপনার কোথাও আরও দরকারী নামের সাথে সংরক্ষণ করেন PATHএবং এটি নির্বাহযোগ্য হিসাবে চিহ্নিত করেন, যেমন উপরের নির্দেশাবলীতে, স্পষ্টত পরিবর্তে দরকারী নামটি ব্যবহার করুন (এবং না sh)।


ভাল ধারণা, তবে sh বা বাশ মত আমার পক্ষে তেমন কাজ করে না। এটি কাজ করে: #! / বিন / বাশ কল = $ 1 শিফট অ্যাজক "{মুদ্রণ \ $$ কল}"
এমজি কে

এই দেরী মন্তব্যের জন্য ধন্যবাদ। আপনার ঠিক সঙ্গে আপডেট হয়েছে।
ট্রিপলি


@ ফেডরকিই আপনার মতামতের জন্য, এখানে এবং অন্য কোথাও ধন্যবাদ! উত্তর আপডেট করেছেন। এটি এখন কিছুটা লম্বা তাই আপনি যদি রাখতে পারেন এমন একদম স্বল্পতম স্ক্রিপ্টটি চান তবে মূল সংস্করণের জন্য পুনর্বিবেচনার ইতিহাসটি দেখুন ।
ট্রিপলি

1
@ ফেডোরকুই একটি গুচ্ছ ধন্যবাদ! cat
মায়াময়গত

5

দেখে মনে হচ্ছে আপনার ইতিমধ্যে একটি সমাধান রয়েছে। জিনিসগুলি সহজ করার জন্য, কেন কেবল আপনার কমান্ডটি বাশ স্ক্রিপ্টে (একটি সংক্ষিপ্ত নাম সহ) না রেখে প্রতিবার 'দীর্ঘ' কমান্ডটি টাইপ না করে কেবল চালনা করুন?


এটি ঠিক এটি আমার মতে 'শীতল' নয়। কেন? ভাল, আমি চাই না যে আমার .Bashrc কে বিভিন্ন শর্টকাট দিয়ে এটি বানাতে চাই এবং এটি মূলত একটি মেটা শেল লিখতে। এটি যেমন হয় ঠিক তেমনই আলাদা হয়ে গেছে। এটি বলার পরেও, আপনার পরামর্শটি খারাপ নয়।
এসভি 1

2
.bashrc? আপনি কেন এটি নন-ব্যাশ সম্পর্কিত স্টাফ দিয়ে বিশৃঙ্খলা করবেন। আমি যা করি তা হ'ল আমি প্রতিটি কমান্ডের 'সেট' এর জন্য পৃথক স্ক্রিপ্ট লিখি এবং সেগুলি একটি ~/scriptsডিরেক্টরিতে রেখেছি । তারপরে পুরোটি ~/scriptsআমার সাথে যুক্ত করুন PATHযাতে আমি যখন প্রয়োজন হয় কেবল তাদের নাম দিয়ে ডাকতে পারি।
তারেক ফাদেল

4
তারপরে এটি আপনার .bashrc এ রাখবেন না। ~ / বিনে একটি স্ক্রিপ্ট তৈরি করুন এবং নিশ্চিত করুন যে এটি আপনার প্যাথ-এ রয়েছে।
ট্রিপল

2

যদি আপনি ম্যানুয়ালি কলামটি নির্বাচন করে ঠিক করেন তবে আপনি পিকটি ব্যবহার করে খুব দ্রুত হতে পারেন :

svn st | pick | xargs rm

কেবল ২ য় কলামের যে কোনও ঘরে যান, টিপুন cএবং তারপরে হিট করুনenter


আপনি উল্লেখ করেছেন এমন "বাছাই" সরঞ্জামটি চেষ্টা করে দেখেছি এবং এটি আমার অনেক পছন্দ। এটি এমন অনেক পরিস্থিতিতে রয়েছে যেখানে আমি নির্বাচিত কলামগুলি মুদ্রণ করতে চাই তবে পছন্দসই কলামটি পেতে "awk '{মুদ্রণ $ 3}'" টাইপ করতে চাই না। দুর্ভাগ্যক্রমে নামটি একটি আলাদা "পিক" সরঞ্জামের সাথে দ্বন্দ্ব করে যা আরও বেশি জনপ্রিয় বলে মনে হয় - এটি "অ্যাপল ইনস্টল পিক" দিয়ে ইনস্টল করা যেতে পারে। সুতরাং আমি আপনার সিস্টেমে আপনার সরঞ্জামটির নাম পরিবর্তন করে "পিক" করে রেখেছি এবং এটি ব্যবহার চালিয়ে যাওয়ার ইচ্ছা করি। একটি রেফারেন্স পোস্ট করার জন্য ধন্যবাদ।
উইলিয়াম ডাই

1

দ্রষ্টব্য, এই ফাইল পাথটি এসএনএন স্ট্রিট আউটপুটের দ্বিতীয় কলামে থাকতে হবে না। উদাহরণস্বরূপ আপনি যদি ফাইলটি সংশোধন করেন এবং এর বৈশিষ্ট্য পরিবর্তন করেন তবে এটি তৃতীয় কলাম হবে।

সম্ভাব্য আউটপুট উদাহরণগুলি দেখুন:

svn help st

উদাহরণ আউটপুট:

 M     wc/bar.c
A  +   wc/qax.c

আমি প্রথম 8 টি অক্ষর দ্বারা কাটতে পরামর্শ দিচ্ছি:

svn st | cut -c8- | while read FILE; do echo whatever with "$FILE"; done

আপনি যদি 100% নিশ্চিত হতে চান এবং উদাহরণস্বরূপ শেষে সাদা জায়গার সাথে অভিনব ফাইল নামগুলি ব্যবহার করেন তবে আপনাকে এক্সএমএল আউটপুট পার্স করতে হবে:

svn st --xml | grep -o 'path=".*"' | sed 's/^path="//; s/"$//'

অবশ্যই আপনি গ্রেপ / সেডের পরিবর্তে কিছু বাস্তব এক্সএমএল পার্সার ব্যবহার করতে চাইতে পারেন।

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