ফাইলের সামগ্রীগুলি পরিবর্তিত হওয়ার পরে তাদের আউটপুট দেয়


47

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

magic_command foobar

বর্তমান টার্মিনালটি ফাইলটির বিষয়বস্তু প্রদর্শন করা উচিত এবং অপেক্ষা করা উচিত , আমি জানি না, আমি সি press সি টিপছি।

তারপরে যদি আমি অন্য টার্মিনাল থেকে করি:

echo asdf >> foobar

প্রথম টার্মিনালটিতে মূল ফাইলের সামগ্রীর পাশাপাশি সদ্য যুক্ত হওয়া লাইনটি প্রদর্শন করা উচিত (অবশ্যই, আমি ^ C চাপলাম না এমনটি দেওয়া হয়েছে)।

আমি এটিকে হোমওয়ার্ক হিসাবে চিহ্নিত করব যেহেতু আমি লিনাক্সটি অন্বেষণ করতে এবং শিখতে চাই, তবে এটি হোমওয়ার্ক নয়, এটি আমার একটি কৌতূহল।


উত্তর:


79

আপনি এর tail commandসাথে ব্যবহার করতে পারেন -f :

tail -f /var/log/syslog 

এটি রিয়েল টাইম শোয়ের জন্য ভাল সমাধান।


আপনি কোনও স্ক্রিপ্ট লিখে আপনার আউটপুটটিকে আপনার স্ক্রিপ্টে পুনর্নির্দেশ করতে পারেন।
— ফার্সিগাল্ফ

6
আপনি -F(মূলধন চ ) ও ব্যবহার করতে পারেন , যা ফাইলটি সরানো এবং আবার পথ তৈরি করে পুনরায় তৈরি করা হবে।
— পিটার্ফ

19

আপনি যদি একটি শর্ট ফাইল প্রদর্শন করতে চান যা একটি টার্মিনাল স্ক্রিনে ফিট করে এবং যা পরিবর্তন করছে তা সম্ভবত পুরো ফাইলটি, আপনি ব্যবহার করতে পারেন watch:

watch cat example.txt

Every 2.0s: cat example.txt                                Sun Aug  3 15:25:20 2014

Some text
another line

এটি 2চ্ছিক শিরোনাম সহ ডিফল্টরূপে প্রতি 2 সেকেন্ডে পুরো ফাইলটি দেখায়:

বিকল্প -d( --differences) অথবা প্রথম সংস্করণ থেকে আউটপুট পূর্ববর্তী সংস্করণ থেকে পরিবর্তন হাইলাইট হবে।


9

যখন আমাকে ফাইলের পরিবর্তনগুলি সনাক্ত করতে এবং যা করা ছাড়া অন্য কিছু করতে হবে tail -f filename, তখন আমি inotifywaitপরিবর্তনটি সনাক্ত করতে এবং এটিতে কাজ করার জন্য একটি স্ক্রিপ্টে ব্যবহার করেছি । ব্যবহারের উদাহরণ নীচে দেখানো হয়েছে। দেখুন man inotifywaitঅন্য কোন ঘটনার নাম এবং সুইচ জন্য। আপনার inotify-toolsপ্যাকেজ ইনস্টল করতে হতে পারে , উদাহরণস্বরূপ মাধ্যমে sudo apt-get install inotify-tools।

এখানে উদাহরণ লিপিটি বলা হয়েছে exec-on-change:

 #!/bin/sh

# Detect when file named by param $1 changes.
# When it changes, do command specified by other params.

F=$1
shift
P="$*"

# Result of inotifywait is put in S so it doesn't echo
while  S=$(inotifywait -eMODIFY $F 2>/dev/null)
do
  # Remove printf if timestamps not wanted 
  printf "At %s: \n" "$(date)"
  $P
done

দুটি কনসোলে আমি নিম্নলিখিতভাবে কমান্ড সন্নিবেশ করলাম (যেখানে এ> এর অর্থ কনসোল এ এন্ট্রি, এবং বি> এর অর্থ কনসোল বিতে প্রবেশ))

A> rm t; touch t
B> ./exec-on-change t wc t
A> date >>t
A> date -R >>t
A> date -Ru >>t
A> cat t; rm t

cat tকনসোল এ থেকে নিম্নলিখিত আউটপুট উপস্থিত হয়েছিল:

Thu Aug 16 11:57:01 MDT 2012
Thu, 16 Aug 2012 11:57:04 -0600
Thu, 16 Aug 2012 17:57:07 +0000

exec-on-changeকনসোল বিতে নিম্নলিখিত আউটপুট উপস্থিত হয়েছিল:

At Thu Aug 16 11:57:01 MDT 2012: 
 1  6 29 t
At Thu Aug 16 11:57:04 MDT 2012: 
 2 12 61 t
At Thu Aug 16 11:57:07 MDT 2012: 
 3 18 93 t

exec-on-changeস্ক্রিপ্ট সমাপ্ত যখন আমি rm'ঘ t।


8

lessএর মতো ফলো মোড রয়েছে tail -f- Fআপনার যখন এটি খোলা হবে তখনই হিট করুন ।


4

আমার তিনটি সমাধান রয়েছে:

1) tail -f একটি ভাল ধারণা

2) আমাদের tailfব্যবহার করতে হবে

3) তৃতীয়টি একটি বাশ স্ক্রিপ্ট:

#!/bin/bash

GAP=10     #How long to wait
LOGFILE=$1 #File to log to

if [ "$#" -ne "1" ]; then
    echo "USAGE: `basename $0` <file with absolute path>"
    exit 1
fi


#Get current long of the file
len=`wc -l $LOGFILE | awk '{ print $1 }'`
echo "Current size is $len lines."

while :
do
    if [ -N $LOGFILE ]; then
        echo "`date`: New Entries in $LOGFILE: "
        newlen=`wc -l $LOGFILE | awk ' { print $1 }'`
        newlines=`expr $newlen - $len`
        tail -$newlines $LOGFILE
        len=$newlen
    fi
sleep $GAP
done
exit 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.