প্রতিটি লাইনে স্ট্রিং প্রিপেন্ড করতে কমান্ড?


36

এরকম কিছু খুঁজছেন? কোন ধারনা?

cmd | prepend "[ERRORS] "

[ERROR] line1 text
[ERROR] line2 text
[ERROR] line3 text
... etc

বাশ ফাংশন / স্ক্রিপ্টে সমস্ত কমান্ডের জন্য এটি সেট করার কোনও উপায় আছে কি?
আলেকজান্ডার মিলস

উত্তর:


39
cmd | while read line; do echo "[ERROR] $line"; done

কেবল ব্যাশ বিল্টিনগুলি ব্যবহার করার সুবিধা রয়েছে যাতে কম প্রক্রিয়া তৈরি / ধ্বংস হবে তাই এটি অ্যাজক বা সিডের চেয়ে দ্রুত স্পর্শ হওয়া উচিত

@ টিজারিক উল্লেখ করেছেন যে এটি একটি দুর্দান্ত বাশ ফাংশনও তৈরি করতে পারে। এটির মতো সংজ্ঞা দেওয়া:

function prepend() { while read line; do echo "${1}${line}"; done; }

এটি এর মতো ব্যবহার করতে দেয়:

cmd | prepend "[ERROR] "

4
এটি কেবলমাত্র একের দ্বারা প্রক্রিয়া গণনা হ্রাস করে। (তবে এটি আরও দ্রুত হতে পারে কারণ কোনও রিজেক্সপস ( sed) বা এমনকি স্ট্রিং বিভাজন ( awk) ব্যবহার করা হয় না)))
মাধ্যাকর্ষণ

বিটিডাব্লু, আমি পারফরম্যান্স সম্পর্কে আগ্রহী ছিলাম এবং এখানে আমার সহজ মাপদণ্ডের ফলাফলগুলি ব্যাশ, সেড এবং অ্যাডক ব্যবহার করে। ফিফোর ফাইলে প্রায় 1000 লাইন পাঠ্য (ডেমসগ আউটপুট) পুশ করা এবং তারপরে এগুলি পড়তে: পেস্টবিন.সিএ / ১60০4444 aw৪৪ দেখে মনে হচ্ছে অবাস্তব বিজয়ী। কোন ধারণা কেন?
ইলিয়া জাক্রেউস্কি

1
এর মতো সময় পরীক্ষা চালানোর বিষয়ে সতর্কতা অবলম্বন করুন - এগুলি 6 টি বিভিন্ন আদেশে চালানোর চেষ্টা করুন এবং তারপরে ফলাফলগুলির গড় গড় করুন। ব্লক ক্যাশে প্রভাবগুলি প্রশমিত করতে এবং ব্যাকগ্রাউন্ডে বাধা / সময়সূচির প্রভাবগুলিকে প্রশমিত করার জন্য বিভিন্ন আদেশ।
pjz

এই প্রশ্নটি "শ্যাশ" ট্যাগ, "বাশ" নয়।
ফায়াতজাফ

1
এটি একটি কার্যক্রমেও মোড়ানোর পক্ষে যথেষ্ট সহজ:function prepend() { while read line; do echo "${1}${line}"; done; }
tzrlk

46

এটা চেষ্টা কর:

cmd | awk '{print "[ERROR] " $0}'

চিয়ার্স


1
এটির অসুবিধা রয়েছে যে "[ERROR]" পরিবর্তনশীল হতে পারে না, কারণ পুরো প্রকাশটি অবশ্যই একক-কোটে থাকতে হবে।
ব্যবহারকারী 1071136

4
awk -vT="[ERROR] " '{ print T $0 }'বাawk -vT="[ERROR]" '{ print T " " $0 }'
টিনো

2
T="[ERROR] " awk '{ print ENVIRON["T"] $0 }'বাT="[ERROR]" awk '{ print ENVIRON["T"] " " $0 }'
টিনো

