অর্ডার সংরক্ষণের জন্য আমি কীভাবে আমার .বাশ / ইতিহাসের সদৃশগুলি সরিয়ে ফেলতে পারি?


60

আমি control+rআমার কমান্ডের ইতিহাস পুনরাবৃত্তভাবে অনুসন্ধান করতে ব্যবহার করে উপভোগ করছি। আমি এটির সাথে ব্যবহার করতে চাই এমন কয়েকটি ভাল বিকল্প পেয়েছি:

# ignore duplicate commands, ignore commands starting with a space
export HISTCONTROL=erasedups:ignorespace

# keep the last 5000 entries
export HISTSIZE=5000

# append to the history instead of overwriting (good for multiple connections)
shopt -s histappend

আমার পক্ষে একমাত্র সমস্যা হ'ল erasedupsকেবল ক্রমযুক্ত ডুপ্লিকেটগুলি মুছুন - যাতে এই কমান্ডের স্ট্রিং সহ:

ls
cd ~
ls

lsকমান্ড আসলে দুইবার রেকর্ড করা হবে। আমি পর্যায়ক্রমে ডাব্লু / ক্রোন চলমান সম্পর্কে চিন্তা করেছি:

cat .bash_history | sort | uniq > temp.txt
mv temp.txt .bash_history

এটি সদৃশগুলি সরানো অর্জন করবে, তবে দুর্ভাগ্যক্রমে আদেশটি সংরক্ষণ করা হবে না। আমি যদি sortফাইলটি প্রথমে না করি তবে আমি বিশ্বাস করি না যে uniqসঠিকভাবে কাজ করতে পারে।

অর্ডার সংরক্ষণের জন্য আমি কীভাবে আমার .বাশ / ইতিহাসের সদৃশগুলি সরিয়ে ফেলতে পারি?

অতিরিক্ত ক্রেডিট:

কোনও .bash_historyস্ক্রিপ্টের মাধ্যমে ফাইলটি ওভাররাইটিংয়ে কোন সমস্যা আছে ? উদাহরণস্বরূপ, আপনি যদি অ্যাপাচি লগ ফাইলটি সরিয়ে থাকেন তবে আমি মনে করি যে killএটির সাথে ফাইলটির সংযোগ ফ্লাশ করার জন্য আপনাকে কোনও নোহপ / রিসেট সিগন্যাল প্রেরণ করতে হবে। যদি .bash_historyফাইলটির ক্ষেত্রে এটি হয় তবে সম্ভবত আমি psফিল্টারিং স্ক্রিপ্টটি চালানোর আগে কোনও সংযুক্ত সেশন নেই কিনা তা পরীক্ষা করে নিশ্চিত করতে ব্যবহার করতে পারি?


3
কিছুক্ষণের ignoredupsপরিবর্তে চেষ্টা করুন erasedupsএবং দেখুন এটি আপনার জন্য কীভাবে কার্যকর হয়।
jw013

1
আমি মনে করি না যে বাশ হিস্টোরি ফাইলটিতে একটি মুক্ত ফাইল হ্যান্ডেল ধারণ করে - এটি যখন এটি প্রয়োজন তখন এটি পড়ে / লিখেছে, সুতরাং এটি অন্য কোথাও থেকে ওভাররাইট করা নিরাপদে থাকা উচিত (নোট - উচিত - আমি পরীক্ষা করিনি) should
ডি_বাই

1
আমি আপনার প্রশ্নের প্রথম বাক্যে নতুন কিছু শিখেছি। ভাল কৌশল!
রিকার্ডো

historyকমান্ডের সমস্ত বিকল্পের জন্য আমি ম্যান পৃষ্ঠাটি পেতে ব্যর্থ হচ্ছি । আমি কোথায় খুঁজছি?
জোনাথন হার্টলি

ইতিহাসের বিকল্পগুলি 'ম্যান বাশ'-এ রয়েছে,' শেল বিল্টিন কমান্ড 'বিভাগ অনুসন্ধান করুন, তারপরে' ইতিহাসের 'জন্য।
জোনাথন হার্টলি

উত্তর:


36

ইতিহাস বাছাই করা হচ্ছে

এই কমান্ডটি কাজ করে sort|uniqতবে লাইনগুলি ঠিক রাখে

nl|sort -k 2|uniq -f 1|sort -n|cut -f 2

