Перейти к содержанию

▍Топ полезных команд

Работа с awk

awk '/pattern/' file # Вывести строки с pattern
awk '/pattern/ {action; action;}' file # Выполнить действия в строках с pattern, например,
awk '/apple/ {print $2" "$3;}' file # если строка содержит "apple", вывести 2-ю и 3-ю колонку через пробел
awk '!/apple/ {print $0;}' file # если строка НЕ содержит "apple", вывести строку полностью
awk '{print NF;}' file # вывести кол-во столбцов в каждой строке. $NF вывел бы значение в последнем столбце
awk 'length > 10' file # вывести строки длиной > 10 символов
awk -F ':' '{print $1;}' /etc/passwd # вывести имена пользователей (разделитель ":")

cat permissions
File1   User1   Read    3000
Dir1    Grp2    Modify  2000
File3   User2   Modify  1000
Dir3    Grp1    Read    4000
Dir3    Grp3    Modify  6000
File1   User4   FullControl     10000

# Блок BEGIN - действия до обработки данных, END - после
# Вывести "Starting script" и задать счётчик в 0. Если 3-й столбец match "[Mm]odify", то увеличить счётчик. В конце вывести строку и счётчик, обработать файл permissions
awk 'BEGIN {print "Starting script"; count=0;} $3 ~/[Mm]odify/ {count++;} END {print "People with modify permissions:",count;}' permissions
Starting script
People with modify permissions: 3

# Изначально i=0, если i<кол-ва столбцов в строке, то прибавить к t значение 4-го столбца, затем увеличить i на единицу.
# Когда будут обработаны все строки файла permissions, вывести полученное значение t.
awk '{for(i=0;i<NF;i++) t+=$NF} END {print t;}' permissions
# 3000*4=12000
# 12000+2000*4=20000
# 20000+1000*4=24000
# 24000+4000*4=40000
# 40000+6000*4=64000
# 64000+10000*4=104000
104000

# Если 2-я колонка match [Uu]ser, а значение последней меньше 2000, то вывести строку
awk '$2 ~/[Uu]ser/ {if($NF>2000) print "User", $2, "has", $NF, "number which more than 2000";}' permissions
User User1 has 3000 number which more than 2000
User User4 has 10000 number which more than 2000

Работа с date

# Последнее воскресенье месяца
if [[ $(date -d "$date + 1week" +%d%a) =~ 0[1-7]Sun ]]
then
    echo "$date is the last Sunday of the month!"
fi

date -d yesterday +'%b %d' # Вчера (мая 25)
date -d yesterday +%F # 2022-04-25
date -r file1 # дата изменения файла
date -u # время в UTC
date +%T -s "10:50:9" # изменить системное время на 10:50:09
date -s "15 aug 2022 14:00:00" # изменить дату и время
date -d@$(echo $SECONDS) -u +%T # время работы сессии bash - конвертировать из секунд в hh:mm:ss
# Время работы сессии bash полезно для подсчёта времени работы скрипта (конец - начало = время работы)

# Форматирование даты
%F - yy-MM-dd (2022-05-26)
%D – Display date as mm/dd/yy
%Y – Year (e.g., 2020)
%m – Month (01-12)
%B – Long month name (e.g., November)
%b – Short month name (e.g., Nov)
%d – Day of month (e.g., 01)
%j – Day of year (001-366)
%u – Day of week (1-7)
%A – Full weekday name (e.g., Friday)
%a – Short weekday name (e.g., Fri)
%T - Время в формате 10:20:30
%H – Hour (00-23)
%I – Hour (01-12)
%M – Minute (00-59)
%S – Second (00-60)

Работа с find

find /etc -name 'cron*' # найти в /etc всё, начинающееся с "cron"
find /etc -type f -name 'cron*' # только файлы (-type d - только каталоги)
find . -perm 777 # найти в текущем каталоге файлы с правами доступа 777
find . -perm 777 -exec chmod 555 {} \; # изменить им разрешения на 555
find / -mtime +1 # найти файлы с датой изменения старше суток
find / -atime +1 # найти файлы с датой доступа старше суток
find / -group www-data # файлы с владельцем-группой
find / -size 1MB # найти файлы размером 1 МБ
find /var/www -name *bxu* -exec rm -rf {} +

