বাশ স্ক্রিপ্ট: ফাইলের শেষ "এক্স" লাইন বাদে সমস্ত মুছতে সেডে ভেরিয়েবল ব্যবহার করুন


0

আমি লগ ফাইলে সর্বশেষ 'এক্স' লাইন বাদে সমস্ত মুছতে নীচের বাশ স্ক্রিপ্টটি ব্যবহার করছি:

#!/bin/bash
# Script to  write to the log file every minute  and delete all but the last 
# set time in hours

echo `date +\%Y\%m\%d\%H\%M\%S`,`/home/pi/temp/temp` >> /home/pi/temp/temp.log

HOURS="12"                      #Nr of hours in the log
LINES=$(( $HOURS * 60 + 1 ))    #Nr of minutes/lines in the log

echo $LINES                     #Included just for testing if i'm getting the desired amount of lines

sed -e :a -e '$q;N;$LINES,$D;ba' temp.log >temp1.log ;mv temp1.log  temp.log

আমি এর মান (12 ঘন্টা) এর জন্য 21 লাইনগুলি প্রতিস্থাপন করেছি, 721 এবং স্ক্রিপ্টটি ক্রোন টাস্ক হিসাবে কাজ করছে, প্রতি মিনিটে ত্রুটি ছাড়াই চলে, তাই আমি নিশ্চিত যে ত্রুটিটি সেডের মধ্যে পরিবর্তনশীল অন্তর্ভুক্ত রয়েছে the

এছাড়াও, আমি কেবল কয়েকটি ওয়েবসাইট থেকে এটি অনুলিপি করেছি, কেউ যদি আমাকে সেড কমান্ডের মধ্যে কী চলছে তা বোঝাতে যথেষ্ট সদয় হতে পারে, তবে আমি নিজেই ভুলটি বের করতে সক্ষম হব।

এটি ত্রুটি:

sed: -e expression #2, char 8: extra characters after command.

এছাড়াও, এটি ফাইলের সমস্ত লাইন মুছে দেয়।


আপনার সমস্যা কি তা পরিষ্কার নয়? কি উদ্দীপনা কাজ করছে না? আপনার স্ক্রিপ্টের ফলাফল কী হবে যা প্রত্যাশিত নয়?
এপি 0

কেবল ত্রুটিটি অন্তর্ভুক্ত করার জন্য সম্পাদিত, দুঃখিত আমি এটি পোস্ট করার আগে ভুলে গেছি
আন্তেরো ডুয়ার্টে

উত্তর:


1

আপনাকে একক উদ্ধৃতিগুলির বাইরে চলকগুলি নেওয়া দরকার:

sed -e :a -e '$q;N;'"$LINES"',$D;ba' 

অন্যান্য নোট:

  • ALL_CAPS ভেরিয়েবল নাম ব্যবহার করার অভ্যাস থেকে বেরিয়ে আসুন। একদিন আপনি PATH = / tmp লিখবেন এবং তারপরে আপনার স্ক্রিপ্টটি কেন ভাঙা হয়েছে তা ভাববেন।
  • % শেলটির জন্য কোনও বিশেষ চরিত্র নয়, আপনাকে এড়াতে হবে না: date +%Y%m%d%H%M%S
  • $(...)ব্যাকটিকগুলির পরিবর্তে ব্যবহার করুন: দেখতে সহজ এবং নীড়ের পথ সহজ।
  • সেড একটি জায়গায় জায়গায় ফাইল সম্পাদনা করতে পারে, আপনাকে কোনও অস্থায়ী ফাইল এবং mvএটি লেখার দরকার নেই :

    sed -i -e :a -e '$q;N;'"$LINES"',$D;ba' 
  • এটি এই স্ট্যাকওভারফ্লো উত্তরের সাথে খুব মিলে যায় যা ভালভাবে নথিভুক্ত। অন্তর্দৃষ্টি জন্য এটি পড়ুন।


ধন্যবাদ, চেষ্টা করে দেখুন;) ক্যাপস জিনিস হিসাবে, আমি সত্যিই এটি করেছি কারণ আমি একটি ব্যাশ স্ক্রিপ্টিং শুরুর দিক নির্দেশিকাতে অনলাইনে দেখেছি, যদি তা না হয় তবে 'গাইডটি আমি ব্যবহার না করতাম, তবে আমি পরিবর্তন করব, ধন্যবাদ :) পিএস: এছাড়াও, জায়গায় কোনও ফাইল সম্পাদনা করার বিষয়ে, তাই আমি কেবল ফাইল নামটি সেড কমান্ডের পরে রেখেছি এবং এটি জায়গায় এটি সম্পাদনা করবে? সিড-আই-ই: এ-এ '$ কিউ; এন;' "$ লাইনস" ', $ ডি; বা' টেম্প্লাগ?
আন্টেরো ডুয়ার্টে

সেটা ঠিক. ।
গ্লেন জ্যাকম্যান

3

আমি জানি এটি যে উত্তরটি আপনি চেয়েছিলেন তা সেহেতু সম্পর্কিত নয় কারণ আপনি যা চান ঠিক তেমন ব্যবহার করতে পারেন tail:

tail -n <lines> <file> > <new_file>

mv new_file file


হ্যাঁ, ধন্যবাদ, আমি এটি জানি, আমি কেবল সেড ব্যবহার করছি কারণ আমি কোথাও পড়েছি যে লেজটি ধীরে ধীরে ... যাইহোক, যদি আমি লেজ ব্যবহার করি, তবে আমি লাইনে চলককে কীভাবে অন্তর্ভুক্ত করব? শুধু $ লাইন করবেন?
আন্টেরো ডুয়ার্টে

হ্যাঁ, এটি করতে হবে।
ইসহাক

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