GNU/Linux >> Znalost Linux >  >> Linux

Jak odstranit duplikáty v .bash_history, zachování pořádku?

Opravdu mě baví používat control+r rekurzivně prohledávat historii mých příkazů. Našel jsem několik dobrých možností, které s ním rád používám:

# 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

Jediný problém pro mě je, že erasedups vymaže pouze sekvenční duplikáty – takže s tímto řetězcem příkazů:

ls
cd ~
ls

ls příkaz bude ve skutečnosti zaznamenán dvakrát. Přemýšlel jsem o pravidelném spouštění s cronem:

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

Tím by se docílilo odstranění duplikátů, ale pořadí by bohužel nebylo zachováno. Pokud sort soubor nejprve nevěřím uniq může fungovat správně.

Jak mohu odstranit duplikáty v mé .bash_history, zachování pořadí?

Kredit navíc:

Jsou nějaké problémy s přepsáním .bash_history soubor přes skript? Pokud například odstraníte soubor protokolu Apache, myslím, že musíte odeslat signál nohup / reset pomocí kill aby vyprázdnil jeho připojení k souboru. Pokud je to případ .bash_history soubor, možná bych mohl nějak použít ps zkontrolovat a ujistit se, že před spuštěním filtrovacího skriptu nejsou žádné připojené relace?

Přijatá odpověď:

Řazení historie

Tento příkaz funguje jako sort|uniq , ale udržuje čáry na místě

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

V podstatě se před každý řádek připojuje jeho číslo. Po sort|uniq -ing, všechny řádky se seřadí zpět podle jejich původního pořadí (pomocí pole s číslem řádku) a pole s číslem řádku se z řádků odstraní.

Toto řešení má tu chybu, že není definováno, který zástupce třídy stejných čar se dostane na výstup, a proto není jeho pozice ve výsledném výstupu definována. Pokud by však měl být vybrán nejnovější zástupce, můžete sort vstup druhým tlačítkem:

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

Správa .bash_history

Pro opětovné načtení a zapsání historie můžete použít history -a a history -w respektive.

Související:Spouštět bash skripty při vstupu do adresáře?
Linux
  1. Jak používat příkaz historie v Linuxu

  2. Jak odeberu zařízení mezipaměti z bcache?

  3. jak odstranit dvojité uvozovky v csv

  1. Jak odebrat uživatele v Linuxu pomocí příkazového řádku

  2. Jak získat přístup k historii za chodu v Unixu?

  3. Jak odstranit Bom ze souboru UTF-8?

  1. Jak odstranit jeden řádek z historie?

  2. Jak odstranit heslo z klíče SSL

  3. Jak odebrat správce mezipaměti cPanel