গাaw় জায়গায় এবং stdout


10

gawkএর -i inplaceবিকল্প ব্যবহার করা এবং stdoutকী কী জিনিস মুদ্রণ করা সম্ভব ?

উদাহরণস্বরূপ, যদি আমি কোনও ফাইল আপডেট করতে চাইতাম এবং যদি কোনও পরিবর্তন হয় তবে ফাইলটির নাম এবং পরিবর্তিত লাইনগুলি প্রিন্ট করে stderrআমি এর মতো কিছু করতে পারি

find -type f -name 'myfiles' -exec gawk -i inplace '{if(gsub(/pat/, "repl")) { print FILENAME > "/proc/self/fd/2" ; print > "/proc/self/fd/2"; } print;}' {} +

তবে এর stdoutপরিবর্তে ব্যবহারের কোনও উপায় আছে বা বিকল্পটি প্রবাহে সেই ব্লকটি প্রিন্ট করার জন্য একটি ক্লিনার উপায় আছে?


2
এই বিশেষ ক্ষেত্রে আপনি এই জাতীয় কিছু চালাতে চাইতে পারেন আপনি find -type f -name 'myfiles' -exec grep -q 'pattern' {} \; -print -exec gawk -i inplace '{do_your_sub_and_print_to_dev/stderr_too}' {} \;কেবল সেই ফাইলটি সম্পাদনা করতে বিশ্রী ব্যবহার করবেন যা প্রকৃতপক্ষে সেই প্যাটার্নের সাথে মিল রয়েছে lines
don_crissti

@ ডন_ক্রিস্টি আমি প্রায়শই ভুলে যাই যে কত দ্রুত grepহতে পারে। আমার প্রথম প্রবৃত্তিটি দু'বার ফাইলটি "প্রক্রিয়া" করা এড়ানো, তবে তা যদি সত্যিই দ্রুত হয় তবে আমি কিছুটা অবাক হব না। এটি কেবল দেখানোর জন্য যায় যে আমি কেন প্রোফাইলিংয়ের কাজগুলিতে আমার অন্ত্রে বিশ্বাস করতে পারি
এরিক রেনোফ

1
হ্যাঁ, এটি বেশ দ্রুত এবং মনে রাখবেন: 1) যদি কোনও মিল না থাকে তবে আপনি কেবল একবার ফাইলটি প্রক্রিয়া করুন (যার অংশটি -print -exec gawkআর কার্যকর করা হয় না) এবং 2) এটি প্রথম ম্যাচে থামবে সুতরাং 1 ম ম্যাচটি না থাকলে শেষ লাইন আপনি এখনও পুরো ফাইলটি দুইবার প্রক্রিয়া করছেন না (এটি আরও 1.X বারের মতো)। এছাড়াও, যদি এটির gawk -i inplaceমতো কাজ করে sed -iতবে ফাইলটি যে কোনও
উপায়েই

উত্তর:


13

আপনার ব্যবহার করা উচিত /dev/stderrবা /dev/fd/2পরিবর্তে /proc/self/fd/2gawkহ্যান্ডলগুলি /dev/fd/xএবং /dev/stderrনিজেই (সিস্টেমে ফাইলগুলি আছে কিনা তা নির্বিশেষে)।

আপনি যখন এটি করেন:

print "x" > "/dev/fd/2"

gawkwrite(2, "x\n")আপনি যখন করবেন তখন একটি করে :

print "x" > "/proc/self/fd/2"

যেহেতু এটি /proc/self/fd/xবিশেষভাবে চিকিত্সা করে না , এটি একটি করে:

fd = open("/proc/self/fd/2", O_WRONLY|O_CREAT|O_TRUNC);
write(fd, "x\n");

প্রথমটি /proc/self/fdলিনাক্স নির্দিষ্ট এবং লিনাক্সে তারা সমস্যাযুক্ত। উপরের দুটি সংস্করণ সমান নয় যখন স্ট্যাডার একটি নিয়মিত বা অন্য অনুসন্ধানযোগ্য ফাইল বা সকেটের (যার জন্য পরবর্তীটি ব্যর্থ হবে) (এটি কোনও ফাইল বিবরণকারীকে অপচয় করে তা উল্লেখ করবেন না)।

বলা হচ্ছে, আপনার যদি মূল স্টডআউটকে লেখার প্রয়োজন হয় তবে আপনার এটি অন্য একটি এফডির মতো করে সংরক্ষণ করতে হবে:

gawk -i inplace '{
   print "goes into the-file"
   print "to stdout" > "/dev/fd/3"}' the-file 3>&1

gawkস্টেডআউটটি ফাইলের সাথে স্থান সহ পুনর্নির্দেশ করে। এটি প্রয়োজন কারণ উদাহরণস্বরূপ, আপনি চান:

awk -i inplace '{system("uname")}' file

মধ্যে unameআউটপুট সংরক্ষণ file


2

শুধু মজার জন্য, একটি বিকল্প শুধুমাত্র POSIX ব্যবহার পদ্ধতির অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে find, sh, grepএবং (এর মধ্যে উল্লেখযোগ্য হল) ex:

find . -type f -name 'myfiles' -exec sh -c '
  for f do grep -q "pat" "$f" &&
    { printf "%s\n" "$f";
      printf "%s\n" "%s/pat/repl/g" x | ex "$f";
  }; done' find-sh {} +

(উপরের কমান্ডের সমস্ত লাইন বিরতি alচ্ছিক; এটি একটি লাইনারে ঘনীভূত করা যেতে পারে))

বা, যুক্তিযুক্তভাবে আরও সুস্পষ্টভাবে:

find . -type f -name 'myfiles' -exec sh -c '
  for f
  do
    if grep -q "pat" "$f"; then
      printf "%s\n" "$f"
      printf "%s\n" "%s/pat/repl/g" x | ex "$f"
    fi
  done' find-sh {} +

:)


(এই কমান্ডটি অনির্ধারিত; আমি কোনও বোকা বানালে সম্পাদনা সম্পাদনা করে))

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