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


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.