Кратки съвети за bash

Тук може да намерите полезни съвети и примери за много ситуации.

 

Търсене и замяна на низ в Bash

За да замените всички срещания на 'yy' с 'zz' в променливата X, използвайте следния израз:

${X//yy/zz}

Един пример:

ORIG="foo to the bar"
REPLACED=${ORIG//bar/baz}
echo $REPLACED

Резултатът е:
foo to the baz


Argument list too long или използване на xargs

Да предположим, че искате да изтриете всички jpeg картинки от няколко директории. Пишете:
rm -f `find . -name *.jpg -type f`
но получавате само "Argument list too long" ("Твърде дълъг списък с аргументи"). За да се справите с този проблем използвайте xargs, който ще раздели автоматично списъка на няколко по-малки и ще ги подаде на rm:
find . -name *.jpg -type f | xargs rm -f
По този начин командата rm се изпълнява няколко пъти и резултата е на лице - файловете са изтрити.

Създаване на файлове с определена големина чрез dd

За да създадете файл с произволно съдържание и точно определена дължина, бързо удобно е да се използва dd. Ето няколко примера.

Файл test1.bin, с големина 10k и съдържание от нулеви байтове:
dd bs=1024 count=10 if=/dev/zero of=test1.bin

Файл test2.bin, с големина 100k и случайно съдържание:
dd bs=1024 count=100 if=/dev/random of=test2.bin

Горният пример е доста бавен, особено за големи файлове, затова ето един начин за бързо генериране на относително случайни данни:
dd bs=1024 count=100 if=/dev/hda of=test2.bin skip=1000
Тази команда взима 100k данни от твъдият диск като започва от 1М след началото.


Последната дума от низ в bash

Последната дума може да се вземе с командата awk '{print $NF}':

echo "one two three" | awk '{print $NF}'

връща

three


Добавяне на публичният ключ към authorized_key файла на отдалечен хост с един ред

cat ~/.ssh/id_rsa.pub | ssh hostname "cat >> ~/.ssh/authorized_keys"


Rsync по ssh на нестандартен порт

Ако използвате rsync през ssh, за да се свързвате със сървър на различен от стандартния порт, например 555 вместо 22, използвайте следния формат:

rsync -a -e "ssh -p 555" rsyncuser@remoteserver:/data/to/sync /archive/

Повече за rsync


Добавяне на дата към всеки изведен ред

Представете си следната ситуация: пишете програма или скрипт, която извежда нещо на конзолата. Точно когато всичко е почти готово, осъзнавате че се нуждаете от точното време, в което всяко съобщение е изведено. Например искате да знаете по колко време отнема архивирането на домашната директория на всеки потребител. Едно решение е да заместите навсякъде в кода всяка команда за изход с подобрен еквивалент, който извежда и времето. Ето един много по-мързелив начин да се направи това само с един ред на bash:
 
> ./your_program | while read line; do stamp=`date`; echo "$stamp $line"; done
 
Пробвайте това:
 
> du -sc /home | while read line; do stamp=`date`; echo "$stamp $line"; done