ভেরিয়েবলকে অবনমিত করতে আপনি কেবল উদ্ধৃতিগুলির ক্ষেত্রটি প্রস্থান করতে পারেন: cmd | awk '{print "['$V]' " $0}'- এটি শুরুতে একবার মূল্যায়ন করা উচিত, যাতে কোনও কর্মক্ষমতা ওভারহেড হয় না।
রবার্ট

13

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

sed 's/^/[ERROR] /' cmd

এটি বাশ সমাধানের চেয়ে কেন পছন্দনীয়?
ব্যবহারকারী 14645

1
আমি মনে করি এটি আপনার উদ্দেশ্য উপর নির্ভর করে। যদি আপনার লক্ষ্যটি কেবল কোনও ফাইলের প্রতিটি লাইনকে প্রিপেন্ড করা হয় তবে এটি খুব পরিচিত একটি সরঞ্জাম ব্যবহার করে খুব কম অক্ষর দিয়ে এই লক্ষ্যটি অর্জন করে। আমি এটি 10 ​​লাইনের বাশ স্ক্রিপ্টের চেয়ে বেশি পছন্দ করি। awkএক-লাইনের চমৎকার যথেষ্ট, কিন্তু আমি মনে করি যে আরও অনেক বেশি মানুষের সাথে পরিচিত sedচেয়ে awk। বাশ স্ক্রিপ্টটি এটির জন্য ভাল তবে এটি মনে হয় যে এটি কোনও প্রশ্নের উত্তর দিচ্ছে যা জিজ্ঞাসা করা হয়নি।
এরিক উইলসন

পিজেজেড যে উত্তরটি জমা দিয়েছে তা হ'ল একটি দুর্দান্ত এক-লাইনার। এটি অতিরিক্ত প্রোগ্রামগুলি, প্রক্রিয়াগুলি করে না এবং এটি আরও দ্রুত চালিত হতে পারে
ব্যবহারকারী 14645

3
sed X cmdএটি পড়ে cmdএবং কার্যকর করে না। উভয় ক্ষেত্রেই cmd | sed 's/^/[ERROR] /'বা sed 's/^/[ERROR] /' <(cmd)বা cmd > >(sed 's/^/[ERROR] /')। তবে পরে সাবধান। এই আপনি ফেরত মান অ্যাক্সেস করার অনুমতি দেয় এমনকি যে পটভূমিতে সঞ্চালিত হয়, তাই এটি সম্ভবত আপনি আউটপুট দেখতে পরে সমাপ্ত করুন cmd। কোনও ফাইল লগ ইন করার জন্য ভাল। এবং নোট করুন যে সম্ভবত তুলনায় দ্রুত । cmdsedawksed
টিনো

খুশী হলাম। এই আদেশটি সহজেই অ্যালাইজড হয়। alias lpad="sed 's/^/ /'"। ERROR এর পরিবর্তে আমি 4 টি শীর্ষস্থানীয় স্পেস .োকান। এখন, জাদু কৌতুক জন্য: ls | lpad | pbcopy4 শূণ্যস্থান যা চিহ্ন হিসাবে ম আউটপুট পূর্বে লিখুন করবে Markdown জন্য কোড , যার মানে হল আপনি ক্লিপবোর্ড (পেস্ট pbcopy এটা grabs, Macs- এর দিকে) সরাসরি Stackoverflow বা অন্য কোন markdown প্রসঙ্গ মধ্যে। aliasএই উত্তম উত্তরটি (প্রথম চেষ্টা করে) পাওয়া যায়নি তাই এটি জিতে যায়। যখন পঠিত সমাধান এছাড়াও ওরফে-সক্ষম, কিন্তু আমি এই খুঁজে sed আরো ভাবপূর্ণ।
জে এল পেয়ারেট

8

কিছু গতি পরীক্ষা করার জন্য আমি একটি গিটহাব সংগ্রহশালা তৈরি করেছি ।

