Dvije korisne funkcije u ljusci BASH

Kao bivši sistemac, koji je povremeno objavljivao članke za sistemac.carnet.hr evo šaljem jednu zanimljivu funkciju. Ja ju relativno često koristim, pa zato mislim da bi mogla biti korisna i drugima, koji možda još ne znaju koliko im je nedostajala.

To su zapravo dvije funkcije koje se stave u .bashrc datoteku i mogu se odmah koristiti nakon što izvršite naredbu:

source ~/.bashrc

Prvu funkciju smo nazvali "fh" (teško je naći smislena kratka imena funkcija kad mnogobrojne Unix/Linux naredbe imaju tako kratka imena!)

function fh() { grep -i $1 ~/.bash_history | sort -u; }

Druga funkcija je "hh":

function hh() { clear;d=$(fh $1|wc -l);paste <(seq $d) <(fh \
      $1);read -p "broj linije: " l; c=$(fh $1| \
head -n $(($l+0))|tail -1); read -e -i "$c" d;eval $d ; }

Kad se u naredbenom retku ukuca:

hh <neki pojam>

izlista se popis svih naredbi iz datoteke .bash_history, koje sadrže <neki pojam>, te ukucavajući broj iz liste, odgovarajuća naredba se može odmah izvršiti, uz dodatnu mogućnost da se prije izvršenja naprave eventualne izmjene unutar naredbe.

<neki_pojam> se može staviti i u komentare naredbi iza znaka #, pa se će pretraživanje obuhvatiti i te komentare. Umjesto funkcija "fh" i "hh" može se kreirati i neki drugi par funkcija npr. "fk" i "kk" gdje bi se umjesto .bash_history koristila lista naredbi iz neke tekstualne datoteke.

Primjer:

$ hh txt

1       strace -e trace=open,close,read,write -o strace-file.txt dpkg-reconfigure mediawiki-aai #kako koristiti strace
2       cat popis.txt| while IFS= read ln; do echo $ln; done; # Čitaj file liniju po liniju
3       sed -ru 's/(..)\1{2,}/\1/g' # remove repeated pairs of characters e.g. "xtxtxtxt" will become "xt"
4       cat popis.txt| while IFS= read ln; do echo $ln; done; # Čitaj file liniju po liniju
5       sed -i 's/\s\+/ /g;s/\s*$//' file.txt #Get rid of multiple spaces/tabs in a text file
6       sed -i 's/\s\+/ /g;s/^\s*;s/\s*$' file.txt #Optionally, if you want to clear the leading whitespace, try:

broj linije: 2
cat popis.txt| while IFS= read ln; do echo $ln; done; # Čitaj file liniju po liniju

Zgodno je npr. ukucati:

hh cd

i dobije se nešto poput:

1 cd ./zim-0.65~ubuntu14.04.1/
2 cd ./YX8018_Datasheet___YX8019_Solar_LED_driver_files/
3 cd ./Your_contributions/
4 cd ./www.semiconductormuseum.com/
5 cd ./www.historyofelectronics.com/
6 cd ./winusbdotnet/
7 cd ./win32_executable/
8 cd ./web.archive.org/
9 cd ./webaddressbook/

broj linije: 6
cd ./winusbdotnet/

 

Kategorije: 
Vote: 
0
No votes yet