লেজ ব্যবহার করার সময় নিউলাইনগুলিকে নাল-সীমাবদ্ধ রূপান্তর করুন


20

আমি কীভাবে আউটপুটটিকে tailনতুন লাইনের পরিবর্তে নাল-টার্মিনেটেড লাইন ব্যবহার করতে পারি ?

আমার প্রশ্নটির সাথে এটির অনুরূপ: ব্যাশে নাল-বিস্মৃত ইনপুটটিতে কীভাবে "মাথা" এবং "টেল" করা যায়? , তবে এর থেকে আলাদা যে আমি কিছু করতে চাই:

tail -f myFile.txt | xargs -i0 myCmd {} "arg1" "arg2"

আমি ব্যবহার করছি না find, এবং তাই ব্যবহার করতে পারবেন না-print0

এইগুলি হ'ল xargs এ ঘটে যাওয়া ত্রুটি এড়ানোর জন্য:

xargs: unmatched double quote;
    by default quotes are special to xargs unless you use the -0 option

উত্তর:


26

আপনি যদি শেষ 10 লাইন চান:

tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2

তবে জিএনইউ দিয়ে xargsআপনি ডিলিমিটারটিকে নতুন লাইনে সেট করতে পারেন:

tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2

(এর -0জন্য সংক্ষিপ্ত -d '\0')।

বহনযোগ্যভাবে, আপনি সহজেই প্রতিটি অক্ষর এড়াতে পারবেন:

tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2

বা প্রতিটি লাইনের উদ্ধৃতি:

tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2

আপনি যদি 10 টি সর্বশেষ এনইউল-বিস্মৃত রেকর্ডগুলি চান myFile.txt(তবে তারপরে এটি কোনও পাঠ্য ফাইল হবে না), আপনাকে কল \nকরার \0আগে এই রূপান্তর করতে tailহবে যার অর্থ ফাইলটি পুরোপুরি পড়তে হবে:

tr '\n\0' '\0\n' < myFile.txt |
  tail |
  tr '\n\0' '\0\n' |
  xargs -r0i myCmd {} arg1 arg2

সম্পাদনা করুন (যেহেতু তুমি বদলে tailযাও tail -fআপনার প্রশ্নের মধ্যে):

উপরের শেষটি অবশ্যই স্পষ্টভাবে বোঝায় না tail -f

xargs -d '\n'এক কাজ করবে, কিন্তু অন্যান্য বেশী জন্য, আপনি একটি বাফার উপলব্ধ সমস্যা আছে। ভিতরে:

tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2

trএটি যখন টার্মিনালে না যায় তখন তার আউটপুটটি বাফার করে (এখানে, একটি পাইপ)। IE, এটি লেখার জন্য কোনও বাফার পূর্ণ (8kiB এর মতো কিছু) জমা না করা পর্যন্ত এটি কিছুই লিখবে না। যার অর্থ myCmdব্যাচগুলিতে ডাকা হবে।

একটি গনুহ বা FreeBSD 'র সিস্টেম, আপনি এর বাফার উপলব্ধ আচরণ পরিবর্তন করতে পারেন trসঙ্গে stdbufকমান্ড প্রয়োগ করুন:

tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
  xargs -r0i myCmd {} arg1 arg2

আমি আসলে লেজের উপর -f বিকল্পটি ব্যবহার করতে চাইছিলাম যা লাইনগুলি প্রবেশ করার সাথে সাথে অবিচ্ছিন্নভাবে প্রিন্ট করে। আমি ভাবিনি এটির বিষয়টি আসবে, তবে স্পষ্টতই তা তা ঘটবে। -F বিকল্পের সাহায্যে আপনার সমাধান কাজ করে না।
লার্স

tail -f myFile.txt | xargs -r0i -d '\n' myCmd "{}" "||" "||"কাজ বলে মনে হয়! ধন্যবাদ।
লার্স

@ লারস, দুঃখিত, -iবিকল্পটি একটি alচ্ছিক যুক্তি গ্রহণ করে, সুতরাং এটি কার্যকর -i0হবে না। তাদের tail -fশেষের ব্যতীত সকলের সাথে কাজ করা উচিত , তবে সাবধান হন যে বাফারিংয়ের কারণে xargsএর ইনপুটটি আসার আগে একটি বিলম্ব হবে trstdbuf -o0 tr '\n' '\0'পরিবর্তে চালিয়ে আপনি এটি পরিবর্তন করতে পারেন tr '\n' '\0'
স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.