Работа с grep

grep ^hello file1 # обычный grep понимает регулярки
grep [1-9] file1 # найти цифры с 1 по 9
grep [a-f] file1 # буквы с a до f
grep -f expression1 file1 # взять запрос из файла expression1
grep -lr cron /etc # вывести имена файлов, содержащих в себе слово "cron" (-r - recursive)

Работа с lsof

Вывод списка открытых файлов, сокетов и каналов.

COMMAND       PID     TID TASKCMD               USER   FD      TYPE             DEVICE    SIZE/OFF       NODE NAME
systemd         1                               root  cwd       DIR                8,2        4096          2 /
systemd         1                               root  rtd       DIR                8,2        4096          2 /
systemd         1                               root  txt       REG                8,2       92544    2103315 /usr/lib/systemd/systemd
COMMAND - процесс
PID - идентификатор процесса
USER - пользователь
FD - дескриптор файла
 cwd — рабочий каталог
 rtd — каталог /root
 txt — исполняемый файл
 mem — область памяти
 число — номер дескриптора файла, используемого процессом
 u — файл открыт с правами RW
 r — файл открыт с правами R
 w — файл открыт с правами W с частичной блокировкой файла
 W — файл открыт с правами W с блокировкой всего файла
TYPE — тип файла
 REG — файл
 DIR — каталог
 FIFO — именованные каналы
DEVICE — номер устройства, на котором находится файл
SIZE/OFF — размер
NODE — номер inode, индексного дескриптора
NAME — имя файла
# Процессы, использующие каталог /tmp/test
lsof +D /tmp/test
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
vi      4570 root    3u   REG  253,0    12288 2621462 /tmp/test/.test.txt.swp
# Информация о процессе
lsof -p 4570

Если файл /tmp/test/.test.txt.swp удалить при работающем процессе, то lsof всё равно будет показывать файл с пометкой deleted. Если процесс завершить, то удалится дескриптор в /proc и файл исчезнет из вывода.

# Вывести удалённые файлы, занимающие память из-за того, что процесс не отпустил дескрипторы
lsof -a +L1 /tmp/test

Работа с printf

printf - format and print data

printf "Name:\t%s\nID:\t%04d\n" "User" "67"
Name:   User
ID:     0067

today=$(date +%F)
time=$(date +%T)
printf -v d "Current user:\t%s\nDate:\t\t%s @ %s\n" $USER $today $time # d - задаваемая переменная
echo "$d"
Current user:   user
Date:           2022-05-27 @ 14:35:20

Работа с read

read -r < log.txt # Читает первую строку из файла
echo "$REPLY" # If no NAMEs are supplied, the line read is stored in the REPLY variable.
Jun  5 00:00:29 srv-mail1 postfix/smtpd[217187]: disconnect from unknown[192.168.5.3] ehlo=1 auth=0/1 rset=1 quit=1 commands=3/4
read -r month day time server id message  < log.txt
echo "$message" # any leftover words assigned to the last NAME.
disconnect from unknown[192.168.5.3] ehlo=1 auth=0/1 rset=1 quit=1 commands=3/4
echo "$server"
srv-mail1

Работа с sed

# Заменить test на another test
echo "This is a test" | sed 's/test/another test/'
# Заменить в файле (файл не перезаписывается)
sed 's/test/another test' ./myfile
# Ключ -e - несколько действий
sed -e 's/This/That/; s/test/another test/' ./myfile
# Ключ -f - чтение команд из файла. Содержимое файла mycommands:
s/This/That/
s/test/another test/
# команда:
sed -f mycommands myfile

# Флаги, пишутся в конце команды (s/pattern/replacement/flags). Без флагов обрабатывается только первое совпадение.
# g - заменить все совпадения, число - обработать именно это совпадение,
# p - вывести исходную строку, w outputfile - записать результат в outputfile.
sed 's/test/another test/g' myfile
sed 's/test/another test/2' myfile
sed -n 's/test/another test/p' myfile # -n - вывести только совпадения
sed 's/test/another test/w output' myfile

# Можно заменить разделитель для более удобного чтения
sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
sed 's!/bin/bash!/bin/csh!' /etc/passwd

