Я рад, что вы здесь! Несколько лет назад я занимался биоинформатикой и был поражен этими однословными командами bash, которые намного быстрее, чем мои скучные скрипты, время, сэкономленное благодаря изучению сочетаний клавиш командной строки и сценариев. В последние годы я работаю над облачными вычислениями и продолжаю записывать эти полезные команды здесь. Не все они односложные, но я прилагаю усилия, чтобы сделать их краткими и быстрыми. В основном я использую Ubuntu, Amazon Linux, RedHat, Linux Mint, Mac и CentOS, извините, если команды не работают в вашей системе.
Этот блог будет посвящен простым командам bash для анализа данных и обслуживания системы Linux, которые я приобрел во время работы и экзамена LPIC. Я извиняюсь, что нет подробных ссылок на все команды, но они, вероятно, взяты из уважаемых Google и Stack Overflow.
Английский и bash не являются моим родным языком, пожалуйста, поправьте меня в любое время, спасибо. Если вы знаете другие классные команды, пожалуйста, научите меня!
Вот более стильная версия Bash-Oneliner-ru.
- Terminal Tricks
- Переменные
- Math
- Grep
- Sed
- Awk
- Xargs
- Find
- Условие и цикл
- Time
- Download
- Random
- Xwindow
- System
- Hardware
- Networking
- Data Wrangling
- Другие
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
!!
# запустите предыдущую команду с помощью sudo
sudo !!!
Выполните последнюю команду и измените какой-либо параметр, используя подстановку каретки (например, последняя команда: echo 'aaa' -> повторное выполнение как: echo 'bbb')
#last command: echo 'aaa'
^aaa^bbb
#echo 'bbb'
#bbb
#Обратите внимание, что будет заменен только первый aaa, если вы хотите заменить все 'aaa', используйте ':&' для повторения:
^aaa^bbb^:&
#or
!!:gs/aaa/bbb/
!cat
# или
!c
# запустите cat filename снова
# '*' служит "дикой картой" для расширения имени файла.
/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
var="0050"
echo ${var[@]#0}
#050
{var/a/,}
{var//a/,}
#с grep
test="stringA stringB stringC"
grep ${test// /\\\\\|} file.txt
# превращая пробел в 'или' (\||) в grep
var=HelloWorld
echo ${var,,}
helloworld
cmd="bar=foo"
eval "$cmd"
echo "$bar" # foo
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: 2 5 5
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 10+20 #30
expr 10\*20 #600
expr 30 \> 20 #1 (true)
# Количество десятичных цифр/значащая цифра
echo "scale=2;2/3" | bc
#.66
# Оператор экспоненты
echo "10^2"| bc
#100
# Использование переменных
echo "var=5;--var"| bc
#4
grep = grep -G # базовое регулярное выражение (BRE)
fgrep = grep -F # фиксированный текст, игнорирующий мета-символы
egrep = grep -E # расширенное регулярное выражение (ERE)
pgrep = grep -P # Perl-совместимые регулярные выражения (PCRE)
rgrep = grep -r # рекурсивный
grep -c "^$"
grep -o '[0-9]*
#or
grep -oP '\d*'
grep '[0-9]\{3\}'
# или
grep -E '[0-9]{3}'
# или
grep -P '\d{3}'
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 -w 'target'
#или используя RE
grep '\btarget\b'
# возвращает также 3 строки после совпадения
grep -A 3 'bbo'
# возвращает также 3 строки до совпадения
grep -B 3 'bbo'
# возвращает также 3 строки до и после совпадения
grep -C 3 'bbo'
grep -o 'S.*'
grep -o -P '(?<=w1).*(?=w2)'
grep -v bbo filename
grep -v '^#' file.txt
grep "$myvar" filename
#не забудьте заключить переменную в кавычки!
grep -m 1 bbo filename
grep -c bbo filename
grep -o bbo filename |wc -l
grep -i "bbo" filename
grep --color bbo filename
grep -R bbo /path/to/directory
# или
grep -r bbo /path/to/directory
grep -rh bbo /path/to/directory
grep -rl bbo /path/to/directory
grep 'A\|B\|C\|D'
grep 'A.*B'
grep 'A.B'
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 -oP '\(\K[^\)]+'
grep -o -w "\w\{10\}\-R\w\{1\}"
# \w слово символ [0-9a-zA-Z_] \W не слово символ
grep -d skip 'bbo' /path/to/files/*
sed 1d filename
sed 1,100d filename
sed "/bbo/d" filename
# нечувствительно к регистру:
sed "/bbo/Id" filename
sed -E '/^.{5}[^2]/d'
#aaaa2aaa (вы можете остаться)
#aaaa1aaa (удалить!)
Редактирование infile (редактирование и сохранение в файл), (например, удаление строк с 'bbo' и сохранение в файл)
sed -i "/bbo/d" filename
# например, добавьте >$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
sed -e '1isomething' -e '3isomething'
sed '$s/$/]/' filename
sed '$a\'
sed -e 's/^/bbo/' file
sed -e 's/$/\}\]/' имя файла
sed 's/.\{4\}/&\n/g'
Конкатенировать/комбинировать/объединять файлы с разделителем и следующей строкой (например, разделять ",")
sed -s '$a,' *.json > all.json
sed 's/A/B/g' filename
Подстановка с подстановочным знаком (например, заменить строку, начинающуюся с aaa= на aaa=/my/new/path)
sed "s/aaa=.*/aaa=\/my\/new\/path/g"
sed -n '/^@S/p'
sed '/bbo/d' filename
sed -n 500,5000p filename
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'
sed -n -e '123p'
sed -n '10,33p' <filename
sed 's=/=/=\\\\/=g'
sed 's/A-.*-e//g' filename
sed '$ s/.$//'
sed -r -e 's/^.{3}/&#/' file
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}'
awk '$1~/,/ {print}'
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
awk 'BEGIN{OFS="\t"}$3="chr»$3’
awk '!/bbo/' file
awk 'NF{NF-=1};1' файл
# Например, есть два файла:
# 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
# Например, есть два файла:
# 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
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:https://stackoverflow.com/questions/33408762/bash-turning-single-comma-separated-column-into-multi-line-string
awk '{s+=$1}END{print s/NR}'
awk '$1 ~ /^Linux/'
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 -d\t
ls|xargs -L1 -p head
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 . -name "*.html"|xargs rm
# при использовании обратного знака
rm ``find . -name "*.html"`
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
ls |head -100|xargs -I {} mv {} d1
time echo {1..5} |xargs -n 1 -P 5 sleep
# намного быстрее, чем:
time echo {1..5} |xargs -n 1 sleep
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: сохранить детали (например, владельца)
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
cat grep_list |xargs -I{} grep {} filename
grep -rl '192.168.1.111' /etc | xargs sed -i 's/192.168.1.111/192.168.2.111/g'
найти
найти . -type f
найти -type d
find . -name '*.php' -exec sed -i 's/www/w/g' {} \;
# если нет подкаталога
замените "www" "w" - *
# пробел перед *
find mso*/ -name M* -printf "%f\n"
find / -type f -size +4G
find . -name "*.mso" -size -74c -delete.
# M для MB и т.д.
find . -type f -empty
# для дальнейшего удаления всех пустых файлов
find . -type f -empty -delete
find . -type f | wc -l
# цикл 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 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
# Вычитание столбцов из файла (например, файл с 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
прочитать тип;
case $type in
'0')
echo 'how'
;;
'1')
echo 'are'
;;
'2')
echo 'you'
;;
esac
time echo hi
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
sleep $[ ( $RANDOM % 5 ) + 1 ]
TMOUT=10
#как только вы установите эту переменную, таймер выхода из системы начнет работать!
#Это запустит команду 'sleep 10' всего на 1 секунду.
timeout 1 sleep 10
at now + 1min # единицами времени могут быть минуты, часы, дни или недели
предупреждение: команды будут выполняться с помощью /bin/sh
at> echo hihigithub >~/itworks
at> <EOT> # нажмите Ctrl + D для выхода
задание 1 at Wed Apr 18 11:16:00 2018
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:https://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:https://www.example.com/$data
if [ ! -s $data ];then
echo "downloading test data..."
wget $url
fi
wget -O filename "http:https://example.com"
wget -P /path/to/directory "http:https://example.com"
Дайте команду curl следовать за любым перенаправлением, пока оно не достигнет конечного пункта назначения
curl -L google.com
sudo apt install pwgen
pwgen 13 5
#sahcahS9dah4a xieXaiJaey7xa UuMeo0ma7eic9 Ahpah9see3zai acerae7Huigh7
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
echo $((RANDOM % 10))
echo $(((RANDOM %10)+1))
X11 GUI-приложения! Вот несколько GUI-инструментов для вас, если вам наскучило окружение, состоящее только из текста.
ssh -X имя_пользователя@ip_адрес
# или настройка через xhost
# --> Установите следующее для Centos:
# xorg-x11-xauth
# xorg-x11-fonts-*
# xorg-x11-utils
xclock
xeyes
xcowsay
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
1. ssh -X имя_пользователя@ip_адрес
2. apt-get install gedit
3. gedit filename.txt
1. ssh -X имя_пользователя@ip_адрес
2. apt-get install evince
3. evince filename.pdf
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
# Вывести историю 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
# Для рекурсивного аудита каталога на предмет изменений (например, 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
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 на серверА, а затем ssh на серверВ с сервераА, используя ключ.
ssh-agent
ssh-add /path/to/mykey.pem
ssh -A <имя пользователя>@<IP_of_serverA>
# Далее можно выполнить ssh на серверB
ssh <имя пользователя>@<IP_of_serverB>
# добавьте следующее в ~/.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 секунду
# обновлять каждую секунду
iostat -x -t 1
iftop -i enp175s0f0
uptime
if [ "$EUID" -ne 0 ]; then
echo "Пожалуйста, запустите это от имени root"
exit 1
fi
chsh -s /bin/sh bonnie
# /etc/shells: действительные оболочки для входа в систему
chroot /home/newroot /bin/bash
# Для выхода из chroot
exit
Отображение состояния файла (размер; время доступа, изменения, модификации и т.д.) файла (например, filename.txt)
stat filename.txt
ps aux
pstree
cat /proc/sys/kernel/pid_max
dmesg
ip add show
# или
ifconfig
runlevel
# или
who -r
init 5
#or
telinit 5
chkconfig -list
# update-rc.d эквивалент chkconfig в ubuntu
cat /etc/*-release
man hier
# Например, проверьте статус службы cron
systemctl status cron.service
# например, остановить службу cron
systemctl stop cron.service
jobs -l
# значение nice регулируется от -20 (наиболее благоприятное) до +19
# чем приятнее приложение, тем ниже приоритет.
# По умолчанию приятность: 10; приоритет по умолчанию: 80
nice -10 ./test.sh
export PATH=$PATH:~/path/you/want
chmod +x filename
# теперь вы можете открыть ./filename, чтобы выполнить его
uname -a
# Проверьте аппаратную платформу системы (x86-64)
uname -i
ссылки www.google.com
useradd имя пользователя
passwd имя пользователя
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 ls
# вывести все опции оболочки
shopt
# для удаления (или остановки) псевдонимов
shopt -u expand_aliases
# для установки (или запуска) псевдонимов
shopt -s expand_aliases
echo $PATH
# список каталогов, разделенных двоеточием
env
unset MYVAR
lsblk
partprobe
ln -s /path/to/program /home/usr/bin
# должен быть полный путь к программе
hexdump -C filename.class
rsh имя_узла
netstat -tulpn
readlink filename
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
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
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
mount
# или
df
cat /etc/passwd
getent passwd| awk '{FS="[:]"; print $1}'
compgen -u
compgen -g
имя пользователя группы
id имя пользователя
# переменная для UID
echo $UID
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
ldd /bin/ls
lastlog
последняя перезагрузка
joe /etc/environment
# отредактируйте этот файл
ulimit -u
nproc -all
1. верх
2. нажмите '1'
jobs -l
service --status-all
shutdown -r +5 "Сервер будет перезапущен через 5 минут. Пожалуйста, сохраните свою работу."
shutdown -c
wall -n hihi
pkill -U имя_пользователя
kill -9 $(ps aux | grep 'имя_программы' | awk '{print $2}')
# Возможно, вам придется установить следующее:
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
1. pip install --user имя_пакета
2. Вам может понадобиться экспортировать ~/.local/bin/ в PATH: export PATH=$PATH:~/.local/bin/
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
sudo yum update --exclude=php*
lsof /mnt/dir
killall pulseaudio
# затем нажмите Alt-F2 и введите pulseaudio
lsscsi
http:https://onceuponmine.blogspot.tw/2017/08/set-up-your-own-dns-server.html
http:https://onceuponmine.blogspot.tw/2017/07/create-your-first-simple-daemon.html
http:https://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
ifconfig eth0 mtu 9000
pidof python
# или
ps aux|grep python
ps -p <PID>
#or
cat /proc/<PID>/status
cat /proc/<PID>/stack
cat /proc/<PID>/stat
# Запустите 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
pvscan
lvextend -L +130G /dev/rhel/root -r
# Добавление -r приведет к росту файловой системы после изменения размера тома.
sudo dd if=~/path/to/isofile.iso of=/dev/sdc1 oflag=direct bs=1048576
sudo dpkg -l | grep <имя_пакета>
sudo dpkg --purge <имя_пакета>
ssh -f -L 9000:targetservername:8088 [email protected] -N
#-f: работать в фоновом режиме; -L: слушать; -N: ничего не делать
#теперь 9000 вашего компьютера подключен к 8088 порту targetservername через 192.168.14.72
#так что вы можете увидеть содержимое targetservername:8088, введя localhost:9000 из вашего браузера.
#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.
# установка
# Он собирает данные каждые 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
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 Источник питания
lsscsi|grep SEAGATE|wc -l
# или
sg_map -i -x|grep SEAGATE|wc -l
lsblk -f /dev/sdb
# или
sudo blkid /dev/sdb
uuidgen
lsblk -io KNAME,TYPE,MODEL,VENDOR,SIZE,ROTA
#где ROTA означает вращающееся устройство / вращающиеся жесткие диски (1 - если истинно, 0 - если ложно)
lspci
# Список информации о сетевой карте
lspci | egrep -i --color 'network|ethernet'
lsusb
# Показать статус модулей в ядре Linux
lsmod
# Добавление и удаление модулей из ядра Linux
modprobe
# или
# Удалить модуль
rmmod
# Вставить модуль
insmod
# Удаленное выяснение состояния питания сервера
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
dig +short www.example.com
# или
хост www.example.com
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
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
# С сервера A:
$ sudo nc -l 80
# затем вы можете подключиться к порту 80 с другого сервера (например, сервера B):
# например, telnet <IP-адрес сервера A> 80
# затем введите что-нибудь на сервере B.
# и вы увидите результат на сервере A!
#заметьте, что некоторым компаниям может не понравиться, что вы используете 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 для более быстрого выполнения
whois google.com
openssl s_client -showcerts -connect www.example.com:443
ip a
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 и т.д.
sudo nmcli c reload
sudo systemctl restart network.service
hostnamectl
hostnamectl set-hostname "mynode"
curl -I http:https://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
curl -s -o /dev/null -w "%{http_code}" https://www.google.com
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
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
# фикохром
printf 'hello world\n%.0s' {1..5}
username=`echo -n "bashoneliner"`
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/
echo 'something' |tr a-z a
# aaaaaaaaaaa
diff fileA fileB
# a: добавлено; d:удалено; c:изменено
# или
sdiff 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
# котенок
# поросёнок
nl fileA
#or
nl -nrz fileA
# добавить ведущие нули
#or
nl -w1 -s ' '
# упростить, отделить пустые строки
Объедините два файла по полям с помощью табуляции (по умолчанию объединение происходит по первому столбцу обоих файлов, а разделителем по умолчанию является пробел)
# файлА и файлВ должны иметь одинаковый порядок строк.
join -t '\t' fileA fileB
# Объединить, используя указанное поле (например, столбец 3 файлаА и столбец 5 файлаВ)
join -1 3 -2 5 fileA fileB
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
seq 10
i=`wc -l filename|cut -d ' ' -f1`; cat filename| echo "scale=2;(`paste -sd+`)/"$i|bc
echo {1,2}{1,2}
# 1 1, 1 2, 2 1, 2 2
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
#1. Создайте большой файл
dd if=/dev/zero of=bigfile bs=1 count=1000000
#2. Разделите большой файл на 100000 10-байтовых файлов
split -b 10 -a 10 bigfile
rename 's/ABC//' *.gz
basename filename.gz .gz
zcat filename.gz> $(basename filename.gz .gz).unpacked
rename s/$/.txt/ *
# Вы можете использовать команду rename -n s/$/.txt/ * для проверки результата, она выведет только что-то вроде этого:
# rename(a, a.txt)
# rename(b, b.txt)
# rename(c, c.txt)
tr -s "/t" < имя файла
echo -e 'текст здесь \c'
head -c 50 file
cat file|rev | cut -d/ -f1 | rev
((var++))
# или
var=$((var+1))
cat filename|rev|cut -f1|rev
cat >myfile
позвольте мне добавить кое-что
выход по control + c
^C
>filename
echo 'hihi' >>filename
#установите полезный пакет jq
#sudo apt-get install jq
#Например, чтобы получить все значения ключа 'url', просто передайте json в следующую команду jq (вы можете использовать .[]. для выбора внутреннего json, т.е. jq '.[].url')
cat file.json | jq '.url'
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
cat file.txt|rev|column -t|rev
echo 'hihihihi' | tee outputfile.txt
# используйте '-a' с tee для добавления в файл.
cat -v имя файла
расширить имя файла
раскрыть имя файла
Отображение файла в восьмеричной системе счисления (вы также можете использовать od для отображения шестнадцатеричной, десятичной и т.д.)
od имя файла
tac имя файла
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
openssl md5 -binary /path/to/file| base64
# NWbeOpeQbtuY0ATWuUeumw==
export LC_ALL=C
# для возврата:
unset LC_ALL
echo test|base64
#dGVzdAo=
dirname `pwd`
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 &
# Например, запустите myscript.sh даже при выходе из системы.
nohup bash myscript.sh
echo 'вот содержимое'| mail -a /path/to/attach_file.txt -s 'mail.subject' [email protected]
# используйте флаг -a для установки отправки от (-a "From: [email protected]")
xls2csv имя файла
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
Ctrl+U
# или
Ctrl+C
# или
Alt+Shift+#
# чтобы перейти к истории
# addmetodistory
# просто добавьте "#" перед~~.
head !$
clear
# или просто Ctrl+l
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
file /tmp/
# tmp/: каталог
#!/bin/bash
file=${1#*.}
# удалить строку перед "."
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
# Не пытайтесь сделать это дома!
# Это функция, которая вызывает себя дважды при каждом вызове, пока не закончатся системные ресурсы.
# '# ' добавляется спереди для безопасности, удалите его, когда будете серьезно тестировать.
# :(){:|:&};:
!$
echo $?
unxz filename.tar.xz
# тогда
tar -xf filename.tar
tar xvfj file.tar.bz2
unxz file.tar.xz
tar xopf file.tar
tar xvf -C /path/to/directory filename.gz
# Сначала перейдите в каталог, затем запустите:
zip -r -D ../myzipfile .
# Вы увидите myzipfile.zip в родительском каталоге (cd ...)
# 'y':
yes
# или 'n':
yes n
# или 'anything':
да что угодно
# передайте yes в другую команду
yes | rm -r big_directory
fallocate -l 10G 10Gigfile
dd if=/dev/zero of=https://dev/shm/200m bs=1024k count=200
# или
dd if=/dev/zero of=https://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
set -x; echo `expr 10 + 20`
fortune
htop
read -rsp $'Нажмите любую клавишу для продолжения...\n' -n1 key
# download:
# https://github.com/harelba/q
# пример:
q -d "," "select c3,c4,c5 from /path/to/file.txt where c3='foo' and c5='boo'"
# Создайте сессию и подключите ее:
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
# Присоединить к сессии 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, чтобы выйти из режима прокрутки.
sshpass -p mypassword ssh [email protected] "df -h"
wait %1
# или
ждать $PID
wait ${!}
#wait ${!} для ожидания последнего фонового процесса ($! - PID последнего фонового процесса)
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/
# └── проект
# 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. Выйдите из виртуальной среды
деактивировать