মূলত, প্রতিটি লাইনে এর সংখ্যার প্রিপেন্ড হয়। sort|uniq-র পরে , সমস্ত লাইনগুলি তাদের মূল ক্রম অনুসারে (লাইন নম্বর ক্ষেত্রটি ব্যবহার করে) সাজানো হয় এবং লাইন নম্বর ক্ষেত্রটি লাইনগুলি থেকে সরানো হয়।

এই সমাধানটির ত্রুটি রয়েছে যে এটি সম-লাইনের কোন শ্রেণির প্রতিনিধি এটি আউটপুটে তৈরি করবে এবং তাই চূড়ান্ত আউটপুটে এটির অবস্থান অপরিজ্ঞাত। তবে, যদি সর্বশেষ প্রতিনিধি চয়ন করা উচিত তবে আপনি sortদ্বিতীয় কী দ্বারা ইনপুট দিতে পারেন :

nl|sort -k2 -k 1,1nr|uniq -f1|sort -n|cut -f2

পরিচালনা .বাশ_তিহাসি

পুনরায় পড়া এবং ইতিহাস ফিরে লেখার জন্য, আপনি যথাক্রমে history -aএবং ব্যবহার করতে পারেন history -w


6
শেল সরঞ্জামগুলির সাথে কার্যকরভাবে সাজানো-সাজানো-আনকোয়ার্টের একটি সংস্করণ । খুশী হলাম।
ire_and_curses

এর সাথে sort, -rস্যুইচ সর্বদা বাছাইয়ের ক্রমকে বিপরীত করে। তবে এটি আপনার মনে থাকা ফলাফলটি অর্জন করবে না। ফলাফলের সাথে একই হিসাবে sortদুটি ঘটনাকেই সম্মান জানায় lsযে এমনকি বিপরীত হলেও, শেষ ক্রমটি বাছাই করা অ্যালগরিদমের উপর নির্ভর করে on তবে অন্য একটি ধারণার জন্য আমার আপডেট দেখুন।
শিল্পীপেক্স

1
যদি আপনি .bash_history পরিবর্তন করতে চান না, আপনি নিম্নলিখিতটি রাখতে পারেন .Bashrc: ওরফে ইতিহাস = 'ইতিহাস | সাজান-কে 2-কে 1,1 এনআর | uniq -f 1 | সাজান-এন '
নাথান

nlপ্রতিটি কোড লাইনের শুরুতে কী হয় ? এটা করা উচিত নয় history?
AL

1
@AL এনএল লাইনের নম্বর যুক্ত করে। সামগ্রিকভাবে কমান্ডটি সাধারণ সমস্যা সমাধান করে: আদেশ সংরক্ষণের সময় সদৃশগুলি সরিয়ে ফেলা। স্ট্যান্ডিন থেকে ইনপুটটি পড়া হয় is
আর্টিস্টেক্স

48

সুতরাং আমি সদৃশগুলিতে বিরক্ত হওয়ার পরে একই সঠিক জিনিসটির সন্ধান করছিলাম এবং আমি যদি আমার। / .Bash_profile (ম্যাক) এর সাথে সম্পাদনা করি তবে:

export HISTCONTROL=ignoreboth:erasedups

এটি আপনি যা চেয়েছিলেন ঠিক তা করে, এটি কেবল কোনও আদেশের সর্বশেষতম রাখে। ignorebothআসলে কাজটি করার মতো ignorespace:ignoredupsএবং এটি পাশাপাশি erasedupsকাজটি করে।

কমপক্ষে আমার ম্যাক টার্মিনালে ব্যাশ দিয়ে এই কাজটি নিখুঁত করুন। এটি এখানে জিজ্ঞাসা করা হয়েছে


10
এটি সঠিক উত্তর হওয়া উচিত
মিচড্রোডহেড

ম্যাক্স ওএস এক্স ইয়োসেমাইটে এবং উবুন্টুতে 14_04
রিকার্ডো

1
@ মিচব্রোডহেডের সাথে একমত এটি বাহ্যিক ক্রোন-কাজ ছাড়াই ব্যাশের মধ্যেই সমস্যার সমাধান করে। এটি উবুন্টু 17.04 এবং 16.04 এলটিএস
জর্জি জং