# Фильтр, обработка диапазона строк (с 10 по 20)
sed '10,20s/test/another test/' myfile
# с 10 до конца (можно использовать регулярку)
sed '2,$s/test/another test/' myfile
# заменить только в строке, где встречается слово user
sed '/user/s/bash/csh/' /etc/passwd

# удалить 3-ю строку
sed '3d' myfile
# удалить с 10 по 20
sed '10,20d' myfile
# с 10 до конца
sed '10,$d' myfile
# удаление строк по шаблону
sed '/test/d' myfile
# При удалении можно указывать несколько шаблонов.
# удалятся строки, где есть second и fourth и всё между ними
sed '/second/,/fourth/d' myfile

# вставка текста до
echo "Another test" | sed 'i\First test'
# вставка текста после
echo "Another test" | sed 'a\First test' 
# перед 2-й строкой
sed '2i\This is the inserted line.' myfile

# заменить целиком всю 3-ю строку
sed '3c\This is a modified line.' myfile
# заменить целиком все строки, где есть This is
sed '/This is/c This is a changed line of text.' myfile

# замена отдельных символов на соответствующие (1 на 5 и т. д.)
# применяется ко всему потоку, ограничить нельзя
sed 'y/123/567/' myfile

# вывести строки с их номерами
sed '=' myfile
# вывести номера строк, соответствующих шаблону
sed -n '/test/=' myfile

# вставить содержимое newfile после 3-й строки myfile
sed '3r newfile' myfile
# вставлять содержимое newfile каждый раз после строки, соответствующей шаблону
sed '/test/r newfile' myfile

# Заменить строки в myfile, где есть DATA, на содержимое newfile, удалить исходную строку 
sed '/DATA/ {
r newfile
d}' myfile

# Заменить foo на too.
sed -i 's/foo/too/'
# Удалить 14ю строку.
sed -i '14d' /file
# Удалить строку содержащую Network или network.
sed -i '/[Nn]etwork/d' /file
# Добавить в конец файла "[mounts]" затем перенос на новую строку и "user root".
sed -i '$ a \\n[mounts]\nuser root' /etc/munin/config 
# После 14ой строки добавить "echo "graph_category logger"".
sed '14a\ echo \"graph_category logger\"' /etc/munin/plugins/command 
# Вставить в начало файла '# vim: ft=ruby' и перенос строки.
sed '1i # vim: ft=ruby\n'  
# Заменить повторяющиеся пустые строки на одну пустую строку
sed -e ':a;/^$/N;/\n$/{D;ba}' file.txt
# Конвертация переносов строк DOS (CR/LF) в Unix (LF)
sed 's/.$//' dosfile.txt > unixfile.txt
# Заменить строку string1 строкой string2
sed 's/string1/string2/g'
# Изменить строку anystring1 на anystring2
sed 's/\(.*\)1/\12/g'
# Убрать комментарии и пустые строки
sed '/ *#/d; /^ *$/d'
# Соединить строки (линии) с предшествующим \
sed ':a; /\\$/N; s/\\\n//; ta'
# Удалить предшествующие пробелы строк
sed 's/[ \t]*$//'
# Закомментировать активные метасимволы оболочки двумя кавычками
sed 's/\([\\`\\"$\\\\]\)/\\\1/g'
# Выровнять числа по правой границе
seq 10 | sed "s/^/      /; s/ *\(.\{7,\}\)/\1/"
# Напечатать 1000-ную строку
sed -n '1000p;1000q'
# Напечатать строки с 10 по 20-ую
sed -n '10,20p;20q'
# Получить title из HTML страницы
sed -n 's/.*<title>\(.*\)<\/title>.*/\1/ip;T;q'
# Убрать пустые строки из файла
sed '/^$/d' input.txt > output.txt
# Удаляем из всех .html файлов начало до тэга <pre>
# и от </pre> до конца файла, включая и сами тэги
cat *.html | sed '1,/<pre>/d; /<\/pre>/,$d' > final.file

Работа с su, sudo

# войти от учётки vasya
su vasya
# войти от учётки vasya + его переменные окружения
su - vasya
# войти под рутом
su
# запустить одну команду без полноценного входа
su -c 'id'
#Проверить, какие команды разрешены юзеру vasya от рута
sudo -l

