উত্তর:
cmd | while read line; do echo "[ERROR] $line"; done
কেবল ব্যাশ বিল্টিনগুলি ব্যবহার করার সুবিধা রয়েছে যাতে কম প্রক্রিয়া তৈরি / ধ্বংস হবে তাই এটি অ্যাজক বা সিডের চেয়ে দ্রুত স্পর্শ হওয়া উচিত ।
@ টিজারিক উল্লেখ করেছেন যে এটি একটি দুর্দান্ত বাশ ফাংশনও তৈরি করতে পারে। এটির মতো সংজ্ঞা দেওয়া:
function prepend() { while read line; do echo "${1}${line}"; done; }
এটি এর মতো ব্যবহার করতে দেয়:
cmd | prepend "[ERROR] "
sed
) বা এমনকি স্ট্রিং বিভাজন ( awk
) ব্যবহার করা হয় না)))
function prepend() { while read line; do echo "${1}${line}"; done; }
এটা চেষ্টা কর:
cmd | awk '{print "[ERROR] " $0}'
চিয়ার্স
awk -vT="[ERROR] " '{ print T $0 }'
বাawk -vT="[ERROR]" '{ print T " " $0 }'
T="[ERROR] " awk '{ print ENVIRON["T"] $0 }'
বাT="[ERROR]" awk '{ print ENVIRON["T"] " " $0 }'
cmd | awk '{print "['$V]' " $0}'
- এটি শুরুতে একবার মূল্যায়ন করা উচিত, যাতে কোনও কর্মক্ষমতা ওভারহেড হয় না।
@ গ্রাটিউটির সমস্ত প্রাপ্য creditণ সহ, আমি উত্তর হিসাবে তার মন্তব্যটি জমা দিচ্ছি, কারণ এটি আমার কাছে এখানে সেরা উত্তর বলে মনে হচ্ছে।
sed 's/^/[ERROR] /' cmd
awk
এক-লাইনের চমৎকার যথেষ্ট, কিন্তু আমি মনে করি যে আরও অনেক বেশি মানুষের সাথে পরিচিত sed
চেয়ে awk
। বাশ স্ক্রিপ্টটি এটির জন্য ভাল তবে এটি মনে হয় যে এটি কোনও প্রশ্নের উত্তর দিচ্ছে যা জিজ্ঞাসা করা হয়নি।
sed X cmd
এটি পড়ে cmd
এবং কার্যকর করে না। উভয় ক্ষেত্রেই cmd | sed 's/^/[ERROR] /'
বা sed 's/^/[ERROR] /' <(cmd)
বা cmd > >(sed 's/^/[ERROR] /')
। তবে পরে সাবধান। এই আপনি ফেরত মান অ্যাক্সেস করার অনুমতি দেয় এমনকি যে পটভূমিতে সঞ্চালিত হয়, তাই এটি সম্ভবত আপনি আউটপুট দেখতে পরে সমাপ্ত করুন cmd। কোনও ফাইল লগ ইন করার জন্য ভাল। এবং নোট করুন যে সম্ভবত তুলনায় দ্রুত । cmd
sed
awk
sed
alias lpad="sed 's/^/ /'"
। ERROR এর পরিবর্তে আমি 4 টি শীর্ষস্থানীয় স্পেস .োকান। এখন, জাদু কৌতুক জন্য: ls | lpad | pbcopy
4 শূণ্যস্থান যা চিহ্ন হিসাবে ম আউটপুট পূর্বে লিখুন করবে Markdown জন্য কোড , যার মানে হল আপনি ক্লিপবোর্ড (পেস্ট pbcopy এটা grabs, Macs- এর দিকে) সরাসরি Stackoverflow বা অন্য কোন markdown প্রসঙ্গ মধ্যে। alias
এই উত্তম উত্তরটি (প্রথম চেষ্টা করে) পাওয়া যায়নি তাই এটি জিতে যায়। যখন পঠিত সমাধান এছাড়াও ওরফে-সক্ষম, কিন্তু আমি এই খুঁজে sed আরো ভাবপূর্ণ।
কিছু গতি পরীক্ষা করার জন্য আমি একটি গিটহাব সংগ্রহশালা তৈরি করেছি ।
ফলাফল হলো:
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 }'
একটি টাইমস্ট্যাম্প আউটপুট করতে
আমি এমন একটি সমাধান চাইছিলাম যা স্টাডআউট এবং স্টাডার পরিচালনা করে, তাই আমি এটি লিখে 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