ফলাফল হলো:

  • সাধারণ ক্ষেত্রে, awkদ্রুততম হয়। sedকিছুটা ধীর এবং এর perlচেয়ে বেশি ধীর নয় sed। স্পষ্টতই, এগুলি সমস্ত পাঠ্য প্রক্রিয়াজাতকরণের জন্য অত্যন্ত অনুকূলিত ভাষা।
  • খুব বিশেষ পরিস্থিতিতে, যেখানে কাঁটাচামচ প্রাধান্য পায়, আপনার স্ক্রিপ্টটি একটি সংকলিত kshস্ক্রিপ্ট হিসাবে চালানো ( shcomp) আরও প্রক্রিয়াকরণের সময় বাঁচাতে পারে। বিপরীতে, bashসঙ্কলিত kshস্ক্রিপ্টগুলির তুলনায় মৃত ধীর ।
  • বীট করার জন্য একটি স্ট্যাটিকালি লিঙ্কযুক্ত বাইনারি তৈরি করা awkপ্রচেষ্টাটির পক্ষে উপযুক্ত নয় বলে মনে হচ্ছে।

বিপরীতে pythonহ'ল ধীরে ধীরে, তবে আমি একটি সংকলিত কেস পরীক্ষা করে দেখিনি, কারণ সাধারণত আপনি এ জাতীয় স্ক্রিপ্টিংয়ের ক্ষেত্রে যা করবেন তা নয়।

নিম্নলিখিত রূপগুলি পরীক্ষা করা হয়:

while read line; do echo "[TEST] $line"; done
while read -r line; do echo "[TEST] $line"; done
while read -r line; do echo "[TEST]" $line; done
while read -r line; do echo "[TEST]" "$line"; done
sed 's/^/[TEST] /'
awk '{ print "[TEST] " $0 }'
awk -vT="[TEST] " '{ print T $0 }'
awk -vT="[TEST]" '{ print T " " $0 }'
awk -vT="[TEST]" 'BEGIN { T=T " "; } { print T $0 }'
T="[TEST] " awk '{ print ENVIRON["T"] $0 }'
T="[TEST]" awk '{ print ENVIRON["T"] " " $0 }'
T="[TEST]" awk 'BEGIN { T=ENVIRON["T"] " " } { print T $0 }'
perl -ne 'print "[TEST] $_"'

আমার একটি সরঞ্জামের দুটি বাইনারি রূপ (এটি গতির জন্য অপ্টিমাইজ করা হয় না):

./unbuffered.dynamic -cp'[TEST] ' -q ''
./unbuffered.static -cp'[TEST] ' -q ''

পাইথন বাফার করেছে:

python -uSc 'import sys
for line in sys.stdin: print "[TEST]",line,'

এবং পাইথন আনফারড:

python -uSc 'import sys
while 1:
 line = sys.stdin.readline()
 if not line: break
 print "[TEST]",line,'

awk -v T="[TEST %Y%m%d-%H%M%S] " '{ print strftime(T) $0 }'একটি টাইমস্ট্যাম্প আউটপুট করতে
টিনো


3

আমি এমন একটি সমাধান চাইছিলাম যা স্টাডআউট এবং স্টাডার পরিচালনা করে, তাই আমি এটি লিখে prepend.shআমার পথে রাখলাম:

#!/bin/bash

prepend_lines(){
  local prepended=$1
  while read line; do
    echo "$prepended" "$line"
  done
}

tag=$1

shift

"$@" > >(prepend_lines "$tag") 2> >(prepend_lines "$tag" 1>&2)

এখন আমি চালাতে পারি prepend.sh "[ERROR]" cmd ..., "[ERROR]" এর আউটপুট cmdপ্রিপেন্ড করতে, এবং এখনও স্টাডার এবং স্টাডআউট আলাদা separate


আমি এই পদ্ধতির চেষ্টা করেছি কিন্তু সেই >(সাবসেলগুলির সাথে এমন কিছু চলছে যা আমি যথেষ্ট সমাধান করতে পারিনি। দেখে মনে হচ্ছিল স্ক্রিপ্টটি সম্পূর্ণ হয়ে গেছে, এবং প্রম্পট ফিরে আসার পরে আউটপুটটি টার্মিনালে পৌঁছে যা কিছুটা অগোছালো। অবশেষে আমি এখানে উত্তর নিয়ে এসেছি stackoverflow.com/a/25948606/409638
রবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.