প্রতিটি নতুন লাইনের সামনে একটি পাঠ্য রাখুন যা কোনও প্রোগ্রাম স্টাডআউটে প্রিন্ট করে


9

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

এটি আমার স্ক্রিপ্ট যা অন্য স্ক্রিপ্টকে কল করে:

#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended

এটি আউটপুট:

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
second line of output
2012-07-26 15:35:17 : script ended

এবং আমি যা পেতে চাই তা স্থির করে:

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
2012-07-26 15:35:15 : second line of output
2012-07-26 15:35:17 : script ended

আমি মনে করি না আপনি কেবল দ্বিতীয় স্ক্রিপ্টটি পরিবর্তন করতে পারবেন?
jmetz

নাহ, দুর্ভাগ্যজনকভাবে না। এ কারণেই আমি এখানে এসেছি।
tzippy

উত্তর:


9

স্ট্যাক ওভারফ্লোতে অনুরূপ প্রশ্ন অনুসারে 2 টি দুর্দান্ত বিকল্প রয়েছে।

অজানা ( উত্তর )

<command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'

টিকা দিন ( উত্তর )

টীকাগুলি একটি ছোট বাশ স্ক্রিপ্ট, যা হয় এখানে সরবরাহিত লিঙ্কের মাধ্যমে সরাসরি পাওয়া যেতে পারে, বা ডিবিয়ান ভিত্তিক সিস্টেমে প্যাকেজের মাধ্যমে devscripts(আকারে annotate-output)।


3

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

./script.sh | awk '{ print strftime()" : "$0; }'

( স্ট্রাইফটাইম দ্বারা ফিরিয়ে দেওয়া তারিখের ফর্ম্যাট করার জন্য http://www.gnu.org/software/gawk/manual/html_node/Time-Funitions.html দেখুন )


2
awk: calling undefined function strftime- এটি নির্দিষ্ট gawk?
ড্যানিয়েল বেক

এখন যেহেতু আপনি এটি উল্লেখ করেছেন, হ্যাঁ বলে মনে হচ্ছে: /
ফ্লিন্ট

2

তুমি ব্যবহার করতে পার awk

./script.sh | awk '{ print d,$1}' "d=$(date "+%F %T")"

awkএকটি ইনপুট স্ট্রিম নেয় এবং এটির আউটপুট পরিবর্তন করে। এই স্ক্রিপ্টটি বলছে "মুদ্রণ ডি এর পরে মূল আউটপুট", তারপরে dতারিখটি পপুলেট করে।


1
এটি কি dateকেবল একবারে অভিব্যক্তিটিকে মূল্যায়ন করে না , যাতে এই জাতীয় সমস্ত লাইন একই সময়ে মুদ্রণ করে?
ড্যানিয়েল বেক

@ ড্যানিয়েলব্যাক হ্যাঁ এটি করে - আমি ধরে নিয়েছিলাম যে এটি প্রতিবারের মতো তারিখটি তুলেছে তবে সবেমাত্র আমার পরীক্ষাটি যথেষ্ট পর্যায়ে শেষ করেছে
পল

1

এটি প্রতিটি আউটপুট লাইন আগে বর্তমান তারিখ এবং সময় মুদ্রণ করবে ./script.sh:

set -f
./script.sh | while read -r LINE; do echo $(date "+%F %T") : "$LINE"; done
set +f

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

  • set -fবাশ প্রসারণ বন্ধ করে (বা echo *প্রকৃত নক্ষত্রটি মুদ্রণ করবে না)।

  • while read -r LINE; do ... doneভেরিয়েবলের এক আউটপুট সংরক্ষণ $LINEকরে এবং কার্যকর করে ..., যতক্ষণ না সমস্ত লাইন প্রক্রিয়াজাত হয়।

  • প্রতিধ্বনি $ (তারিখ "+% F% T"): "$ লাইন" বর্তমান সময় এবং তারিখের সাথে লাইনটি মুদ্রণ করে।

  • set +f বাশ প্রসারণটি আবার চালু করে, সুতরাং এটি আপনার বাকশ স্ক্রিপ্টের বাকী অংশে হস্তক্ষেপ করবে না।


এটি একবারে মূল্যায়ন করা হয়, সুতরাং প্রতিটি sedস্ক্রিপ্ট দ্বিতীয় স্ক্রিপ্ট শুরু করার আগে থেকেই একই তারিখ সন্নিবেশ করায়। সম্ভবত ব্যবহারকারী কী চান তা নয় ...
ড্যানিয়েল বেক

আমি মনে করি না এই প্রচেষ্টাটিও কার্যকর হবে। আফাইক, পুরো সাবশেলটি প্রথমে সম্পূর্ণরূপে মূল্যায়ন হয়, তারপরে লুপটি আটকানো হয়। তাই এখন সময়গুলি মৃত্যুদন্ড কার্যকর হওয়ার পরেের।
ড্যানিয়েল বেক

আপনার উদাহরণটি কার্যকর হয় না, যেহেতু আপনি কেবলমাত্র আউটপুট বিলম্ব করেন, কার্যকর করার জন্য নয় ls। নিম্নলিখিতটি দিয়ে কেবল আপনার স্ক্রিপ্টটি ব্যবহার করে দেখুন script.sh: #!/bin/bash(নিউলাইন)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
ড্যানিয়েল বেক

লুপের পরিবর্তে readএকটি whileলুপ ব্যবহার করুন ।
চিপনার

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