Баш-Онелинер (translate by deepl)
Я рад, что вы здесь! Несколько лет назад я занимался биоинформатикой и был поражен этими однословными командами bash, которые намного быстрее, чем мои скучные скрипты, время, сэкономленное благодаря изучению сочетаний клавиш командной строки и сценариев. В последние годы я работаю над облачными вычислениями и продолжаю записывать эти полезные команды здесь. Не все они односложные, но я прилагаю усилия, чтобы сделать их краткими и быстрыми. В основном я использую Ubuntu, Amazon Linux, RedHat, Linux Mint, Mac и CentOS, извините, если команды не работают в вашей системе.
Этот блог будет посвящен простым командам bash для анализа данных и обслуживания системы Linux, которые я приобрел во время работы и экзамена LPIC. Я извиняюсь, что нет подробных ссылок на все команды, но они, вероятно, взяты из уважаемых Google и Stack Overflow.
Английский и bash не являются моим родным языком, пожалуйста, поправьте меня в любое время, спасибо. Если вы знаете другие классные команды, пожалуйста, научите меня!
Вот более стильная версия Bash-Oneliner-ru.
Удобные однострочники Bash
- Terminal Tricks
- Переменные
- Math
- Grep
- Sed
- Awk
- Xargs
- Find
- Условие и цикл
- Time
- Download
- Random
- Xwindow
- System
- Hardware
- Networking
- Data Wrangling
- Другие
Терминальные трюки
Использование клавиш Ctrl
Ctrl + n : то же, что и стрелка вниз.
Ctrl + p : то же, что и стрелка вверх.
Ctrl + r : начинает обратный поиск в истории команд (продолжайте нажимать Ctrl + r, чтобы двигаться назад).
Ctrl + s : остановить вывод на терминал.
Ctrl + q : возобновление вывода на терминал после Ctrl + s.
Ctrl + a : переход к началу строки.
Ctrl + e : перемещение в конец строки.
Ctrl + d : если вы что-то набрали, Ctrl + d удаляет символ под курсором, в противном случае происходит выход из текущей оболочки.
Ctrl + k : удалить весь текст от курсора до конца строки.
Ctrl + x + backspace : удалить весь текст от начала строки до курсора.
Ctrl + t : транспонировать символ перед курсором с символом под курсором, нажмите Esc + t, чтобы транспонировать два слова перед курсором.
Ctrl + w : вырезать слово перед курсором; затем Ctrl + y вставить его.
Ctrl + u : вырезать строку перед курсором; затем Ctrl + y вставить ее.
Ctrl + _ : отменить ввод.
Ctrl + l : эквивалентно очистить.
Ctrl + x + Ctrl + e : запуск редактора, определенного $EDITOR, для ввода вашей команды. Полезно для многострочных команд.
Изменить регистр
Esc + u
# переводит текст от курсора до конца слова в верхний регистр.
Esc + l
# переводит текст от курсора до конца слова в нижний регистр.
Esc + c
# переводит букву под курсором в верхний регистр, остальное слово - в нижний.
Номер истории выполнения (например, 53)
!53
Выполнить последнюю команду
!!
# запустите предыдущую команду с помощью sudo
sudo !!!
Выполните последнюю команду и измените какой-либо параметр, используя подстановку каретки (например, последняя команда: echo ‘aaa’ -> повторное выполнение как: echo ‘bbb’)
#last command: echo 'aaa'
^aaa^bbb
#echo 'bbb'
#bbb
#Обратите внимание, что будет заменен только первый aaa, если вы хотите заменить все 'aaa', используйте ':&' для повторения:
^aaa^bbb^:&
#or
!!:gs/aaa/bbb/
Запустите прошлую команду, которая начиналась с (например, cat filename)
!cat
# или
!c
# запустите cat filename снова
Bash globbing
# '*' служит "дикой картой" для расширения имени файла.
/etc/pa*wd #/etc/passwd
# '?' служит односимвольной "дикой картой" для расширения имени файла.
/b?n/?at #/bin/cat
# '[]' служит для поиска символа из диапазона.
ls -l [a-z]* # список всех файлов с алфавитом в имени файла.
# '{}' может использоваться для поиска имен файлов с более чем одним шаблоном
ls *.{sh,py} #список всех файлов .sh и .py
Некоторые удобные переменные окружения
$0 :имя оболочки или сценария оболочки.
$1, $2, $3, ... :позиционные параметры.
$# :количество позиционных параметров.
$? :последний статус выхода из конвейера переднего плана.
$- :текущий набор опций для оболочки.
$$ :pid текущей оболочки (не под-оболочки).
$! :PID последней фоновой команды.
$DESKTOP_SESSION текущий менеджер дисплея.
$EDITOR предпочитаемый текстовый редактор.
$LANG текущий язык.
$PATH список каталогов для поиска исполняемых файлов (т.е. готовых к запуску программ).
$PWD текущий каталог
$SHELL текущая оболочка
$USER текущее имя пользователя
$HOSTNAME текущее имя хоста
Переменные
Подстановка переменных в кавычках
# foo=bar
echo $foo
# bar
echo "$foo"
# bar
# одинарные кавычки приводят к тому, что переменные не расширяются
echo '$foo'
# $foo
# одинарные кавычки внутри двойных кавычек не отменяют расширения и являются частью вывода
echo "'$foo'"
# 'bar'
# удвоенные одинарные кавычки действуют как двойные кавычки, заставляя переменные расширяться
echo ''$foo''
# bar
Получение длины переменной
var="некоторая строка"
echo ${#var}
# 11
Получение первого символа переменной
var=строка
echo "${var:0:1}"
#s
# или
echo ${var%%"${var#?"}}
Удаление первой или последней строки из переменной
var="некоторая строка"
echo ${var:2}
#me string
Замена (например, удаление первого ведущего 0)
var="0050"
echo ${var[@]#0}
#050
Замена (например, заменить ‘a’ на ‘,’)
{var/a/,}
Замена всех (например, заменить все ‘a’ на ‘,’)
{var//a/,}
Grep строки со строками из файла (например, строки с ‘stringA или ‘stringB’ или ‘stringC’)
#с grep
test="stringA stringB stringC"
grep ${test// /\\\\\|} file.txt
# превращая пробел в 'или' (\||) в grep
Для изменения регистра строки, хранящейся в переменной, на нижний регистр (Расширение параметров)
var=HelloWorld
echo ${var,,}
helloworld
Развернуть и затем выполнить переменную/аргумент
cmd="bar=foo"
eval "$cmd"
echo "$bar" # foo
Математика
Арифметическое расширение в Bash (операторы: +, -, *, /, % и т.д.)
echo $((( 10 + 5 )) #15
x=1
echo $(( x++ )) #1 , обратите внимание, что это все еще 1, так как это пост-инкремент
echo $(( x++ )) #2
echo $((( ++x )) #4 , обратите внимание, что это не 3, так как это пре-инкремент
echo $(( x-- )) #4
echo $((( x-- )) #3
echo $(( --x )) #1
x=2
y=3
echo $((( x ** y )) #8
Выведите простые коэффициенты числа (например, 50)
фактор 50
# 50: 2 5 5
Суммирование входного списка (например, seq 10)
seq 10|paste -sd+|bc
Суммирование файла (каждая строка в файле содержит только одно число)
awk '{s+=$1} END {print s}' filename
Вычитание столбцов
cat file| awk -F '\t' 'BEGIN {SUM=0}{SUM+=$3-$2}END{print SUM}'
Простая математика с помощью expr
expr 10+20 #30
expr 10\*20 #600
expr 30 \> 20 #1 (true)
Больше математики с bc
# Количество десятичных цифр/значащая цифра
echo "scale=2;2/3" | bc
#.66
# Оператор экспоненты
echo "10^2"| bc
#100
# Использование переменных
echo "var=5;--var"| bc
#4
Grep
Тип grep
grep = grep -G # базовое регулярное выражение (BRE)
fgrep = grep -F # фиксированный текст, игнорирующий мета-символы
egrep = grep -E # расширенное регулярное выражение (ERE)
pgrep = grep -P # Perl-совместимые регулярные выражения (PCRE)
rgrep = grep -r # рекурсивный
Grep и подсчет количества пустых строк
grep -c "^$"
Поиск и возврат только целого числа
grep -o '[0-9]*
#or
grep -oP '\d*'
Поиск целого числа с определенным количеством цифр (например, 3)
grep '[0-9]\{3\}'
# или
grep -E '[0-9]{3}'
# или
grep -P '\d{3}'
Искать только IP-адрес
grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}''
# или
grep -Po '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
Grep целое слово (например, ‘target’)
grep -w 'target'
#или используя RE
grep '\btarget\b'
Grep возвращает строки до и после совпадения (например, ‘bbo’)
# возвращает также 3 строки после совпадения
grep -A 3 'bbo'
# возвращает также 3 строки до совпадения
grep -B 3 'bbo'
# возвращает также 3 строки до и после совпадения
grep -C 3 'bbo'
Поиск строки, начинающейся с (например, ‘S’)
grep -o 'S.*'
Извлечение текста между словами (например, w1,w2)
grep -o -P '(?<=w1).*(?=w2)'
Grep строки без слова (например, ‘bbo’)
grep -v bbo filename
Поиск строк, не начинающихся со строки (например, #)
grep -v '^#' file.txt
Искать переменные с пробелом внутри (например, myvar=”some strings”)
grep "$myvar" filename
#не забудьте заключить переменную в кавычки!
Искать только одно/первое совпадение (например, ‘bbo’)
grep -m 1 bbo filename
Искать и возвращать номер совпадающей строки (например, ‘bbo’)
grep -c bbo filename
Подсчет вхождений (например, три раза строка считается три раза)
grep -o bbo filename |wc -l
Нечувствительный к регистру grep (например, ‘bbo’/’BBO’/’Bbo’)
grep -i "bbo" filename
Выявить совпадение (например, ‘bbo’)
grep --color bbo filename
Grep ищет все файлы в каталоге (например, ‘bbo’)
grep -R bbo /path/to/directory
# или
grep -r bbo /path/to/directory
Поиск всех файлов в каталоге, не выводите имена файлов (например, ‘bbo’)
grep -rh bbo /path/to/directory
Поиск всех файлов в каталоге, вывод ТОЛЬКО имен файлов с совпадениями (например, ‘bbo’)
grep -rl bbo /path/to/directory
Grep OR (например, A или B или C или D)
grep 'A\|B\|C\|D'
Grep AND (например, A и B)
grep 'A.*B'
Regex любой отдельный символ (например, ACB или AEB)
grep 'A.B'
Regex с определенным символом или без него (например, color или color)
grep 'colou\?r'
Перепечатка всего содержимого файлаА из файлаВ
grep -f fileA fileB
Найти вкладку
grep $'\t'
Поиск переменной из переменной
$echo "$long_str"|grep -q "$short_str"
if [ $? -eq 0 ]; then echo 'found'; fi
#grep -q выведет 0, если совпадение найдено
#не забудьте добавить пробел между []!
Grep-строки между скобками()
grep -oP '\(\K[^\)]+'
Поиск количества символов с известными строками между ними (например, AAEL000001-RA)
grep -o -w "\w\{10\}\-R\w\{1\}"
# \w слово символ [0-9a-zA-Z_] \W не слово символ
Пропустить каталог (например, ‘bbo’)
grep -d skip 'bbo' /path/to/files/*
Sed
Удалите 1-ю строку
sed 1d filename
Удалить первые 100 строк (удалить строки 1-100)
sed 1,100d filename
Удалите строки со строкой (например, ‘bbo’)
sed "/bbo/d" filename
# нечувствительно к регистру:
sed "/bbo/Id" filename
Удалите строки, n-й символ которых не равен значению (например, 5-й символ не равен 2)
sed -E '/^.{5}[^2]/d'
#aaaa2aaa (вы можете остаться)
#aaaa1aaa (удалить!)
Редактирование infile (редактирование и сохранение в файл), (например, удаление строк с ‘bbo’ и сохранение в файл)
sed -i "/bbo/d" filename
При использовании переменной (например, $i), используйте двойные кавычки “ “
# например, добавьте >$i к первой строке (чтобы сделать файл FASTA для биоинформатики)
sed "1i >$i"
# обратите внимание на двойные кавычки! В других примерах можно использовать одинарные кавычки, но здесь - ни в коем случае!
# '1i' означает вставить в первую строку.
Одновременное использование переменной окружения и шаблона конца строки
# Используйте обратную косую черту для шаблона конца строки $, и двойные кавычки для выражения переменной
sed -e "\$s/\$/\n+--$3--+/"
Удаление/удаление пустых строк
sed '/^\s*$/d'
# или
sed '/^$/d'
Удаление/удаление последней строки
sed '$d'
Удаление/удаление последнего символа из конца файла
sed -i '$ s/.$//' filename
Добавить строку в начало файла (например, “[”)
sed -i '1s/^/[/' file
Добавить строку в определенный номер строки (например, добавить ‘something’ в строку 1 и строку 3)
sed -e '1isomething' -e '3isomething'
Добавьте строку в конец файла (например, “]”)
sed '$s/$/]/' filename
Добавить новую строку в конец
sed '$a\'
Добавьте строку в начало каждой строки (например, ‘bbo’)
sed -e 's/^/bbo/' file
Добавьте строку в конец каждой строки (например, “}”)
sed -e 's/$/\}\]/' имя файла
Добавить \n через каждый n-ый символ (например, через каждый 4-й символ)
sed 's/.\{4\}/&\n/g'
Конкатенировать/комбинировать/объединять файлы с разделителем и следующей строкой (например, разделять “,”)
sed -s '$a,' *.json > all.json
Подстановка (например, заменить A на B)
sed 's/A/B/g' filename
Подстановка с подстановочным знаком (например, заменить строку, начинающуюся с aaa= на aaa=/my/new/path)
sed "s/aaa=.*/aaa=\/my\/new\/path/g"
Выберите строки, начинающиеся со строки (например, ‘bbo’)
sed -n '/^@S/p'
Удалить строки, начинающиеся со строки (например, ‘bbo’)
sed '/bbo/d' filename
Вывести/получить/обрезать диапазон строк (например, строка 500-5000)
sed -n 500,5000p filename
Печать каждой n-ой строки
sed -n '0~3p' filename
# catch 0: start; 3: step
Выводите каждую нечетную # строку
sed -n '1~2p'
Выведите каждую третью строку, включая первую
sed -n '1p;0~3p'
Удаление пробельных символов и табуляции
sed -e 's/^[ \t]*//'
# Заметьте пробел перед '\t'!!!
Удаление только ведущих пробелов
sed 's/ *//'
# обратите внимание на пробел перед '*'!!!
Удаление завершающих запятых
sed 's/,$//g'
Добавьте колонку в конец
sed "s/$/\t$i/"
# $i - это значение, которое вы хотите добавить.
# Чтобы добавить имя файла в каждый последний столбец файла
for i in $(ls);do sed -i "s/$/\t$i/" $i;done
Добавить расширение имени файла в последний столбец
for i in T000086_1.02.n T000086_1.02.p;do sed "s/$/\t${i/*./}/" $i;done >T000086_1.02.np
Удалить новую строку\ следующую строку
sed ':a;N;$!ba;s/\n//g'
Вывести определенную строку (например, 123-ю строку)
sed -n -e '123p'
Выведите ряд строк (например, от 10-й до 33-й строки)
sed -n '10,33p' <filename
Изменить разделитель
sed 's=/=/=\\\\/=g'
Заменить подстановочным знаком (например, A-1-e или A-2-e или A-3-e….)
sed 's/A-.*-e//g' filename
Удалить последний символ файла
sed '$ s/.$//'
Вставить символ в указанную позицию файла (например, AAAAAA –> AAA#AAA)
sed -r -e 's/^.{3}/&#/' file
Awk
Установите табуляцию в качестве разделителя полей
awk -F $'\t'
Вывод в виде разделения табуляцией (также как разделитель полей)
awk -v OFS='\t'
Передача переменной
a=bbo;b=obb;
awk -v a="$a" -v b="$b" "$1==a && $10=b" filename
Выведите номер строки и количество символов в каждой строке
awk '{print NR,length($0);}' filename
Найти количество столбцов
awk '{print NF}'
Обратный порядок столбцов
awk '{print $2, $1}'
Проверка наличия запятой в колонке (например, в колонке $1)
awk '$1~/,/ {print}'
Разделение и выполнение цикла for
awk '{split($2, a,",");for (i in a) print $1"\t "a[i]}' filename
Вывести все строки до n-го вхождения строки (например, остановить печать строк, когда ‘bbo’ появляется 7 раз)
awk -v N=7 '{print}/bbo/&& --N<=0 {exit}'
Выведите имя файла и последнюю строку всех файлов в каталоге
ls|xargs -n1 -I file awk '{s=$0};END{print FILENAME,s}' file
Добавить строку в начало столбца (например, добавить “chr” в столбец $3)
awk 'BEGIN{OFS="\t"}$3="chr»$3’
Удалите строки со строкой (например, ‘bbo’) (AWK)
awk '!/bbo/' file
Удалить последний столбец
awk 'NF{NF-=1};1' файл
Использование и значение NR и FNR
# Например, есть два файла:
# fileA:
# a
# b
# c
# fileB:
# d
# e
awk 'print FILENAME, NR,FNR,$0}' fileA fileB
# fileA 1 1 a
# fileA 2 2 b
# fileA 3 3 c
# fileB 4 1 d
# fileB 5 2 e
AND gate
# Например, есть два файла:
# fileA:
# 1 0
# 2 1
# 3 1
# 4 0
# fileB:
# 1 0
# 2 1
# 3 0
# 4 1
awk -v OFS='\t' 'NR=FNR{a[$1]=$2;next} NF {print $1,((a[$1]=$2)? $2: "0")}' fileA fileB
# 1 0
# 2 1
# 3 0
# 4 0
Округлите все числа файла (например, до 2 значащей цифры)
awk '{while (match($0, /[0-9]+\[0-9]+/)){
\printf "%s%.2f", substr($0,0,RSTART-1),substr($0,RSTART,RLENGTH)
\$0=substr($0, RSTART+RLENGTH)
\}
\print
\}'
Присвоить номер/индекс каждой строке
awk '{printf("%s\t%s\n",NR,$0)}’
Объедините данные столбцов в строки
# Например, разделите следующее содержимое:
# David cat,dog
# в
# David cat
# Давид собака
awk '{split($2,a,",");for(i in a)print $1"\t "a[i]}' file
# Деталь здесь: http://stackoverflow.com/questions/33408762/bash-turning-single-comma-separated-column-into-multi-line-string
Усреднение файла (каждая строка в файле содержит только одно число)
awk '{s+=$1}END{print s/NR}'
Печать поля, начинающегося со строки (например, Linux)
awk '$1 ~ /^Linux/'
Сортировка строки (например, 1 40 35 12 23 –> 1 12 23 35 40)
awk ' {split( $0, a, "\t" ); asort( a ); for( i = 1; i <= length(a); i++ ) printf( "%s\t", a[i] ); printf( "\n" ); }''
Вычитаем значения предыдущей строки (добавляем столбец6, который равен столбцу4 минус последний столбец5)
awk '{$6 = $4 - prev5; prev5 = $5; print;}'
Xargs
Установить табуляцию в качестве разделителя (по умолчанию:пробел)
xargs -d\t
Запрос команд перед их выполнением
ls|xargs -L1 -p head
Отображение 3 элементов в строке
echo 1 2 3 4 5 6| xargs -n 3
# 1 2 3
# 4 5 6
Подсказка перед выполнением
echo a b c |xargs -p -n 3
Печать команды вместе с выводом
xargs -t abcd
# bin/echo abcd
# abcd
С помощью find и rm
find . -name "*.html"|xargs rm
# при использовании обратного знака
rm ``find . -name "*.html"`
Удаление файлов с пробелами в имени файла (например, “hello 2001”)
find . -name "*.c" -print0|xargs -0 rm -rf
Показать ограничения на длину командной строки
xargs --show-limits
# Вывод с моего Ubuntu:
# Ваши переменные окружения занимают 3653 байта.
# Верхний предел POSIX на длину аргумента (эта система): 2091451
# POSIX наименьший допустимый верхний предел длины аргумента (все системы): 4096
# Максимальная длина команды, которую мы можем реально использовать: 2087798
# Размер буфера команд, который мы фактически используем: 131072
# Максимальный параллелизм (--max-procs должно быть не больше): 2147483647
Переместить файлы в папку
find . -name "*.bak" -print 0|xargs -0 -I {} mv {} ~/old
# или
find . -name "*.bak" -print 0|xargs -0 -I file mv file ~/old
Переместите первый 100-й файл в каталог (например, d1)
ls |head -100|xargs -I {} mv {} d1
Parallel
time echo {1..5} |xargs -n 1 -P 5 sleep
# намного быстрее, чем:
time echo {1..5} |xargs -n 1 sleep
Скопируйте все файлы из A в B
find /dir/to/A -type f -name "*.py" -print 0| xargs -0 -r -I file cp -v -p file --target-directory=/path/to/B
# v: verbose|
# p: сохранить детали (например, владельца)
С помощью sed
ls |xargs -n1 -I file sed -i '/^Pos/d' file
Добавьте имя файла в первую строку файла
ls |sed 's/.txt//g'|xargs -n1 -I file sed -i -e '1 i\>file\' file.txt
Подсчитать все файлы
ls |xargs -n1 wc -l
Превратите вывод в одну строку
ls -l| xargs
Подсчет файлов в каталогах
echo mso{1..8}|xargs -n1 bash -c 'echo -n "$1:"; ls -la "$1"| grep -w 74 |wc -l' -...
# "--" сигнализирует о конце опций и отображает дальнейшую обработку опций
Подсчет строк во всех файлах, также подсчет общего количества строк
ls|xargs wc -l
Xargs и grep
cat grep_list |xargs -I{} grep {} filename
Xargs и sed (замена всех старых ip-адресов на новые ip-адреса в каталоге /etc)
grep -rl '192.168.1.111' /etc | xargs sed -i 's/192.168.1.111/192.168.2.111/g'
Find
Список всех подкаталогов/файлов в текущем каталоге
найти
Список всех файлов в текущем каталоге
найти . -type f
Список всех каталогов под текущим каталогом
найти -type d
Редактирование всех файлов в текущем каталоге (например, заменить ‘www’ на ‘ww’)
find . -name '*.php' -exec sed -i 's/www/w/g' {} \;
# если нет подкаталога
замените "www" "w" - *
# пробел перед *
Поиск и вывод только имени файла (например, “mso”)
find mso*/ -name M* -printf "%f\n"
Поиск больших файлов в системе (например, >4G)
find / -type f -size +4G
Найти и удалить файл размером менее (например, 74 байта)
find . -name "*.mso" -size -74c -delete.
# M для MB и т.д.
Поиск пустых (0 байт) файлов
find . -type f -empty
# для дальнейшего удаления всех пустых файлов
find . -type f -empty -delete
Рекурсивный подсчет всех файлов в каталоге
find . -type f | wc -l
Условия и Циклы
Оператор If
# цикл if и else для поиска соответствия строк
if [[ "$c" == "read" ]]; then outputdir="seq"; else outputdir="write" ; fi
# Проверьте, содержит ли myfile строку 'test':
if grep -q hello myfile; then echo -e "файл содержит строку!" ; fi
# Проверьте, является ли mydir каталогом, перейдите в него и сделайте другие вещи:
if cd mydir; then
echo 'некоторое содержимое' >myfile
else
echo >&2 "Фатальная ошибка. Этот скрипт требует наличия mydir."
fi
# если переменная равна null
if [ ! -s "myvariable" ]; then echo -e "variable is null!" ; fi
# Истина длины, если "STRING" равен нулю.
# Используя команду test (такую же, как []), проверьте, является ли длина переменной ненулевой
test -n "$myvariable" && echo myvariable is "$myvariable" || echo myvariable is not set
# Проверьте, существует ли файл
if [ -e 'filename' ]
then
echo -e "Файл существует!"
fi
# Проверьте, существует ли файл, но также включая символические ссылки:
if [ -e myfile ] || [ -L myfile ]
, тогда
echo -e "файл существует!"
fi
# Проверьте, больше или равно ли значение x 5
if [ "$x" -ge 5 ]; then echo -e "больше или равно 5!" ; fi
# Проверьте, больше или равно ли значение x 5, в bash/ksh/zsh:
if ((x >= 5)); then echo -e "greater or equal than 5!" ; fi
# Используйте (( )) для арифметических операций
if ((j==u+2)); then echo -e "j==u+2!!!" ; fi
# Используйте [[ ]] для сравнения
if [[ $age -gt 21 ]]; then echo -e "forever 21!!!" ; fi
For loop
# Выдаем эхом имя файла в текущем каталоге
for i in $(ls); do echo file $i;done
#or
for i in *; do echo file $i; done
# Сделать каталоги перечисленными в файле (например, myfile)
for dir in $(<myfile); do mkdir $dir; done
# Нажмите любую клавишу для продолжения каждого цикла
for i in $(cat tpc_stats_0925.log |grep failed|grep -o '\query\w\{1,2\}');do cat ${i}.log; read -rsp $'Press any key to continue...\n' -n1 key;done
# Печать файла построчно при нажатии клавиши,
oifs="$IFS"; IFS=$'\n'; for line in $(cat myfile); do ...; done
while read -r line; do ...; done <myfile
#Если в строке только одно слово, просто
for line in $(cat myfile); do echo $line; read -n1; done
#Пройтись по массиву
for i in "${arrayName[@]}"; do echo $i;done
While loop
# Вычитание столбцов из файла (например, файл с 3 столбцами)
while read a b c; do echo $(($c-$b));done < < <(head filename)
# между двумя '<' стоит пробел
# Суммируем вычитание столбцов
i=0; while read a b c; do ((i+=$c-$b)); echo $i; done < <(head filename))
# Продолжайте проверять запущенный процесс (например, perl) и запускайте другой новый процесс (например, python) сразу после него. (ЛУЧШЕ использовать команду wait! Ctrl+F 'wait')
while [[ $(pidof perl) ]];do echo f;sleep 10;done && python timetorunpython.py
switch (case in bash)
прочитать тип;
case $type in
'0')
echo 'how'
;;
'1')
echo 'are'
;;
'2')
echo 'you'
;;
esac
Time
Узнайте время, необходимое для выполнения команды
time echo hi
Подождите некоторое время (например, 10 с)
sleep 10
Выведите дату с форматированием
дата +%F
# 2020-07-19
# или
date +'%d-%b-%Y-%H:%M:%S'
# 10-Apr-2020-21:54:40
# Возвращает текущее время с наносекундами.
date +"%T.%N"
# 11:42:18.664217000
# Получение секунд с эпохи (1 января 1970 года) для заданной даты (например, 16 марта 2021 года)
date -d "Mar 16 2021" +%s
# 1615852800
# или
date -d "Tue Mar 16 00:00:00 UTC 2021" +%s
# 1615852800
# Преобразуйте количество секунд с эпохи обратно в дату
date --date @1615852800
# Tue Mar 16 00:00:00 UTC 2021
ожидание произвольной длительности (например, сон 1-5 секунд, как добавление джиттера)
sleep $[ ( $RANDOM % 5 ) + 1 ]
Выйти из учетной записи через определенный период времени (например, 10 секунд)
TMOUT=10
#как только вы установите эту переменную, таймер выхода из системы начнет работать!
Установите, как долго вы хотите выполнять команду
#Это запустит команду 'sleep 10' всего на 1 секунду.
timeout 1 sleep 10
Задайте время выполнения команды (например, через 1 минуту)
at now + 1min # единицами времени могут быть минуты, часы, дни или недели
предупреждение: команды будут выполняться с помощью /bin/sh
at> echo hihigithub >~/itworks
at> <EOT> # нажмите Ctrl + D для выхода
задание 1 at Wed Apr 18 11:16:00 2018
Загрузка
Скачайте содержимое этого README.md (того, который вы сейчас просматриваете)
curl https://raw.githubusercontent.com/smartmanru/Bash-Oneliner-ru/master/README.md | pandoc -f markdown -t man | man -l -...
# или w3m (текстовый веб-браузер и пейджер)
curl https://raw.githubusercontent.com/smartmanru/Bash-Oneliner-ru/master/README.md | pandoc | w3m -T text/html
# или с помощью emacs (в текстовом редакторе emac)
emacs --eval '(org-mode)' --insert <(curl https://raw.githubusercontent.com/smartmanru/Bash-Oneliner-ru/master/README.md | pandoc -t org)
# или с помощью emacs (в терминале, выход с помощью Ctrl + x, затем Ctrl + c)
emacs -nw --eval '(org-mode)' --insert <(curl https://raw.githubusercontent.com/smartmanru/Bash-Oneliner-ru/master/README.md | pandoc -t org)
Загрузите все со страницы
wget -r -l1 -H -t1 -nd -N -np -A mp3 -e robots=off http://example.com
# -r: рекурсия и загрузка всех ссылок на странице
# -l1: только ссылки одного уровня
# -H: span host, посещать другие хосты
# -t1: количество повторных попыток
# -nd: не создавать новые каталоги, скачивать сюда
# -N: включить временную метку
# -nd: нет родителя
# -A: тип (разделять по ,)
# -e robots=off: игнорировать файл robots.txt, который не дает wget завалить сайт, извините example.com
Загрузка файла в веб и скачивание (https://transfer.sh/)
# Загрузите файл (например, filename.txt):
curl --upload-file ./filename.txt https://transfer.sh/filename.txt
# Вышеуказанная команда вернет URL, например: https://transfer.sh/tG8rM/filename.txt
# Далее вы можете скачать его:
curl https://transfer.sh/tG8rM/filename.txt -o filename.txt
Загрузите файл, если необходимо
data=file.txt
url=http://www.example.com/$data
if [ ! -s $data ];then
echo "downloading test data..."
wget $url
fi
Wget на имя файла (если имя длинное)
wget -O filename "http://example.com"
Wget файлов в папку
wget -P /path/to/directory "http://example.com"
Дайте команду curl следовать за любым перенаправлением, пока оно не достигнет конечного пункта назначения
curl -L google.com
Random
Случайная генерация пароля (например, сгенерировать 5 паролей длиной 13)
sudo apt install pwgen
pwgen 13 5
#sahcahS9dah4a xieXaiJaey7xa UuMeo0ma7eic9 Ahpah9see3zai acerae7Huigh7
Случайная выборка 100 строк из файла
shuf -n 100 имя файла
Случайный порядок (счастливый жребий)
for i in a b c d e; do echo $i; done | shuf
Эхо серии случайных чисел между диапазонами (например, перетасовать числа от 0-100, затем выбрать 15 из них случайным образом)
shuf -i 0-100 -n 15
Эхо случайного числа
echo $RANDOM
Случайное число от 0-9
echo $((RANDOM % 10))
Случайный от 1-10
echo $(((RANDOM %10)+1))
Xwindow
X11 GUI-приложения! Вот несколько GUI-инструментов для вас, если вам наскучило окружение, состоящее только из текста.
Включите переадресацию X11, чтобы использовать графические приложения на серверах
ssh -X имя_пользователя@ip_адрес
# или настройка через xhost
# --> Установите следующее для Centos:
# xorg-x11-xauth
# xorg-x11-fonts-*
# xorg-x11-utils
Маленькие инструменты xwindow
xclock
xeyes
xcowsay
Открываем картинки/изображения с ssh-сервера
1. ssh -X имя_пользователя@ip_адрес
2. apt-get install eog
3. eog picture.png
Просмотр видео на сервере
1. ssh -X имя_пользователя@ip_адрес
2. sudo apt install mpv
3. mpv myvideo.mp4
Использование gedit на сервере (GUI редактор)
1. ssh -X имя_пользователя@ip_адрес
2. apt-get install gedit
3. gedit filename.txt
Открыть PDF файл с ssh сервера
1. ssh -X имя_пользователя@ip_адрес
2. apt-get install evince
3. evince filename.pdf
Использование браузера google-chrome с ssh-сервера
1. ssh -X имя_пользователя@ip_адрес
2. apt-get install libxss1 libappindicator1 libindicator7
3. wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
4. sudo apt-get install -f
5. dpkg -i google-chrome*.deb
6. google-chrome
System
Работа с историей yum
# Вывести историю yum (например, установка, обновление)
sudo yum history
# Пример вывода:
# Загруженные плагины: extras_suggestions, langpacks, priorities, update-motd
# ID | Логин пользователя | Дата и время | Действие(и) | Изменено
# ---------------------------------------
# 11 | ... <myuser> | 2020-04-10 10:57 | Install | 1 P<
# 10 | ... <myuser> | 2020-03-27 05:21 | Установить | 1 >P
# 9 | ... <myuser> | 2020-03-05 11:57 | I, U | 56 *<
# ...
# Показать более подробную информацию об истории yum (например, история #11)
sudo yum history info 11
# Отменить историю yum (например, историю #11, это приведет к деинсталляции некоторых пакетов)
sudo yum history undo 11
Аудит файлов, чтобы узнать, кто внес изменения в файл [только для систем на базе RedHat]
# Для рекурсивного аудита каталога на предмет изменений (например, myproject)
auditctl -w /path/to/myproject/ -p wa
# Если вы удалите файл с именем "VIPfile", удаление будет записано в /var/log/audit/audit.log
sudo grep VIPfile /var/log/audit/audit.log
#type=PATH msg=audit(1581417313.678:113): item=1 name="VIPfile" inode=300115 dev=ca:01 mode=0100664 ouid=1000 ogid=1000 rdev=00:00 nametype=DELETE cap_fp=00000000 cap_fi=00000000 cap_fe=0 cap_fver=0
Проверьте, включен ли SELinux
sestatus
# SELinux status: enabled
# SELinuxfs mount: /sys/fs/selinux
# SELinux root directory: /etc/selinux
# Имя загруженной политики: target
# Текущий режим: усиление
# Режим из файла конфигурации: enforcing
# Политика MLS статус: включена
# Статус политики deny_unknown: разрешено
# Максимальная версия политики ядра: 31
Генерируем открытый ключ из закрытого ключа
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
Скопируйте ваш открытый ключ по умолчанию удаленному пользователю
ssh-copy-id <имя_пользователя>@<IP_сервера>
# затем вам нужно ввести пароль
# и в следующий раз вам не нужно будет вводить пароль при ssh к этому пользователю
Скопируйте открытый ключ по умолчанию удаленному пользователю, используя необходимый закрытый ключ (например, используйте ваш ключ mykey.pem для копирования вашего id_rsa.pub удаленному пользователю)
# перед тем, как использовать mykey.pem для ssh к удаленному пользователю.
ssh-copy-id -i ~/.ssh/id_rsa.pub -o "IdentityFile ~/Downloads/mykey.pem" <имя_пользователя>@<IP_сервера>
# теперь вам не нужно использовать ключ для ssh для этого пользователя.
SSH Agent Forwarding
# Чтобы взять с собой ключ при ssh на серверА, а затем ssh на серверВ с сервераА, используя ключ.
ssh-agent
ssh-add /path/to/mykey.pem
ssh -A <имя пользователя>@<IP_of_serverA>
# Далее можно выполнить ssh на серверB
ssh <имя пользователя>@<IP_of_serverB>
Установите пользователя и ключ по умолчанию для хоста при использовании SSH
# добавьте следующее в ~/.ssh/config
Хост myserver
Пользователь myuser
IdentityFile ~/path/to/mykey.pem
# Далее, вы можете запустить "ssh myserver" вместо "ssh -i ~/path/to/mykey.pem myuser@myserver"
Следите за последними логами сервиса
journalctl -u <имя_службы> -f
Устраните зомби
# Зомби уже мертв, поэтому вы не можете его убить. Вы можете уничтожить зомби, убив его родителя.
# Сначала найдите PID зомби.
ps aux| grep 'Z'
# Затем найдите PID родителя зомби.
pstree -p -s <zombie_PID>
# Затем вы можете убить его родителя, и вы заметите, что зомби исчез.
sudo kill 9 <parent_PID>
Показать использование памяти
free -c 10 -mhs 1
# вывести 10 раз с интервалом в 1 секунду
Показать статистику CPU и IO для устройств и разделов
# обновлять каждую секунду
iostat -x -t 1
Отображение использования пропускной способности сетевого интерфейса (например, enp175s0f0)
iftop -i enp175s0f0
Узнать, как долго работает система и количество пользователей
uptime
Проверить, запущен ли root
if [ "$EUID" -ne 0 ]; then
echo "Пожалуйста, запустите это от имени root"
exit 1
fi
Изменение оболочки пользователя (например, bonnie)
chsh -s /bin/sh bonnie
# /etc/shells: действительные оболочки для входа в систему
Изменить root / fake root / jail (например, изменить root на newroot)
chroot /home/newroot /bin/bash
# Для выхода из chroot
exit
Отображение состояния файла (размер; время доступа, изменения, модификации и т.д.) файла (например, filename.txt)
stat filename.txt
Снимок текущих процессов
ps aux
Отображение дерева процессов
pstree
Найти максимальное количество процессов
cat /proc/sys/kernel/pid_max
Печать или управление кольцевым буфером ядра
dmesg
Показать IP-адрес
ip add show
# или
ifconfig
Выведите предыдущий и текущий уровень выполнения SysV
runlevel
# или
who -r
Изменение уровня SysV runlevel (например, 5)
init 5
#or
telinit 5
Отображение всех доступных сервисов на всех уровнях выполнения
chkconfig -list
# update-rc.d эквивалент chkconfig в ubuntu
Проверка версии системы
cat /etc/*-release
Linux Programmer’s Manuel: hier- описание иерархии файловой системы
man hier
Управление менеджером систем и служб systemd
# Например, проверьте статус службы cron
systemctl status cron.service
# например, остановить службу cron
systemctl stop cron.service
List job
jobs -l
Запуск программы с измененным приоритетом (например, ./test.sh)
# значение nice регулируется от -20 (наиболее благоприятное) до +19
# чем приятнее приложение, тем ниже приоритет.
# По умолчанию приятность: 10; приоритет по умолчанию: 80
nice -10 ./test.sh
Export PATH
export PATH=$PATH:~/path/you/want
Сделать файл исполняемым
chmod +x filename
# теперь вы можете открыть ./filename, чтобы выполнить его
Печать системной информации
uname -a
# Проверьте аппаратную платформу системы (x86-64)
uname -i
Серфинг в сети
ссылки www.google.com
Добавить пользователя, установить passwd
useradd имя пользователя
passwd имя пользователя
Редактирование переменной PS1 для bash (например, отображение всего пути)
1. vi ~/.bash_profile
2. export PS1='\u@\h:\w\$'
# $PS1 - это переменная, определяющая оформление и стиль командного интерпретатора.
# Вы можете использовать эмодзи и добавить метку времени к каждой подсказке, используя следующее значение:
# export PS1="\t@🦁:\w\$ "
3. источник ~/.bash_profile
Редактирование параметров окружения (например, псевдонима)
1. vi ~/.bash_profile
2. alias pd="pwd" // больше не нужно набирать это 'w'!
3. source ~/.bash_profile
Вывести все псевдонимы
alias -p
Unalias (например, после alias ls=’ls –color=auto’)
unalias ls
Установка и снятие опций оболочки
# вывести все опции оболочки
shopt
# для удаления (или остановки) псевдонимов
shopt -u expand_aliases
# для установки (или запуска) псевдонимов
shopt -s expand_aliases
Список переменных окружения (например, PATH)
echo $PATH
# список каталогов, разделенных двоеточием
Список всех переменных окружения для текущего пользователя
env
Сброс переменной окружения (например, сброс переменной ‘MYVAR’)
unset MYVAR
Показать формат раздела
lsblk
Информирование ОС об изменениях в таблице разделов
partprobe
Мягкая ссылка программы на bin
ln -s /path/to/program /home/usr/bin
# должен быть полный путь к программе
Показать шестнадцатеричное представление данных
hexdump -C filename.class
Перейти к другому узлу
rsh имя_узла
Проверка порта (активное интернет-соединение)
netstat -tulpn
Печать разрешенных символических ссылок или канонических имен файлов
readlink filename
Узнайте тип команды и ссылку на нее (например, python)
type python
# python это /usr/bin/python
# Существует 5 различных типов, проверьте их с помощью флага 'type -f'.
# 1. alias (псевдоним оболочки)
# 2. function (функция оболочки, тип также выводит тело функции)
# 3. builtin (встроенная функция оболочки)
# 4. file (дисковый файл)
# 5. keyword (зарезервированное слово оболочки)
# Вы также можете использовать `which
какой python
# /usr/bin/python
Список имен всех функций
объявить -F
Список общего размера каталога
du -hs .
# или
du -sb
Копирование каталога с установкой разрешения
cp -rp /path/to/directory
Сохранить текущий каталог
pushd .
# then pop
popd
#или используйте dirs для отображения списка текущих запомненных каталогов.
dirs -l
Показать использование диска
df -h
# или
du -h
# или
du -sk /var/log/* |sort -rn |head -10
проверьте использование Inode
df -i
# Файловая система Inodes IUsed IFree IUse% Mounted on
# devtmpfs 492652 304 492348 1% /dev
# tmpfs 497233 2 497231 1% /dev/shm
# tmpfs 497233 439 496794 1% /run
# tmpfs 497233 16 497217 1% /sys/fs/cgroup
# /dev/nvme0n1p1 5037976 370882 4667094 8% /
# tmpfs 497233 1 497232 1% /run/user/1000
Показать все типы файловых систем
df -TH
Показать текущий уровень выполнения
runlevel
Переключение уровня выполнения
init 3
#or
telinit 3
Постоянное изменение уровня выполнения
1. отредактируйте /etc/init/rc-sysinit.conf
2. env DEFAULT_RUNLEVEL=2
Стать root
su
Стать кем-то
su somebody
Сообщить о кавычках пользователя на устройстве
repquota -auvs
Получение записей в ряде важных баз данных
getent имя_базы_данных
# (например, база данных 'passwd')
getent passwd
# список всех учетных записей пользователей (всех локальных и LDAP)
# (например, получить список учетных записей grop)
getent group
# хранить в базе данных 'group'
Изменить владельца файла
chown имя_пользователя имя_файла
chown -R user_name /path/to/directory/
# chown user:group filename
Монтирование и размонтирование
# например, смонтировать /dev/sdb в /home/test
mount /dev/sdb /home/test
# например, размонтировать /home/test
umount /home/test
List current mount detail
mount
# или
df
Список текущих имен пользователей и номеров пользователей
cat /etc/passwd
Получить все имя пользователя
getent passwd| awk '{FS="[:]"; print $1}'
Показать всех пользователей
compgen -u
Показать все группы
compgen -g
Показать группу пользователя
имя пользователя группы
Показать uid, gid, группу пользователя
id имя пользователя
# переменная для UID
echo $UID
Проверьте, является ли он root
if [ $(id -u) -ne 0 ];then
echo "Вы не root!"
exit;
fi
# 'id -u' выводит 0, если вы не root
Узнать информацию о процессоре
more /proc/cpuinfo
# или
lscpu
Установите квоту для пользователя (например, мягкий лимит диска: 120586240; жесткий лимит: 125829120)
setquota username 120586240 125829120 0 0 /home
Показать квоту для пользователя
quota -v имя пользователя
Отображение текущих библиотек из кэша
ldconfig -p
Печать зависимостей общих библиотек (например, для ‘ls’)
ldd /bin/ls
Проверка входа пользователя в систему
lastlog
Проверка истории последних перезагрузок
последняя перезагрузка
Редактирование пути для всех пользователей
joe /etc/environment
# отредактируйте этот файл
Показать и установить лимит пользователей
ulimit -u
Выведите количество ядер/процессоров
nproc -all
Проверка состояния каждого ядра
1. верх
2. нажмите '1'
Показать задания и PID
jobs -l
Список всех запущенных служб
service --status-all
Запланируйте выключение сервера
shutdown -r +5 "Сервер будет перезапущен через 5 минут. Пожалуйста, сохраните свою работу."
Отмена запланированного выключения
shutdown -c
Трансляция всем пользователям
wall -n hihi
Убить все процессы пользователя
pkill -U имя_пользователя
Убить все процессы программы
kill -9 $(ps aux | grep 'имя_программы' | awk '{print $2}')
Установить привилегии gedit на сервере
# Возможно, вам придется установить следующее:
apt-get install libglib2.0-bin;
# или
yum install dconf dconf-editor;
yum install dbus dbus-x11;
# Проверить список
gsettings list-recursively
# Изменить некоторые настройки
gsettings set org.gnome.gedit.preferences.editor highlight-current-line true
gsettings set org.gnome.gedit.preferences.editor scheme 'cobalt'
gsettings set org.gnome.gedit.preferences.editor use-default-font false
gsettings set org.gnome.gedit.preferences.editor editor editor-font 'Cantarell Regular 12'
Добавьте пользователя в группу (например, добавьте пользователя ‘nice’ в группу ‘docker’, чтобы он мог запускать docker без sudo)
sudo gpasswd -a nice docker
Pip install python package without root
1. pip install --user имя_пакета
2. Вам может понадобиться экспортировать ~/.local/bin/ в PATH: export PATH=$PATH:~/.local/bin/
Удаление старых ядер linux (когда /boot почти заполнен…)
1. uname -a #проверьте текущее ядро, которое НЕ должно быть удалено
2. sudo apt-get purge linux-image-X.X.X-X-generic #заменить старую версию
Изменить имя хоста
sudo hostname your-new-name
# если не работает, сделайте также:
hostnamectl set-hostname your-new-hostname
# затем проверьте с помощью:
hostnamectl
# Или проверьте /etc/hostname
# Если все еще не работает..., отредактируйте:
/etc/sysconfig/network
/etc/sysconfig/network-scripts/ifcfg-ensxxx
#add HOSTNAME="your-new-hostname"
Список установленных пакетов
apt list -installed
# или на Red Hat:
yum list installed
Проверка обновления пакета
apt list -upgradeable
# или
sudo yum check-update
Запустите yum update, исключив пакет (например, не обновляйте пакет php)
sudo yum update --exclude=php*
Проверьте, какой файл делает устройство занятым при umount
lsof /mnt/dir
Когда звук не работает
killall pulseaudio
# затем нажмите Alt-F2 и введите pulseaudio
Список информации об устройствах SCSI
lsscsi
Руководство по настройке собственного DNS-сервера
http://onceuponmine.blogspot.tw/2017/08/set-up-your-own-dns-server.html
Учебник по созданию простого демона
http://onceuponmine.blogspot.tw/2017/07/create-your-first-simple-daemon.html
Учебник по использованию gmail для отправки электронной почты
http://onceuponmine.blogspot.tw/2017/10/setting-up-msmtprc-and-use-your-gmail.html
Использование telnet для проверки открытых портов, проверка возможности подключения к порту (например, 53) сервера (например, 192.168.2.106)
telnet 192.168.2.106 53
Изменение максимальной единицы передачи (mtu) сети (например, изменить на 9000)
ifconfig eth0 mtu 9000
Получение pid запущенного процесса (например, python)
pidof python
# или
ps aux|grep python
Проверка статуса процесса по PID
ps -p <PID>
#or
cat /proc/<PID>/status
cat /proc/<PID>/stack
cat /proc/<PID>/stat
NTP
# Запустите ntp:
ntpd
# Проверить ntp:
ntpq -p
Удалите ненужные файлы, чтобы очистить ваш сервер
sudo apt-get autoremove
sudo apt-get clean
sudo rm -rf ~/.cache/thumbnails/*
# Удалите старое ядро:
sudo dpkg --list 'linux-image*'
sudo apt-get remove linux-image-OLDER_VERSION
Увеличение/изменение размера корневого раздела (корневой раздел является логическим томом LVM)
pvscan
lvextend -L +130G /dev/rhel/root -r
# Добавление -r приведет к росту файловой системы после изменения размера тома.
Создайте загрузочный USB-накопитель UEFI (например, /dev/sdc1)
sudo dd if=~/path/to/isofile.iso of=/dev/sdc1 oflag=direct bs=1048576
Найдите и удалите пакет
sudo dpkg -l | grep <имя_пакета>
sudo dpkg --purge <имя_пакета>
Создание ssh-туннеля
ssh -f -L 9000:targetservername:8088 root@192.168.14.72 -N
#-f: работать в фоновом режиме; -L: слушать; -N: ничего не делать
#теперь 9000 вашего компьютера подключен к 8088 порту targetservername через 192.168.14.72
#так что вы можете увидеть содержимое targetservername:8088, введя localhost:9000 из вашего браузера.
Получение идентификатора процесса (например, sublime_text)
#pidof
pidof sublime_text
#pgrep, вам не нужно набирать имя программы целиком
pgrep sublim
#pgrep, эхо 1, если процесс найден, эхо 0, если такого процесса нет
pgrep -q sublime_text && echo 1 || echo 0
#top, занимает больше времени
top|grep sublime_text
Некоторые инструменты бенчмаркинга для вашего сервера
aio-stress - бенчмарк AIO.
bandwidth - бенчмарк пропускной способности памяти.
bonnie++ - бенчмарк производительности жесткого диска и файловой системы.
dbench - генерирование рабочих нагрузок ввода-вывода либо на файловую систему, либо на сетевой сервер CIFS или NFS.
dnsperf - авторизованные и рекурсивные DNS-серверы.
filebench - генератор рабочих нагрузок файловой системы на основе модели.
fio - бенчмарк ввода-вывода.
fs_mark - эталон синхронного/асинхронного создания файлов.
httperf - измерение производительности веб-сервера.
interbench - бенчмарк интерактивности linux.
ioblazer - мультиплатформенный микробенчмарк стека хранения данных.
iozone - бенчмарк файловой системы.
iperf3 - измерение производительности TCP/UDP/SCTP.
kcbench - бенчмарк компиляции ядра, компилирует ядро и измеряет время, затраченное на это.
lmbench - набор простых, переносимых бенчмарков.
netperf - измерение производительности сети, тестирование однонаправленной пропускной способности и сквозной задержки.
netpipe - независимый оценщик производительности сетевых протоколов.
nfsometer - система оценки производительности NFS.
nuttcp - измерение производительности сети.
phoronix-test-suite - комплексная платформа автоматизированного тестирования и бенчмаркинга.
seeker - портативный бенчмарк поиска диска.
siege - тестер нагрузки http и бенчмарк.
sockperf - утилита сетевого бенчмаркинга через API сокетов.
spew - измеряет производительность ввода-вывода и/или генерирует нагрузку на ввод-вывод.
stress - генератор рабочей нагрузки для POSIX-систем.
sysbench - скриптовый эталон производительности баз данных и систем.
tiobench - эталон потокового ввода-вывода.
unixbench - оригинальный набор эталонов BYTE UNIX, обеспечивает базовый показатель производительности Unix-подобной системы.
wrk - эталон HTTP.
Инструмент мониторинга производительности - sar
# установка
# Он собирает данные каждые 10 минут и генерирует отчет ежедневно. За сбор и генерацию отчетов отвечает файл crontab (/etc/cron.d/sysstat).
yum install sysstat
systemctl start sysstat
systemctl enable sysstat
# показывает загрузку процессора 5 раз каждые 2 секунды.
sar 2 5
# показать использование памяти 5 раз каждые 2 секунды.
sar -r 2 5
# показывать статистику подкачки 5 раз каждые 2 секунды.
sar -B 2 5
# Вывести всю сетевую статистику:
sar -n ALL
# чтение файла журнала SAR с помощью команды -f
sar -f /var/log/sa/sa31|tail
Чтение из файла журнала
journalctl --file ./log/journal/a90c18f62af546ccba02fa3734f00a04/system.journal --since "2020-02-11 00:00:00"
Показать список последних вошедших в систему пользователей
lastb
Показать список текущих вошедших пользователей, распечатать информацию о них
who
Показать, кто вошел в систему и что он делает
w
Выведите имена пользователей, вошедших в систему на текущем хосте
users
Остановка хвоста файла при завершении программы
tail -f --pid=<PID> filename.txt
# замените <PID> на идентификатор процесса программы.
Список всех включенных служб
systemctl list-unit-files|grep enabled
Hardware
Соберите и обобщите всю информацию об аппаратном обеспечении вашей машины
lshw -json >report.json
# Другие опции: [ -html ] [ -short ] [ -xml ] [ -json ] [ -businfo ] [ -sanitize ] и т.д.
Выяснение деталей устройства памяти
sudo dmidecode -t memory
Вывод подробной информации об аппаратном обеспечении процессора
dmidecode -t 4
# Информация о типе
# 0 BIOS
# 1 Система
# 2 Базовая плата
# 3 Шасси
# 4 Процессор
# 5 Контроллер памяти
# 6 Модуль памяти
# 7 Кэш
# 8 Разъем порта
# 9 Системные слоты
# 11 OEM-строки
# 13 Язык BIOS
# 15 Журнал системных событий
# 16 Массив физической памяти
# 17 Устройство памяти
# 18 Ошибка 32-битной памяти
# 19 Адрес сопоставления массива памяти
# 20 Адрес сопоставления устройства памяти
# 21 Встроенное указательное устройство
# 22 Портативная батарея
# 23 Сброс системы
# 24 Аппаратная безопасность
# 25 Управление питанием системы
# 26 Щуп напряжения
# 27 Устройство охлаждения
# 28 Датчик температуры
# 29 Щуп электрического тока
# 30 Внеполосный удаленный доступ
# 31 Службы целостности загрузки
# 32 Загрузка системы
# 34 Устройство управления
# 35 Компонент устройства управления
# 36 Пороговые данные устройства управления
# 37 Канал памяти
# 38 Устройство IPMI
# 39 Источник питания
Подсчитайте количество жестких дисков Segate
lsscsi|grep SEAGATE|wc -l
# или
sg_map -i -x|grep SEAGATE|wc -l
Получение UUID диска (например, sdb)
lsblk -f /dev/sdb
# или
sudo blkid /dev/sdb
Сгенерируйте UUID
uuidgen
Печать подробной информации обо всех жестких дисках
lsblk -io KNAME,TYPE,MODEL,VENDOR,SIZE,ROTA
#где ROTA означает вращающееся устройство / вращающиеся жесткие диски (1 - если истинно, 0 - если ложно)
Список всех устройств PCI (Peripheral Component Interconnect)
lspci
# Список информации о сетевой карте
lspci | egrep -i --color 'network|ethernet'
Список всех USB-устройств
lsusb
Модули Linux
# Показать статус модулей в ядре Linux
lsmod
# Добавление и удаление модулей из ядра Linux
modprobe
# или
# Удалить модуль
rmmod
# Вставить модуль
insmod
Управление устройствами с поддержкой IPMI (например, BMC)
# Удаленное выяснение состояния питания сервера
ipmitool -U <bmc_username> -P <bmc_password> -I lanplus -H <bmc_ip_address> power status
# Удаленное включение сервера
ipmitool -U <bmc_username> -P <bmc_password> -I lanplus -H <bmc_ip_address> power on
# Включите индикатор идентификации панели (по умолчанию 15 с)
ipmitool chassis identify 255
# Узнайте температуру датчиков сервера
ipmitool sensors |grep -i Temp
# Сброс BMC
ipmitool bmc reset cold
# Prnt BMC network
ipmitool lan print 1
# Настройка сети BMC
ipmitool -I bmc lan set 1 ipaddr 192.168.0.55
ipmitool -I bmc lan set 1 netmask 255.255.255.0
ipmitool -I bmc lan set 1 defgw ipaddr 192.168.0.1
Networking
Разрешить домен в IP-адрес(ы)
dig +short www.example.com
# или
хост www.example.com
Получение DNS TXT записи a домена
dig -t txt www.example.com
# или
host -t txt www.example.com
Отправьте ping с ограничением TTL до 10 (TTL: Time-To-Live, это максимальное количество переходов, которое пакет может пройти через Интернет, прежде чем будет отброшен)
ping 8.8.8.8 -t 10
Печать трассировки маршрутных пакетов до узла сети
traceroute google.com
Проверка соединения с хостом (например, проверка соединения с 80 и 22 портом google.com)
nc -vw5 google.com 80
# Подключение к 80 порту [tcp/http] google.com успешно!
nc -vw5 google.com 22
# nc: соединение с google.com порт 22 (tcp) прервано: Операция продолжается
# nc: connect to google.com port 22 (tcp) failed: Network is unreachable
Nc как инструмент чата
# С сервера A:
$ sudo nc -l 80
# затем вы можете подключиться к порту 80 с другого сервера (например, сервера B):
# например, telnet <IP-адрес сервера A> 80
# затем введите что-нибудь на сервере B.
# и вы увидите результат на сервере A!
Проверьте, какие порты слушают TCP соединения из сети
#заметьте, что некоторым компаниям может не понравиться, что вы используете nmap
nmap -sT -O localhost
# проверьте порт 0-65535
nmap -p0-65535 localhost
Проверка работоспособности хоста и сканирование открытых портов, также пропуск обнаружения хоста
#пропускает проверку, жив ли хост, что иногда может вызвать ложное срабатывание и остановить сканирование.
$ nmap google.com -Pn
# Пример вывода:
# Starting Nmap 7.01 ( https://nmap.org ) at 2020-07-18 22:59 CST
# Отчет о сканировании Nmap для google.com (172.217.24.14)
# Host is up (0.013s latency).
# Другие адреса для google.com (не сканировались): 2404:6800:4008:802::200e
# Запись rDNS для 172.217.24.14: tsa01s07-in-f14.1e100.net
# Не показано: 998 отфильтрованных портов
# ОБСЛУЖИВАНИЕ СОСТОЯНИЯ ПОРТА
# 80/tcp open http
# 443/tcp open https
#
# Nmap done: 1 IP-адрес (1 хост) отсканирован за 3,99 секунды
Сканирование на наличие открытых портов и определение ОС и версии (например, сканирование домена “scanme.nmap.org”)
$ nmap -A -T4 scanme.nmap.org
# -A для включения обнаружения ОС и версий, сканирования скриптов и traceroute; -T4 для более быстрого выполнения
Поиск информации о сайте (например, сервера имен), поиск объекта в базе данных RFC 3912
whois google.com
Показать SSL-сертификат домена
openssl s_client -showcerts -connect www.example.com:443
Показать IP-адрес (ip)
ip a
Показать WAN-адрес (ip)
curl ifconfig.me
Отображение таблицы маршрутов
ip r
Отображение ARP-кэша (ARP-кэш отображает MAC-адреса устройств в той же сети, к которой вы подключились)
ip n
Добавить переходные IP-адреса (сбрасываются после перезагрузки) (например, добавить 192.168.140.3/24 к устройству eno16777736)
ip address add 192.168.140.3/24 dev eno16777736
Сохранение изменений конфигурации сети
sudo vi /etc/sysconfig/network-scripts/ifcfg-enoxxx
# затем отредактируйте поля: BOOTPROT, DEVICE, IPADDR, NETMASK, GATEWAY, DNS1 и т.д.
Refresh NetworkManager
sudo nmcli c reload
Перезапустите все интерфейсы
sudo systemctl restart network.service
Для одновременного просмотра имени хоста, ОС, ядра, архитектуры
hostnamectl
Установить имя хоста (установить все переходные, статические, красивые имена хостов сразу)
hostnamectl set-hostname "mynode"
Выяснить веб-сервер (например, Nginx или Apache) веб-сайта
curl -I http://example.com/
# HTTP/1.1 200 OK
# Сервер: nginx
# Date: Thu, 02 Jan 2020 07:01:07 GMT
# Content-Type: text/html
# Content-Length: 1119
# Connection: keep-alive
# Vary: Accept-Encoding
# Last-Modified: Mon, 09 Sep 2019 10:37:49 GMT
# ETag: "xxxxxx"
# Accept-Ranges: bytes
# Vary: Accept-Encoding
Узнайте http код состояния URL-адреса
curl -s -o /dev/null -w "%{http_code}" https://www.google.com
Сокращение сокращенного URL-адреса
curl -s -o /dev/null -w "%{redirect_url}" https://bit.ly/34EFwWC
Проведите тесты пропускной способности сети
# серверная сторона:
$ sudo iperf -s -p 80
# клиентская сторона:
iperf -c <IP-адрес сервера> --parallel 2 -i 1 -t 2 -p 80
Чтобы заблокировать порт 80 (HTTP-сервер) с помощью iptables
sudo iptables -A INPUT -p tcp --dport 80 -j DROP
# блокировать соединение только с IP-адреса
sudo iptables -A INPUT -s <IP> -p tcp -dport 80 -j DROP
Обработка данных
Выведите некоторые слова, которые начинаются с определенной строки (например, слова, начинающиеся с ‘phy’)
# Если файл не указан, используется файл /usr/share/dict/words.
look phy|head -n 10
# phycic
# Phyciodes
# phycite
# Phycitidae
# phycitol
# phyco-
# phycochrom
# phycochromaceae
# phycochromaceous
# фикохром
Повторите печать строки n раз (например, напечатайте “hello world” пять раз)
printf 'hello world\n%.0s' {1..5}
Не выводить эхом завершающую новую строку
username=`echo -n "bashoneliner"`
Копирование файла в несколько файлов (например, копирование файлаА в файл(B-D))
tee <fileA fileB fileC fileD >/dev/null
Удалить все непечатные символы
tr -dc '[:print:]' < имя файла
Удалить новую строку / следующую строку
tr --delete '\n' <input.txt >output.txt
Заменить новую строку
tr '\n' ' ' <filename
В прописные/строчные буквы
tr /a-z/ /A-Z/
Перевести диапазон символов (например, заменить a-z на a)
echo 'something' |tr a-z a
# aaaaaaaaaaa
Сравнить два файла (например, файлА, файлВ)
diff fileA fileB
# a: добавлено; d:удалено; c:изменено
# или
sdiff fileA fileB
# слияние различий файлов по бокам
Сравните два файла, удалите возврат каретки/следующую строку (например, fileA, fileB)
diff fileA fileB --strip-trailing-cr
Найти общие/различающиеся строки
# имея два отсортированных и унифицированных файла (например, после выполнения команды `$ sort -uo fileA fileA` и то же самое для файлаB):
# ---
# fileA:
# ---
# joey
# котенок
# поросёнок
# щенок
# ---
# fileB:
# ---
# теленок
# птенец
# мальчик
# щенок
#
# Найдите строки в обоих файлах
comm -12 fileA fileB
# joey
# щенок
#
# Найдите строки в файлеB, которые НЕ находятся в файлеA
comm -13 fileA fileB
# теленок
# птенец
#
# Найдите строки в файлеА, которые НЕ находятся в файлеВ
comm -23 fileA fileB
# котенок
# поросёнок
Номер файла (например, fileA)
nl fileA
#or
nl -nrz fileA
# добавить ведущие нули
#or
nl -w1 -s ' '
# упростить, отделить пустые строки
Объедините два файла по полям с помощью табуляции (по умолчанию объединение происходит по первому столбцу обоих файлов, а разделителем по умолчанию является пробел)
# файлА и файлВ должны иметь одинаковый порядок строк.
join -t '\t' fileA fileB
# Объединить, используя указанное поле (например, столбец 3 файлаА и столбец 5 файлаВ)
join -1 3 -2 5 fileA fileB
Объединить/вставить два или более файлов в колонки (например, fileA, fileB, fileC)
paste fileA fileB fileC
# default tab separate
Группировка/объединение строк в одну строку
# например.
# AAAA
# BBBB
# CCCC
# DDDD
cat filename|paste - -
# AAAABBBB
# CCCCDDDD
cat filename|paste - - - - - -
# AAAABBBBBCCCCDDDDDD
Fastq в fasta (fastq и fasta - распространенные форматы файлов для данных последовательности в биоинформатике)
cat file.fastq | paste - - - - - | sed 's/^@/>/g'| cut -f1-2 | tr '\t' '\n' >file.fa
Обратная строка
echo 12345| rev
Генерирование последовательности 1-10
seq 10
Найдите среднее значение входного списка/файла целых чисел
i=`wc -l filename|cut -d ' ' -f1`; cat filename| echo "scale=2;(`paste -sd+`)/"$i|bc
Сгенерируйте все комбинации (например, 1,2)
echo {1,2}{1,2}
# 1 1, 1 2, 2 1, 2 2
Сгенерируйте все комбинации (например, A,T,C,G)
set = {A,T,C,G}
группа = 5
for ((i=0; i<$group; i++));do
repetition=$set$repetition;done
bash -c "echo "$repetition""
Чтение содержимого файла в переменную
foo=$(<test1)
Вывод размера переменной
echo ${#foo}
Эхо табуляции
echo -e ' \t '
Разделить файл на меньший файл
# Разделение по строкам (например, 1000 строк/большой файл)
split -d -l 1000 bigfile.txt
# Разделение по байтам без разрыва строк между файлами
split -C 10 bigfile.txt
Создайте большое количество фиктивных файлов (например, 100000 файлов, по 10 байт каждый)
#1. Создайте большой файл
dd if=/dev/zero of=bigfile bs=1 count=1000000
#2. Разделите большой файл на 100000 10-байтовых файлов
split -b 10 -a 10 bigfile
Переименуйте все файлы (например, удалите ABC из всех .gz файлов)
rename 's/ABC//' *.gz
Удалить расширение файла (например, удалить .gz из файла filename.gz)
basename filename.gz .gz
zcat filename.gz> $(basename filename.gz .gz).unpacked
Добавьте расширение файла ко всем файлам (например, добавьте .txt)
rename s/$/.txt/ *
# Вы можете использовать команду rename -n s/$/.txt/ * для проверки результата, она выведет только что-то вроде этого:
# rename(a, a.txt)
# rename(b, b.txt)
# rename(c, c.txt)
Выдавливание повторяющихся паттернов (например, /t/t –> /t)
tr -s "/t" < имя файла
Не печатать следующую строку с помощью echo
echo -e 'текст здесь \c'
Просмотр первых 50 символов файла
head -c 50 file
Вырезать и получить последний столбец файла
cat file|rev | cut -d/ -f1 | rev
Добавление единицы к переменной/увеличение/ i++ числовой переменной (например, $var)
((var++))
# или
var=$((var+1))
Вырежьте последний столбец
cat filename|rev|cut -f1|rev
Кошка в файл
cat >myfile
позвольте мне добавить кое-что
выход по control + c
^C
Очистить содержимое файла (например, имя файла)
>filename
Добавить в файл (например, hihi)
echo 'hihi' >>filename
Работа с json данными
#установите полезный пакет jq
#sudo apt-get install jq
#Например, чтобы получить все значения ключа 'url', просто передайте json в следующую команду jq (вы можете использовать .[]. для выбора внутреннего json, т.е. jq '.[].url')
cat file.json | jq '.url'
Десятичная система счисления в двоичную (например, получить двоичное число 5)
D2B=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
echo -e ${D2B[5]}
#00000101
echo -e ${D2B[255]}
#11111111
Оберните каждую строку ввода, чтобы она поместилась в указанную ширину (например, 4 целых числа на строку)
echo "00110010101110001101" | fold -w4
# 0011
# 0010
# 1011
# 1000
# 1101
Сортировка файла по столбцам с сохранением исходного порядка
sort -k3,3 -s
Выравнивание столбца по правому краю (выравнивание по правому краю 2-го столбца)
cat file.txt|rev|column -t|rev
Для просмотра и сохранения вывода
echo 'hihihihi' | tee outputfile.txt
# используйте '-a' с tee для добавления в файл.
Показать непечатные символы (Ctrl) с помощью cat
cat -v имя файла
Преобразование табуляции в пробел
расширить имя файла
Преобразование пробела в табуляцию
раскрыть имя файла
Отображение файла в восьмеричной системе счисления (вы также можете использовать od для отображения шестнадцатеричной, десятичной и т.д.)
od имя файла
Перевернуть файл в формате cat
tac имя файла
Обратный результат от uniq -c
while read a b; do yes $b |head -n $a ;done <test.txt
Другие
Опишите формат и характеристики файлов изображений
определить myimage.png
#myimage.png PNG 1049x747 1049x747+0+0 8-bit sRGB 1.006MB 0.000u 0:00.000
Bash auto-complete (например, показывать варианты “now tomorrow never”, когда вы нажимаете ‘tab’ после ввода “dothis”)
complete -W "now tomorrow never" dothis
# ~$ dothis
# никогда сейчас завтра
# нажмите 'tab' снова для автозаполнения после ввода 'n' или 't'
Отображает календарь
# выведите текущий месяц, сегодняшний будет выделен.
cal
# October 2019
# Su Mo Tu We Th Fr Sa
# 1 2 3 4 5
# 6 7 8 9 10 11 12
# 13 14 15 16 17 18 19
# 20 21 22 23 24 25 26
# 27 28 29 30 31
# отображать только ноябрь
cal -m 11
Преобразуйте шестнадцатеричное значение контрольной суммы MD5 в его base64-кодированный формат
openssl md5 -binary /path/to/file| base64
# NWbeOpeQbtuY0ATWuUeumw==
Заставляет приложения использовать язык по умолчанию для вывода
export LC_ALL=C
# для возврата:
unset LC_ALL
Кодирование строк как строк Base64
echo test|base64
#dGVzdAo=
Получение родительского каталога текущего каталога
dirname `pwd`
Чтение .gz файла без извлечения
zmore имя файла
# или
zless filename
Выполнение команды в фоновом режиме, вывод файла ошибок
some_commands &>log &
# или
some_commands 2>log &
# или
some_commands 2>&1| tee logfile
# или
some_commands |& tee logfile
# или
some_commands 2>&1 >>outfile
#0: стандартный ввод; 1: стандартный вывод; 2: стандартная ошибка
Выполнение нескольких команд в фоновом режиме
# запускать последовательно
(sleep 2; sleep 3) &
# выполнять параллельно
sleep 2 & sleep 3 &
Запуск процесса даже при выходе из системы (невосприимчивость к зависаниям, с выводом на не-tty)
# Например, запустите myscript.sh даже при выходе из системы.
nohup bash myscript.sh
Отправка почты
echo 'вот содержимое'| mail -a /path/to/attach_file.txt -s 'mail.subject' me@gmail.com
# используйте флаг -a для установки отправки от (-a "From: some@mail.tld")
Преобразование .xls в csv
xls2csv имя файла
Сделать звук BEEP
speaker-test -t sine -f 1000 -l1
Установите длительность звукового сигнала
(speaker-test -t sine -f 1000) & pid=$!;sleep 0.1s;kill -9 $pid
Редактирование своей истории
история -w
vi ~/.bash_history
history -r
#or
history -d [номер_строки]
Взаимодействие с историей
# список 5 предыдущих команд (аналогично `history |tail -n 5`, но не выводит саму команду history)
fc -l -5
Удаление текущей команды bash
Ctrl+U
# или
Ctrl+C
# или
Alt+Shift+#
# чтобы перейти к истории
Добавить что-то в историю (например, “addmetohistory”)
# addmetodistory
# просто добавьте "#" перед~~.
Получить имя файла последней истории/записи
head !$
Очистить экран
clear
# или просто Ctrl+l
Резервное копирование с помощью rsync
rsync -av filename filename.bak
rsync -av directory directory.bak
rsync -av --ignore_existing directory/ directory.bak
rsync -av --update directory directory.bak
rsync -av directory user@ip_address:/path/to/directory.bak
# пропускать файлы, которые новее на приемнике (я предпочитаю этот вариант!)
Сделайте все каталоги за один раз
mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat}
# -p: сделать родительский каталог
# это создаст project/doc/html/; project/doc/info; project/lib/ext и т.д.
Выполняйте команду, только если другая команда возвращает нулевой статус выхода (хорошо сделано)
cd tmp/ && tar xvf ~/a.tar
Выполнение команды только в том случае, если другая команда возвращает ненулевой статус выхода (не закончено)
cd tmp/a/b/c ||mkdir -p tmp/a/b/c
Используйте обратную косую черту “", чтобы прервать длинную команду
cd tmp/a/b/c \
> || \
>mkdir -p tmp/a/b/c
Перечислите тип файла (например, /tmp/)
file /tmp/
# tmp/: каталог
Написание сценария Bash (‘#!’ называется shebang )
#!/bin/bash
file=${1#*.}
# удалить строку перед "."
Python простой HTTP сервер
python -m SimpleHTTPServer
# или при использовании python3:
python3 -m http.server
Чтение пользовательского ввода
чтение ввода
echo $input
Массив
declare -a array=()
# или
declare array=()
# или ассоциативный массив
declare -A array=()
Отправить каталог
scp -r directoryname user@ip:/path/to/send
Fork bomb
# Не пытайтесь сделать это дома!
# Это функция, которая вызывает себя дважды при каждом вызове, пока не закончатся системные ресурсы.
# '# ' добавляется спереди для безопасности, удалите его, когда будете серьезно тестировать.
# :(){:|:&};:
Используйте последний аргумент
!$
Проверка последнего кода выхода
echo $?
Извлечение .xz
unxz filename.tar.xz
# тогда
tar -xf filename.tar
Разархивируйте файл tar.bz2 (например, file.tar.bz2)
tar xvfj file.tar.bz2
Разархивировать файл tar.xz (например, file.tar.xz)
unxz file.tar.xz
tar xopf file.tar
Извлечь по пути
tar xvf -C /path/to/directory filename.gz
Запилить содержимое каталога, не включая сам каталог
# Сначала перейдите в каталог, затем запустите:
zip -r -D ../myzipfile .
# Вы увидите myzipfile.zip в родительском каталоге (cd ...)
Выводим y/n несколько раз, пока не будет убит
# 'y':
yes
# или 'n':
yes n
# или 'anything':
да что угодно
# передайте yes в другую команду
yes | rm -r big_directory
Мгновенно создайте большой фиктивный файл определенного размера (например, 10GiB)
fallocate -l 10G 10Gigfile
Создать фиктивный файл определенного размера (например, 200мб)
dd if=/dev/zero of=//dev/shm/200m bs=1024k count=200
# или
dd if=/dev/zero of=//dev/shm/200m bs=1M count=200
# Стандартный вывод:
# 200+0 записей in
# 200+0 записей на выходе
# 209715200 байт (210 МБ) скопировано, 0.0955679 с, 2.2 ГБ/с
Продолжайте /повторяйте выполнение одной и той же команды (например, повторяйте ‘wc -l filename’ каждые 1 секунду)
watch -n 1 wc -l filename
Выводить команды и их аргументы при выполнении (например, echo expr 10 + 20)
set -x; echo `expr 10 + 20`
Выведите несколько осмысленных предложений (сначала установите fortune)
fortune
Красочная (и полезная) версия top (сначала установите htop)
htop
Нажмите любую клавишу, чтобы продолжить
read -rsp $'Нажмите любую клавишу для продолжения...\n' -n1 key
Выполните sql-подобную команду над файлами из терминала
# download:
# https://github.com/harelba/q
# пример:
q -d "," "select c3,c4,c5 from /path/to/file.txt where c3='foo' and c5='boo'"
Использование Screen для нескольких терминальных сессий
# Создайте сессию и подключите ее:
screen
# Создайте экран и назовите его 'test'
screen -S test
# Создать отделенную сессию foo:
screen -S foo -d -m
# Отсоединенная сессия foo:
screen: ^a^d
# Список сессий:
screen -ls
# Присоединить последнюю сессию:
screen -r
# Прикрепить к сеансу foo:
screen -r foo
# Убить сессию foo:
screen -r foo -X quit
# Прокрутка:
# Нажмите комбинацию префиксов экрана (C-a / control+A), затем нажмите Escape.
# Перемещение вверх/вниз с помощью клавиш со стрелками (↑ и ↓).
# Перенаправить вывод уже запущенного процесса в Screen:
# (C-a / control+A), затем нажмите 'H'.
# Сохранить вывод экрана для Screen:
# Ctrl+A, Shift+H
# Вы найдете файл screen.log в текущем каталоге.
Использование Tmux для нескольких терминальных сессий
# Создайте сессию и подключите ее:
tmux
# Присоединить к сессии foo:
tmux attach -t foo
# Отсоединить сессию foo:
^bd
# Список сессий:
tmux ls
# Присоединить последнюю сессию:
tmux attach
# Убить сессию foo:
tmux kill-session -t foo
# Создать отделенную сессию foo:
tmux new -s foo -d
# Отправьте команду всем панелям в tmux:
Ctrl-B
:setw synchronize-panes
# Некоторые команды управления панелями tmux:
Ctrl-B
# Панели (сплиты), Нажмите Ctrl+B, затем введите следующий символ:
# % горизонтальное разделение
# вертикальное разделение
# o поменять панели местами
# q показать номера панелей
# x - закрыть панель
# пробел - переключение между макетами
# Распределить по вертикали (ряды):
select-layout even-vertical
# или
Ctrl+b, Alt+2
# Распределить по горизонтали (столбцы):
select-layout even-horizontal
# или
Ctrl+b, Alt+1
# Прокрутка
Ctrl-b, затем \[ затем вы можете использовать обычные навигационные клавиши для прокрутки.
Нажмите q, чтобы выйти из режима прокрутки.
Передайте пароль для ssh
sshpass -p mypassword ssh root@10.102.14.88 "df -h"
Ожидание завершения pid (задания)
wait %1
# или
ждать $PID
wait ${!}
#wait ${!} для ожидания последнего фонового процесса ($! - PID последнего фонового процесса)
Преобразование pdf в txt
sudo apt-get install poppler-utils
pdftotext example.pdf example.txt
Список только директорий
ls -d */
Перечислять по одному файлу в строке
ls -1
# или перечислить все, не игнорируйте записи, начинающиеся с .
ls -1a
Захват/запись/сохранение вывода терминала (захват всего, что вы вводите и выводите)
script output.txt
# начните использовать терминал
# чтобы выйти из экранной сессии (прекратить сохранение содержимого), введите exit.
Перечислите содержимое каталогов в древовидном формате
tree
# перейдите в каталог, который вы хотите перечислить, и введите tree (sudo apt-get install tree)
# output:
# home/
# └── project
# ├── 1
# ├── 2
# ├── 3
# ├── 4
# └── 5
#
# установите каталоги уровней вглубь (например, уровень 1)
tree -L 1
# home/
# └── проект
Установите virtualenv(sandbox) для python
# 1. установите virtualenv.
sudo apt-get install virtualenv
# 2. Создайте каталог (назовите его .venv или любым другим именем) для вашей новой блестящей изолированной среды.
virtualenv .venv
# 3. источник virtual bin
source .venv/bin/activate
# 4. Вы можете проверить, находитесь ли вы теперь внутри песочницы.
type pip
# 5. Теперь вы можете установить ваш пакет pip, здесь requirements.txt - это просто txt-файл, содержащий все пакеты, которые вам нужны. (например, tornado==4.5.3).
pip install -r requirements.txt
# 6. Выйдите из виртуальной среды
деактивировать