ওপেনবিএসডি তেও কাজ করে। এটি ইতিহাসের ফাইলটিতে সংযুক্ত যে কোনও কমান্ডের ডুপগুলি সরিয়ে দেয়, এটি আমার পক্ষে ভাল। এর আগে হিস্ট্রি ফাইলটি সংক্ষিপ্ত করার আকর্ষণীয় প্রভাব রয়েছে যেমন আমি কমান্ডগুলি প্রবেশ করি যা পূর্বে সদৃশ হিসাবে উপস্থিত ছিল। এখন আমি আমার ইতিহাসের ফাইলটি সর্বোচ্চ সংক্ষিপ্ত করতে পারি।
WeakPointer

1
এটি কেবল সদৃশ, ক্রমাগত আদেশগুলি উপেক্ষা করে। যদি আপনি দুটি প্রদত্ত কমান্ডের মধ্যে বারবার বিকল্প হন, তবে আপনার ব্যাশ ইতিহাস নকল দিয়ে পূরণ করবে
ডায়াল্যান্থেপিগুয়ে

16

বন্য এবং পরীক্ষায় এই সমাধানটি খুঁজে পেয়েছি:

awk '!x[$0]++'

প্রথমবার যখন একটি রেখার নির্দিষ্ট মান ($ 0) দেখা যায় তখন x [$ 0] এর মান শূন্য হয়।
শূন্যের মানটি উল্টো হয় !এবং এক হয়।
একটি বিবৃতি যা একজনকে মূল্যায়িত করে তার ফলে ডিফল্ট ক্রিয়া হয়, যা মুদ্রণযোগ্য।

অতএব, প্রথমবার কোনও নির্দিষ্ট $0দেখা গেলে এটি মুদ্রিত হয়।

প্রতিবারের (পুনরাবৃত্তি) এর মান x[$0]প্রতিবিম্বিত হয়েছে,
এর অবহেলিত মান শূন্য এবং একটি বিবৃতি যা শূন্যকে মূল্যায়ণ করে তা মুদ্রণ করে না।

সর্বশেষ পুনরাবৃত্তি মান ধরে রাখতে, ইতিহাসটি বিপরীত করুন এবং একই অবাস্তব ব্যবহার করুন:

awk '!x[$0]++' ~/.bash_history                 # keep the first value repeated.

tac ~/.bash_history | awk '!x[$0]++' | tac     # keep the last.

কি দারুন! সবে কাজ করেছে। তবে এটি আমার অনুমানের প্রথম ঘটনাটি বাদ দিয়ে সমস্ত কিছু সরিয়ে ফেলে। এটি চালানোর আগে আমি সাব্লাইম টেক্সট ব্যবহার করে লাইনের ক্রমটিকে বিপরীত করতাম। সমস্ত নকলের পিছনে রেখে যাওয়া কেবলমাত্র শেষ ঘটনাটি দিয়ে একটি পরিষ্কার ইতিহাস পেতে এখন আমি এটি আবার বিপরীত করব। ধন্যবাদ.
trss

আমার উত্তর দেখুন!
আলী শাকিবা

একটি বেজিলিয়ান সাব-প্রসেস চালু না করে চমৎকার পরিষ্কার এবং সাধারণ উত্তর (ইতিহাসের ব্যবহারের ক্ষেত্রে সীমাবদ্ধ নয়);
জেপজেড

9

ক্লেটন উত্তর বাড়ানো হচ্ছে:

tac $HISTFILE | awk '!x[$0]++' | tac | sponge $HISTFILE

tacফাইলটি বিপরীত করুন, নিশ্চিত হয়ে নিন যে আপনি ইনস্টল করেছেন moreutilsতাই আপনার spongeউপলব্ধ রয়েছে, অন্যথায় একটি টেম্প ফাইল ব্যবহার করুন।


1
ম্যাকের জন্য, ব্যবহার করুন brew install coreutilsএবং লক্ষ্য করুন যে সমস্ত জিএনইউ ব্যবহারকারীর gবিএসডি অন্তর্নির্মিত ম্যাক কমান্ডগুলির সাথে বিভ্রান্তি এড়াতে একটি চাপ দেওয়া আছে (যেমন জিএসইউ জিএনইউ যেখানে সেড বিএসডি)। সুতরাং ব্যবহার gtac
ট্রালস্টন

ইতিহাসটি ব্যবহার করার জন্য আমার ইতিহাস-সি এবং ইতিহাস-র দরকার ছিল

4

এগুলি সর্বশেষ সদৃশ লাইনগুলি রাখবে:

ruby -i -e 'puts readlines.reverse.uniq.reverse' ~/.bash_history
tac ~/.bash_history | awk '!a[$0]++' | tac > t; mv t ~/.bash_history

