অবিচ্ছিন্ন স্ট্রিমিং আউটপুট ম্যানিপুলেট করার জন্য কীভাবে সেড ব্যবহার করবেন?


13

আমি অ-প্রযুক্তিগত দর্শকদের জন্য একটি উপস্থাপনা এক সাথে রাখছি। আমার বাশে চলছে এমন একটি প্রোগ্রাম যা মানগুলির ধারাবাহিক প্রবাহকে আউটপুট করে, যার মধ্যে কয়েকটি গুরুত্বপূর্ণ are আমি গুরুত্বপূর্ণ ফলাফলগুলি হাইলাইট করতে চাই কারণ তারা প্রদর্শিত হচ্ছে যাতে শ্রোতা তাদের ফ্রিকোয়েন্সি সম্পর্কে ধারণা পেতে পারে। সমস্যাটি হ'ল আমি sedকোন চলমান স্ট্রিমের কাজ করতে পারি না । আমি যদি কোনও ফাইলে ফলাফলগুলি রাখি তবে এটি ঠিকঠাক কাজ করে:

cat output.txt | sed "s/some text/some text bolded/"

তবে আমি যদি চলমান আউটপুটে একই জিনিস চেষ্টা করি তবে:

command | sed "s/some text/some text bolded/"

sedকিছুই করে না কোন চিন্তা?

ল্যামবার্ট যেহেতু উল্লেখ করতে যথেষ্ট সহায়ক ছিল, আমার এই বক্তব্য sedঅস্পষ্ট ছিল না। যা ঘটছে তা হ'ল প্রোগ্রামটি আউটপুট করে stdout(আমি বেশ নিশ্চিত যে এটি stderrএটি লিখেনি) যদিও এটি সাধারণত পাইপ করা হলেও sed

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

পার্ল এবং অ্যাজক পদ্ধতিগুলিও কাজ করে না।


5
নেই stdbuf -o0 command | sed "s/some text/some text bolded/"কাজ করে?
ফ্ল্লোহেমফিল

3
'সেড কিছুই করে না' এর অর্থ আপনার অর্থ বিকল্পটি তৈরি করা হয়নি, বা আপনার কোনও আউটপুট নেই? কমান্ডটি stdout পরিবর্তে stderr লিখতে পারে? আপনি যদি ব্যবহার করতে পারেন এমন কিছু হাইলাইট করতে চানcommand|egrep 'some text|$'
ল্যামবার্ট

কমান্ডটি stdout (এবং stderr না) লিখতে হয়?
অ্যান্টন

1
প্রদত্ত যে পাঠ্যটি একবারে একবারে g"বৈশ্বিক" প্রতিস্থাপন যুক্ত করা উচিত , অন্যথায় একটি লাইনে কেবল প্রথম ঘটনাটি প্রতিস্থাপন করা হবে:sed "s/old/new/g"
ph0t0nix

@ ph0t0nix না, এটি ইস্যু নয়, তবে এটি লাইনটির নিচে একটি সমস্যা হয়ে থাকবে। টিপ জন্য ধন্যবাদ.
পি জোনস

উত্তর:


12

কমান্ডের আউটপুট বাফার হওয়ার সম্ভাবনা রয়েছে। কমান্ডটি যখন কোনও টার্মিনালে লিখিত হয়, বাফারটি প্রতিটি নতুন লাইনে ফ্লাশ করা হয়, তাই আপনি এটি প্রত্যাশিত হারে উপস্থিত দেখবেন। কমান্ডটি যখন কোনও পাইপে লিখে, বাফারটি কেবল কয়েক কিলোবাইটে পৌঁছালেই ফ্লাশ করা হয়, সুতরাং এটি অনেক পিছিয়ে যায়। এইভাবে স্ট্যান্ডার্ড ইনপুট / আউটপুট লাইব্রেরির ডিফল্ট আচরণ।

কমান্ডটিকে তার আউটপুট বুফে না দেওয়ার জন্য জোর করতে, আপনি unbuffer(প্রত্যাশা থেকে) বা stdbuf(জিএনইউ কোর্টিলগুলি থেকে ) ব্যবহার করতে পারেন ।

unbuffer command | sed …
stdbuf -o0 command | sed …

stdbufকাজ করেনি (এটি আগে উল্লিখিত ছিল, বিটিডাব্লু), কিন্তু unbufferকরেছে !! আপনি আমাকে কতটা খুশি করেছেন তা আপনার কোনও ধারণা নেই।
পি জোন্স

