मेरे पास एक धारावाहिक बंदरगाह पर एक आने वाली धारा है, जिसमें नई लाइनें लगभग एक बार प्रति सेकंड दिखाई देती हैं
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
मैं खाली लाइनों को छीनना चाहता हूं और शेष को टाइमस्टैम्प करना चाहता हूं।
sed खाली लाइनों को खींचेगा और एक टाइमस्टैम्प जोड़ देगा, लेकिन मैं टाइमस्टैम्प अपडेट नहीं कर सकता, यह सिर्फ समय की रिपोर्ट करता है:
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
मुझे ts, Moreutils का हिस्सा मिला है, और एक अपडेटिंग टाइमस्टैम्प प्राप्त करने के लिए इसमें पाइप कर सकते हैं।
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
हालाँकि, मैं ठीक से ts को sed के साथ जोड़ नहीं सकता।
यह, जो ऐसा दिखता है कि मुझे वही करना चाहिए जो मैं चाहता हूं, कोई आउटपुट नहीं देता है
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
तो मैं थोड़ा चकरा गया। मैं संभवतः अवांछित लाइनों को हटाने के लिए sed बना सकता हूं, लेकिन हटाने से पहले उन्हें टाइमस्टैम्प करना गलत दृष्टिकोण होना चाहिए।
मैं एक स्पष्टीकरण और कुछ मदद की सराहना करूंगा।
sed -u
। यह एक ब्लॉक-बफ़रिंग बनाम लाइन-बफ़रिंग समस्या है।