Bash

Шпаргалка по bash

Что занимает место на диске:

du -a /home/ | sort -n -r | head -n 20
du -sh /vz/private/106/* | sort -h

Отправить данные по ssh через кастомный порт:

rsync -aOv -e 'ssh -p 3334' /root/ccd/ backupsync@my_domain.com:/mount_storage/

Посмотреть конфиг без комментариев (начинающихся не с начала строки в том числе) и пустых строк:

grep -v '^$\|^\s*\#' ../sites-available/default-ssl.conf

Просто без комментариев и пустых строк:

grep -v '^$\|^#' some-config.conf

#AWK

Примеры использования awk — https://www.opennet.ru/tips/1811_awk_shell.shtml


Основные linux-команды для новичка — https://habr.com/ru/post/501442/

Дюжина приемов в Linux, которые действительно сэкономят уйму времени — https://habr.com/ru/post/340544/

Перенаправление вывода в bash.


#Подсветка вывода текста в терминал

https://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux

По ссылке описано много вариатов как что посмотреть по этому вопросу и реализовать.

Ascii art — https://askubuntu.com/questions/234678/how-to-show-ascii-art-at-the-top-of-the-terminal-when-its-opened


Bash. Чтение файла.

index=0
while read line; do
    array[$index]="$line"
    index=$(($index+1))
done < filename

проверяем:

for ((a=0; a < ${#array[*]}; a++))
do
    echo "$a: ${array[$a]}"
done

Считывание файла построчно

#!/bin/bash
file="/var/log/file.log"
while IFS= read -r line
do
echo "$line"
done <"$file"

 

#!/bin/bash
file="/var/log/file.log"
while read line
do
echo "$line"
done < $file

Удаление файлов по шаблону:

find /var/log/ -type f -name "*.gz" -delete

#Удаление файлов старше 1000 дней 
find . -mtime +1000 -delete

Удаление пустых каталогов:

find $DATADIR -mtime +1 -type d -empty -delete


#Работа над строками

pkgs = "foo"
pkgs+ = "bar"
pkgs+ = "bqaz"

Разделить строку в скрипте

#!/bin/bash
#
# Скрипт для разделения строки на основе разделителя

my_string="Ubuntu;Linux Mint;Debian;Arch;Fedora"
IFS=';' read -ra my_array <<< "$my_string"

# Печать разделенной строки
for i in "${my_array[@]}"
do
    echo $i
done

Содержит ли строка подстроку

string='Моя длинная строка'
if [[ $string == *"Моя длинная"* ]]; then
  echo "Подстрока найдена!"
fi

#----------------------------------------------

string=Моя строка';
 
if [[ $string =~ "Моя" ]]
then
   echo "Подстрока найдена!"
fi

#----------------------------------------------

case "$string" in
  *foo*)
    # Do stuff
    ;;
esac

Взять часть строки до точки.

user=${user%.*ovpn}

#Выполнение команды на удалённом сервере

check_repos=$(ssh sendman@servername.com ‘ls /home/svnrun/repos/ | wc -l’)

#Процессы 

Убить процессы, имя которых содержит foo

pkill -f foo

#многострочная строка в одну переменную

$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo='baz'
EOF
)

#многострочная строка в файл Bash (создание файла скрипта)

$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF
$ cat <<EOF | grep 'b' | tee b.txt
foo
bar
baz
EOF

The b.txt file contains bar and baz lines. The same output is printed to stdout.


read -r -p "Are you sure? [y/N] " response
case "$response" in
    [yY][eE][sS]|[yY]) 
        do_something
        ;;
    *)
        do_something_else
        ;;
esac

Использованный материал.

https://stackoverflow.com/questions/2500436/how-does-cat-eof-work-in-bash


Заметки с этого чудесного канала — https://t.me/bashdays

Поиск удалённого файла по содержимому:

grep -a -C 200 -F '<some_code_in_script>' /dev/sda1

 

-a = осуществляем поиск в бинарных файлах.
-C = сколько строк выводить ДО и ПОСЛЕ каждого совпадения строки.


Команда history

Посмотреть

# Посмотрите 5 команд после строки 42
history | tail -n +43 | head -n 5