এবং সংক্ষিপ্ত ব্যাখ্যার জন্য আপনাকে ধন্যবাদ। খুব উপকারী.
পি জোন্স

sedনিজেই যেমন একটি বাফার, (ChennyStar পোস্ট CF) তাই এখানে উদাহরণ কাজ যেহেতু নাও হতে পারে ব্যবহার sedহয় commandunbuffer হবে: cat /etc/passwd | unbuffer sedকিন্তু sedনিজেই একটি হয়েছে -uবিকল্প, তাই grepএই উদাহরণ আরও suiteable হতে পারে। আপনার পটভূমি তথ্য জন্য অনেক ধন্যবাদ! দুর্দান্ত উত্তর!
গণিত

4

sed এর জন্য একটি বিকল্প রয়েছে:

-উ, - আনফারড

যা ইনপুট ফাইলগুলি থেকে ন্যূনতম পরিমাণে ডেটা লোড করে এবং প্রায়শই আউটপুট বাফারগুলিকে ফ্লাশ করে। দেখুন man sedআরো বিস্তারিত জানার জন্য।


1
sedকেবল জিএনইউ (বিএসডি নয় sed) এবং আমি বিশ্বাস করি এটি পাইপটি শুরু করার পরে কমান্ডটি বাফার করতে বাধা দেবে না। তবে এটি উল্লেখ করা ভাল। :)
ওয়াইল্ডকার্ড

stdbuf ম্যানপেজে উল্লেখ করা হয়েছে যে "যদি কম্যান্ড তার স্ট্যান্ডার্ড স্ট্রিমগুলির বাফারিং সামঞ্জস্য করে (উদাহরণস্বরূপ 'টি' করে) তবে এটি স্টাডবুফ দ্বারা সংশ্লিষ্ট পরিবর্তনগুলিকে ওভাররাইড করবে" " দেখে মনে হচ্ছে শেড এই বিভাগে আসতে পারে তবে '-u' পতাকাটি এটি একটি আনফারড পাইপ চেইনে দরকারী করে তোলে।
ম্যাটস্মিথ

2

আমি awk ব্যবহার করব

  command | awk '/some important stuff/ { printf "%c[31m%s%c[0m\n",27,$0,27 ; next }
  { print ; } '

কোথায়

  • /some important stuff/ সেডের মতো গুরুত্বপূর্ণ লাইন নির্বাচন করুন
  • printf "%c[31m%s%c[0m\n",27,$0,27 ; লাল মুদ্রণ
    • সবুজ, হলুদ জন্য 32,33 ব্যবহার করুন ...
    • নির্দিষ্ট ক্ষেত্র নির্বাচন করতে $ 1, $ 2 ব্যবহার করা যেতে পারে
  • অন্যান্য লাইন কেবল 'যেমন আছে' তে মুদ্রিত

মূল বক্তব্যটি হ'ল commandলাইনগুলি ফ্লাশ করা উচিত তবে আপনার যদি খুব আউটপুট থাকে তবে তা হওয়া উচিত।


দ্রষ্টব্য: প্রশ্নটি বলে না যে পুরো লাইনটি "সাহসী" হওয়া উচিত, তবে কেবল "কিছু পাঠ্য" হওয়া উচিত। এই বৈশিষ্ট্যটি awk(ব্যবহার sub()বা gsub()) ব্যবহার করেও কার্যকর করা সম্ভব হওয়ার ক্ষেত্রে, এই আদি প্রতিস্থাপনের sedক্ষেত্রে অবশ্যই যথাযথ সরঞ্জাম।
জ্যানিস

1

পার্ল ওয়ে:

command | perl -pe 's/(stuff)/\x1b[1m$1\x1b[0m/g'

বা একটি অবিচ্ছিন্ন আউটপুট সহ:

আউটপুট জন্য একটি বাশ স্ক্রিপ্ট cont:

#!/bin/bash
while [ true ]
do
   echo "Some stuff"
done

এর সাথে পরীক্ষা করুন:

./cont | perl -pe 's/(stuff)/\x1b[1m${1}\x1b[0m/g'
  • \x1b[1m - সাহসী বা বর্ধিত তীব্রতা
  • ${1} - পিছনে রেফারেন্স
  • \x1b[0m - সমস্ত বৈশিষ্ট্য পুনরায় সেট করুন

আউটপুট:

কিছু স্টাফ
কিছু জিনিস
কিছু জিনিস
কিছু উপাদান

আরও এস্কেপ কোড এখানে

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