স্পষ্ট করে বলার জন্য, আমি কি ঠিক বুঝতে পেরেছি যে আপনি এখানে দুটি (চমত্কার) সমাধান দেখিয়েছেন এবং কোনও ব্যবহারকারীর কেবল তার একটি কার্যকর করতে হবে? হয় রুবি, না বাশ?
জোনাথন হার্টলি

3

এটি একটি পুরাতন পোস্ট, তবে একাধিক টার্মিনাল খোলা থাকতে চান এবং উইন্ডোগুলির মধ্যে ইতিহাস সিঙ্ক করতে চান তবে নকল নয় এমন ব্যবহারকারীদের জন্য একটি চিরস্থায়ী সমস্যা।

.Bashrc এ আমার সমাধান:

shopt -s histappend
export HISTCONTROL=ignoreboth:erasedups
export PROMPT_COMMAND="history -n; history -w; history -c; history -r"
tac "$HISTFILE" | awk '!x[$0]++' > /tmp/tmpfile  &&
                tac /tmp/tmpfile > "$HISTFILE"
rm /tmp/tmpfile
  • হিস্টপেন্ড বিকল্পটি ইতিহাসের ফাইলের শেষে বাফারের ইতিহাস যুক্ত করে (IST হিস্টফিল)
  • উপেক্ষাযোগ্য এবং মুছে ফেলাগুলি সদৃশ এন্ট্রিগুলিকে $ HistFILE এ সংরক্ষণ থেকে বাঁচায়
  • প্রম্পট কমান্ড ইতিহাসের ক্যাশে আপডেট করে
    • history -n car HISTFILE এর সমস্ত লাইন পড়ে যা শেষ ক্যারিজ ফেরার পর থেকে কোনও ভিন্ন টার্মিনালে ঘটেছে
    • history -w আপডেট করা বাফারটিকে $ HISTFILE লিখেছেন
    • history -c বাফার মুছুন যাতে কোনও সদৃশ ঘটে না
    • history -r এখন ফাঁকা বাফারের সাথে যুক্ত করে $ HistFILE পুনরায় পড়ুন
  • অ্যাডক স্ক্রিপ্টটি প্রতিটি লাইনের মুখোমুখি হওয়ার প্রথম উপস্থিতি সঞ্চয় করে। tacএটিকে বিপরীত করে এবং তারপরে এটি আবার ফিরিয়ে দেয় যাতে এটি ইতিহাসের সর্বাধিক সাম্প্রতিক কমান্ডগুলির সাহায্যে সংরক্ষণ করা যায়
  • / টিএমপি ফাইলটি আরএম করুন

আপনি যখনই নতুন শেলটি খোলেন, ইতিহাসের সমস্ত ডুপ মুছে ফেলা হয় এবং আপনি Enterযখনই কোনও আলাদা শেল / টার্মিনাল উইন্ডোতে কীটি চাপেন তখন ফাইলটি থেকে এই ইতিহাস আপডেট হয়।


মন্তব্যগুলিতে
এটির

যদি "উপেক্ষা করা এবং মুছে ফেলা দ্বিপগুলি সংরক্ষণ থেকে রক্ষা করে", তবে ফাইল থেকে ডুপস অপসারণ করার জন্য আপনাকে "অ্যাডক" কমান্ডটিও করতে হবে কেন? এটি কি কারণ "উপেক্ষা করা এবং মুছে ফেলা" কেবলমাত্র পর পরের ডুপগুলি সংরক্ষণ করা যায়? পেডেন্টিক হওয়ার জন্য দুঃখিত, আমি কেবল বোঝার চেষ্টা করছি।
জোনাথন হার্টলি

1
মুছে ফেলা কেবল ধারাবাহিক সদৃশগুলি মুছে দেয়। এবং আপনি ঠিক বলেছেন যে awk কমান্ডটি মুছে ফেলা কমান্ড মুছে ফেলার জন্য কমান্ডটিকে মুছে ফেলে।
হাসিফ্রোগ

আপনাকে ধন্যবাদ, এটি আমার কাছে স্পষ্ট করে দেয় যে কি চলছে।
জোনাথন হার্টলি

0

প্রতিটি নতুন কমান্ড অবিচ্ছিন্নভাবে রেকর্ড করা জটিল is প্রথমে আপনাকে যুক্ত করতে হবে ~/.profileবা অনুরূপ:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

তারপরে আপনাকে যুক্ত করতে হবে ~/.bash_logout:

history -a
history -w

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