মরেটিলস টিএস সহ পাইপিং করা হচ্ছে


9

আমার একটি সিরিয়াল বন্দরে আগত স্ট্রিম রয়েছে, প্রতি সেকেন্ডে প্রায় একবার নতুন লাইন উপস্থিত হয়

wren@Raven:~$ cat /dev/ttyUSB0

A_Sensor1,B_22.00,C_50.00

A_Sensor1,B_22.00,C_50.00

A_Sensor1,B_22.00,C_50.00

A_Sensor1,B_22.00,C_50.00

A_Sensor1,B_22.00,C_50.00

আমি ফাঁকা লাইনগুলি ছড়িয়ে দিতে এবং বাকী অংশগুলির টাইমস্ট্যাম্প করতে চাই।

সেড ফাঁকা লাইনগুলিকে টানবে এবং একটি টাইমস্ট্যাম্প যুক্ত করবে, তবে আমি টাইমস্ট্যাম্পটি আপডেট করতে পারি না, এটি কেবল যে সময়টি আহ্বান করা হয়েছিল তা প্রতিবেদন করে:

wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' -e "s/$/`date +\,%F\,%T`/"
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
^C

আমি টিএস, মরেটিলসের অংশ পেয়েছি এবং আপডেটিং টাইমস্ট্যাম্প পেতে এটিতে পাইপ পেতে পারি।

wren@Raven:~$ cat /dev/ttyUSB0 |  ts
May 14 09:49:26 A_Sensor1,B_22.00,C_50.00
May 14 09:49:26
May 14 09:49:27 A_Sensor1,B_22.00,C_50.00
^C

তবে, আমি সিডের সাথে টিএস সঠিকভাবে একত্রিত করতে পারি না।

এটি যা দেখতে চাইছে তা করা উচিত, কোনও আউটপুট তৈরি করে না

wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' | ts
^C
wren@Raven:~$

তবে পাইপের ক্রমকে বিপরীত করলে আউটপুট পাওয়া যায় তবে অবশ্যই লাইনগুলি আর ফাঁকা থাকে না। অন্যান্য বিকল্পগুলি সূক্ষ্মভাবে কাজ করে, তাই আমি জানি যে সেড থেকে পাইপ কাজ করছে।

wren@Raven:~$ cat /dev/ttyUSB0 |  ts | sed -e '/^$/d'
May 14 10:07:25 A_Sensor1,B_22.00,C_50.00
May 14 10:07:25
May 14 10:07:26 A_Sensor1,B_22.00,C_50.00
May 14 10:07:26
^C

তাই আমি কিছুটা হতবাক। আমি সম্ভবত অবাঞ্ছিত লাইনগুলি মুছে ফেলতে পারি, তবে অপসারণের আগে সেগুলি টাইমস্ট্যাম্পিং করা অবশ্যই ভুল পদ্ধতির হতে হবে।

আমি একটি ব্যাখ্যা এবং কিছু সাহায্যের প্রশংসা করব।

উত্তর:


9

প্রশ্নের সরাসরি উত্তর দিতে sedবাফারিং করা এবং এটিই একমাত্র সমস্যা।
আপনি এটির -u/ --unbufferedপতাকা দিয়ে বাফার না করার কথা বলে এটি ঠিক করতে পারেন :

sed -u '/^$/d' /dev/ttyUSB0 | ts

পরীক্ষার জোতা দিয়ে (তবে আপনাকে প্রমাণের জন্য এটি চালানো দরকার):

$ (echo -e 'banana\n\n'; sleep 2; echo 'cheese') | sed -u '/^$/d' | ts
May 14 11:26:05 banana
May 14 11:26:07 cheese

আপনি অন্যান্য স্ট্রিম সম্পাদকদের সাথে একই পূর্বাভাসে দৌড়াতে পারেন। তারা আপাতদৃষ্টিতে সবাই কিছুটা বাফার করতে চায়। যদিও তাদের সকলেরই কাজ আছে। আমি পরীক্ষিত কমান্ডগুলির একটি গুচ্ছ এখানে:

... | mawk -W interactive '/./' | ts
... | gawk '/./ { print $0; fflush(); }' | ts
... | grep --line-buffered '.' | ts
... | perl -n -e 'print if /./' | ts