Отправить тестовое письмо:

echo "test" | mail -s "Test Subject" user@gmail.com

Выполнить PHP функцию в консоли:

php -r "echo phpinfo();" | grep date.timezone

Отключить спящий режим на ubuntu server:

sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

Для проверки набора переменных BASH_ENV:

$ env | grep BASH_ENV

Замер скорости диска:

dd if=/dev/zero of=testfile bs=4k count=1310720
dd if=testfile of=/dev/null bs=4k count=1310720

Обновить locate:

/usr/libexec/locate.updatedb

Конвертировать HEIC в JPG:

ls *.HEIC -1 | sed -e 's/\.HEIC$//' | xargs -I {} convert {}.HEIC {}.JPG

Изменить текстовый редактор для конкретного случая:

export EDITOR=ee; crontab -e

Удалить snapd в Ubuntu Server:

$ sudo apt purge snapd
$ sudo apt-mark hold snapd
snapd помечен как зафиксированный.

Удалить старые данные telegraf в Influxdb 1.8:

$ docker exec -ti influxdb influx 
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> use telegraf;
Using database telegraf
> DELETE WHERE time < '2022-06-01'

будут удалены все записи до 2022-06-01

Работа с сетью

Изменением маршрута:

route change default 192.168.1.1

Выключаем IPv6:

sudo nano /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Работа с архивами

Создать .tar.gz:

tar -czvf file.tar.gz /full/path — создать .tar.gz (архив)
tar -cjvf file.tar.bz2 /full/path — создать .tar.bz2 (архив)

Распаковать .tar:

tar -xvf file.tar.gz

Распаковать gz:

gunzip yourfile.gz

Распаковать многотомный архив:

7za x arch.7z.001

Получить листинг файлов в архиве:

tar -tf <path_to_tarfile>

Извлечь конкретный файл из архива:

tar -xf <path_to_tarfile> [<file_1_in_archive> <file_2_in_archive> ..]

Скопировать файл на сервер:

scp -P 12345 file.tar login@111.111.111.111:/home/user

Скопировать содержимое директории home на сервер:

scp -P 12345 -r /home/ login@111.111.111.111:/home2/

Запуск программ от супер пользователя:

ee /usr/local/etc/super.tab
jexec              /usr/sbin/jexec                  имяпользователя, пользователь
asterisk           /usr/local/sbin/asterisk         имяпользователя
Запускать:
super asterisk -rvvv

Работа с пользователями

Добавить пользователя:

sudo adduser testuser

или задать пользователя с конкретными gid и uid:

sudo groupadd asterisk -g 8000
sudo useradd asterisk -u 8000 -g 8000 -m -s /usr/sbin/nologin

Добавить пользователя testuser в существующую группу asterisk:

sudo usermod -aG asterisk testuser

Freebsd

Добавить нового пользователя vasya в систему и добавить этого пользователя в группу clients.

pw useradd vasya -G clients

Удалить пользователя:

rmuser

Руссификация консоли

ee ~/.login_conf
me:\
        :charset=UTF-8:\
        :lang=ru_RU.UTF-8:

Показать превышение дисковой коты по jail:

df | grep -v devfs | grep "/jails/" | awk '{if($5>90) print $6,$5}' | sed 's/\/Zjails\///g' | column -t

Задать переменную для запуска скриптов из "/root/bin":

ee ~/.cshrc
set path=($path /root/bin)

Примонтировать бакет в Яндекс облаке (для дебаг режима можно использовать ключи "-d -f"):

s3fs namebucket /srv/namebucket -o passwd_file=/root/.passwd-s3fs -o url=http://storage.yandexcloud.net -o use_path_request_style

Если при монтировании бакета выводится ошибка:

fuse: failed to open fuse device: No such file or directory

Значит не загружен модуль fuse, проверить вывод:

# kldstat
Id Refs Address            Size     Name
 1   17 0xffffffff80200000 20647c8  kernel
 2    1 0xffffffff82266000 381130   zfs.ko
 3    2 0xffffffff825e8000 a380     opensolaris.ko
 4    1 0xffffffff82821000 2328     ums.ko
 5    1 0xffffffff82824000 2e4a8    pf.ko

Загружаем модуль:

kldload fuse

К началу