অন্য ধারণাটি হ'ল এটি gawkপরিচালনা করা। এটি খালি খালি লাইনের জন্য ফিল্টার করতে পারে এবং আপনার জন্য ডেট-প্রিন্টিং করতে পারে (এসও এর কাইরনকে ধন্যবাদ ):

awk '/./ { print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }' /dev/ttyUSB0

যে flushes সোজা পর লাইনে আসা। gawkযদি আপনি কি করতে চান এখানে বিশেষভাবে সহায়ক অন্যান্য জিনিষ ... আপনি যে আউটপুট (প্রাক চতুর্থ কলামে করতে চান তাহলে ts) একটি Regex সাথে মিলে যায়, আপনি পারবেন (যেমন $4~/\d{4}/)। জঞ্জাল (এবং এর রূপগুলি) স্ট্রিম প্রসেসিংয়ের জন্য খুব নমনীয়।

অন্য পরীক্ষার জোতা:

$ gawk '/./ { print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }' <(
      echo -e 'banana\n\n';
      sleep 2;
      echo 'cheese'
  )
2014-05-14 11:13:59 banana
2014-05-14 11:14:01 cheese

1
+1 এর জন্য sed -u। এটি একটি ব্লক-বাফারিং বনাম লাইন-বাফারিংয়ের সমস্যা।
jfs

টিএস-তে পাইপ করা হলে @ অলি সেড-ইউও পুরোপুরি কাজ করে, তাই আমি বাফারিং সম্পর্কে পড়ব। অনেক ধন্যবাদ, আমি আর বিস্মিত হই না।
বিভ্রান্ত

অ্যাডাব্লিকেশন এই জাতীয় জিনিসের জন্য বিশেষভাবে উপযুক্ত। অ্যাডক কোড সাধারণত সেডের চেয়ে অনেক কম ঘন এবং অনেক বেশি পঠনযোগ্য এবং আপনি ডিবাগ করার সময় আংশিক ফলাফল দেখতে যতটা মুদ্রণ বিবৃতি দিতে পারেন তেমন ছুঁতে পারেন। আলাদা ফাইল ব্যবহার এড়াতে আপনি এখানে একটি পুরো ডাব্লু প্রোগ্রামটি রাখতে পারেন এবং আপনি যদি এখানে নথির টার্মিনেটর স্ট্রিংয়ের চারপাশে উদ্ধৃতি স্থাপন করেন, তবে বাশ সমস্ত এম্বেডড টোকেনকে এড়িয়ে যাবে যা সাধারণত ব্যাখ্যা করার চেষ্টা করবে।
জো

0

বাশ এটিকে একটি while readলুপে পরিচালনা করতে পারে

(echo -e 'banana\n\n'; sleep 2; echo 'cheese') | 
while IFS= read -r line; do 
    [[ $line ]] && echo "$(date "+%F %T") line"
done
2014-05-14 06:34:06 banana
2014-05-14 06:34:08 cheese

একটি জটিল প্যারামিটার বিস্তারের সাহায্যে আপনি কেবল শ্বেত স্পেসের সাথে রেখাগুলি সরাতে পারেন: সমস্ত নেতৃস্থানীয় হোয়াইটস্পেস সরান এবং দেখুন লাইনটি খালি আছে কিনা:

shopt -s extglob

(echo -e '  banana\n\t\n'; sleep 2; echo 'cheese') |
while IFS= read -r line; do
    [[ "${line/#+([[:blank:]])/}" ]] && echo "$(date "+%F %T") $line"
done

আমি এরকম বিভিন্ন পদ্ধতির চেষ্টা করেছিলাম, তাদের কেউই কাজ করেনি। আমি আপনার কোডটি কাজ করতে পারি না। প্রতিধ্বনি বা বিড়াল ব্যবহার পাঠাতে, / dev / ttyUSB0 যখন লুপ মাত্র আউটপুট একটি একক লাইন ফলাফল হবে: 2014-05-14 12:23:32 লাইন
কিংকর্তব্যবিমূঢ়

আমি নিশ্চিত যে আরও ভাল উপায় আছে তবে tail -f /dev/ttyUSB0বিড়াল বা প্রতিধ্বনির পরিবর্তে চেষ্টা করুন । এটি চলতে থাকবে। এটি আমার সিস্টেমে কীভাবে পরীক্ষা করতে হয় তা আমি জানতাম না।
জো

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