-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathlinux.txt
3959 lines (3260 loc) · 293 KB
/
linux.txt
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
-
Заметки по работе с системными командами и консольными утилитами Linux
-
- bash
- filesystem
- ln
- zip
- gpg
- api
- curl
- influxdb
- wget
- curlie
- httpie
- json
- jq
- netcheck
- brew
- fx
- jid
- jqp
- xmllint
- dasel
- xq
- htmlq
- yq
- yamllint
- jsonlint
- csv
- sttr
- grep
- ripgrep
- sig
- sed
- awk
- printf
- cut
- rev
- tr
- man
- cheat-sh
- tldr
- debug
- tools
- dust
- find
- exec
- locate
- fd
- bashrc
- fzf
- hstr
- mcfly
- compgen
- cron
- systemctl
- systemctl-tui
- unit
- journalctl
- dmesg
- hardware
- sysctl
- limits
- quota
- fetch
- networkmanager
- wireless
- networking
- netplan
- ip
- net-tools
- networkd
- ss
- dns
- resolv
- resolved
- dig
- mtr
- doggo
- vnstat
- netcat
- socket api
- socket proxy
- proxy
- nmap
- masscan
- rustscan
- tcp
- tcpdump
- tshark
- ping
- fping
- netping
- firewall
- ufw
- show
- firewalld
- iptables
- nftables
- ssh
- keygen
- x11
- scp
- sshpass
- sudoers
- strace
- apt
- snap
- dpkg
- ntp
- time
- language
- timesyncd
- ntpd
- top
- htop
- bpytop
- atop
- iftop
- iotop
- top other
- ps
- kill
- procs
- jobs
- nohub
- mem
- fincore
- lspage
- lsof
- descriptor
- vmstat
- sysstat
- iostat
- mpstat
- pidstat
- stress
- stress-ng
- smart
- smartmontools
- sensors
- badblocks
- hdparm
- disk
- parted
- fdisk
- sfdisk
- swap
- lvm
- md
- tgt
- dd
- backup
- iso
- rdiff
- users
- passwd
- chage
- id
- usermod
- profile
- bashrc
- useradd
- adduser
- chmod
- chown
- groups
- usermod
- domain
- realmd
- sssd
- syslog
- server
- client
- zabbix-agent
- ommail
- logrotate
- log
- smb
- cifs
- samba
- client-cifs
- client-samba-client
- recycle
- nfs
- server
- client
- ftp
- ftp-client
- ftps
- rsync
- apache
- api server
- status
- webdav
- haproxy
- keepalive
-
## bash
- Переменные
text="(ip a)" # передает текст
echo $text
ipaddr=$(ip a) # передает вывод команды
echo $ipaddr
echo '$ipaddr' # в одинарных кавычках не происходит подстановка переменных
var=$((5+5))
echo $var
read -p "Enter: " enter # ручной ввод переменной
echo $enter
read -s -p "Enter password: " pass # ввод пароля
echo $pass
echo -e "text\ntext" # экранирование
echo -e "# comment\nparam # comment" > ~/test.txt # записать в файл
cat ~/test.txt | grep -v "^#" # прочитать без комментариев в начале строки
original_value="Это длинная строка, которую нужно сократить до 50 символов."
shortened_value="${original_value:0:50}" # обрезаем до 50 символов
true ; echo $? # код возврата 0 (успех)
false ; echo $? # код возврата 1 (ошибка)
- Массивы
range={1..254} # создать срез от 1 до 254
array=(1 2 3 4 5) # создать массив
array=($(ls /)) # передает вывод команды ($(command)) разделенных через пробел
echo ${array[@]} # отобразить содержимое всего массива (@/*)
echo ${array[0]} # отобразить первый индекс в массиве
echo ${array[-1]} # отобразить последний индекс
echo ${array[@]:1:3} # вывести 3 элемента (срез)
echo ${#array[@]} # отобразить кол-во (#) элементов в массиве
echo ${#array[0]} # отобразить длинну (#) первого элемента в массиве
array[1]="22" # изменить значение по номеру индекса
declare -A dict=(
["key 1"]=1
["key 2"]="text"
)
echo ${dict[key 1]}
echo ${dict[key 2]}
- Цикл for
for ((i=1; i <= 10; i++)); do
echo $i
done
array=($(ls /))
for arr in ${array[@]}; do
echo $arr
done
break # прерывает цикл
continue # прерывает текущую интерацию в цикле и переходит к следующей
array=(1 2 3 4 5)
for var in ${array[@]}; do
if [ $var -gt 4 ]; then
break
elif [ $var -gt 3 ]; then
echo "Last number: $var"
continue
fi
echo "Number: $var"
done
- Цикл while
p=1
while [ $p -le 101 ]; do
# если условие истинно, выполнять цикл в блоке do, пока не станет ложным
echo "Значение переменной: $p"
# ((p++)) # увеличить на +1
# p=$(($p+10)) # прибавлять +10
p+=0 # добавить текст в конец переменной
done
- Построчная передача вывода через pipe
num=0
ps | sed 1d | while read line; do
((num++)) # ((num+=1))
echo "Line $num : $line"
done
- Условия
if [] # если
then # условие истинно
elif [] # дополнительное условие
then # дополнительное условие истинно
else # условие ложно
fi # больше нет условий
-z # строка пуста
-n # строка не пуста
=, (==) # строки равны
!= # строки неравны
-eq # равно
-ne # неравно
-lt, (<) # меньше
-le, (<=) # меньше или равно
-gt, (>) # больше
-ge, (>=) # больше или равно
! # отрицание логического выражения
-a, (&&) # логическое «и» (первая команда исполняется всегда, вторая — только в случае успешного завершения первой)
-o, (||) # логическое «или» (первая команда исполняется всегда, вторая — только в случае неудачного завершения первой)
if [[ -z "$variable" ]]; then
echo "Переменная пустая"
else
echo "Переменная не пустая"
fi
- Функции
function calc {
if [ $2 = "+" ]
then
echo $(( $1 + $3 ))
elif [ $2 = "-" ]
then
echo $(( $1 - $3 ))
fi
}
calc 3 + 2
calc 3 - 2
- Параметры
nano script.sh
#!/bin/bash
if [ -n "$1" -a "$2" ]; then
echo Имя исполняемого файла: $0
echo Первый переданный параметр: $1
echo Второй переданный параметр $2
echo Кол-во переданных параметров: $#
echo Значение последнего переданного параметра: ${!#}
echo Массив: $@
else
echo "Параметры не заданы"
fi
chmod +x script.sh # сделать скрипт исполняемым
bash script.sh 1 2 3 4 5 # передать параметры в скрипт
-e file # проверяет, существует ли файл
-d file # проверяет, существует ли файл, и является ли он директорией
-f file # проверяет, существует ли файл, и является ли он файлом
-r file # проверяет, существует ли файл, и доступен ли он для чтения
-w file # проверяет, существует ли файл, и доступен ли он для записи
-x file # проверяет, существует ли файл, и является ли он исполняемым
-s file # проверяет, существует ли файл, и не является ли он пустым
# Получить список директорий и исполняемых файлов в дочерних директориях
path="/etc/*"
for folder in $path; do
echo "$folder:"
for file in $folder/*; do
if [ -x $file ]; then
echo "- $file"
fi
done
done
- case
read -rsn1 key
case $key in
"1")
echo выполнить действия, если $key равно 1 ;;
"2")
echo выполнить действия, если $key равно 2 ;;
*)
echo выполнить действия по умолчанию, если значение $key не соответствует ни одному условию
;;
esac
## filesystem
file Console-Performance.sh # узнать тип файла (текстовый, исполняемый файл, архив или другой)
stat Console-Performance.sh # узнать размер файла, количество блоков, занятых файлом на диске, количество жестких ссылок, права доступа и временные метки
pwd # текущая директория
ls -lh * # отобразить содержимое каждого подкаталога отдельно
ls -lhaF # отобразить скрытые директории (-a) с точкой и выделит директории (/)
which top # узнать путь до исполняемого файла
stat $(which top) # узнать дату последнего доступа к файлу
cat -n /etc/passwd # просмотр содержимого файла с отображением номеров строк
mkdir # создать директорию
mktemp -d # создать временный файл/каталог (-d)
touch -t 202106222200.15 test.file # создать файл и указать дату создания
cp test.file test.file2 # копировать файла/каталог
mv test.file2 test.file3 # переименовать/переместить файл/каталог
rm -r test.file # удалить каталог с файлами (-r)
### ln
echo "test" > testfile
ln /test/testfile /test/testlink # создать жестку (hard) ссылку, которая указывает на один и тот же inode, т.е. они делят одно и то же физическое местоположение на диске
rm testfile # при удалении одного из файлов не приводит к удалению содержимого, пока существует хотя бы одна жесткая ссылка
ln -s /test/testfile /test/testlink # создать символическую (-s - soft) ссылку, которая ссылается на файл testfile
echo "test" >> testfile # при добавлении в оригинальный файл, все изменения будут отражены в testlink
rm testfile # при удалении исходного файла у ссылки будет ошибка (No such file or directory)
### zip
rar a test.rar filename filename2 # создать архив test.rar и добавить туда два файла (файлы копируются в архив)
unrar x test.rar # разархивировать
zip -r test.zip filename # архивировать (файлы копируются в архив)
unzip test.zip # разархивировать
bzip2 filename # архивировать в filename.bz2 (файлы перепещаются в архив)
bunzip2 filename.bz2 # разархивировать
gzip filename # архивировать в filename.gz (файлы перепещаются в архив)
tar --totals -cvf archive.tar file1 file2 file3 # архивировать три файла
wget https://github.com/librespeed/speedtest-cli/releases/download/v1.0.10/librespeed-cli_1.0.10_linux_amd64.tar.gz # загрузить архив
gunzip librespeed-cli_1.0.10_linux_amd64.tar.gz # извлечь из gz в tar
tar -tf librespeed-cli_1.0.10_linux_amd64.tar # отобразить содержимое архива
tar -xvf librespeed-cli_1.0.10_linux_amd64.tar # разархивировать
./librespeed-cli --help
./librespeed-cli --json
### gpg
gpg -c filename # зашифровать данные
gpg filename.gpg # расшифровать данные
gpg --gen-key # создавать пару ключей (публичный и приватный ключи)
gpg --export -a 'User Name' > publickey.asc # экспорт публичного ключа
gpg --import publickey.asc # импорт на второй стороне
gpg --encrypt --recipient 'Recipient Name' filename # зашифровать данные с использованием публичного ключа получателя, только владелец приватного ключа сможет расшифровать эти данные
gpg --decrypt encryptedfile.gpg # расшифровать данные можно с помощью приватного ключа
gpg --sign filename # подписывать данные с использованием приватного ключа для подтверждения их подлинности и целостности
gpg --verify signedfile.gpg # проверка подписи с использованием публичного ключа отправителя
## api
### curl
curl ifconfig.me # узнать внешний ip
curl -v telnet://192.168.3.100:22 # првоерить доступность порта и отобразить кому он принадлежит
curl -s -o /dev/null http://google.com # подавить весь вывод (статистику --silent и --output)
curl -s -o /dev/null --show-error --fail http://google.com # оставить вывод ошибок
curl http://192.168.3.101:8081/api/ --connect-timeout 5 # задать timeout ожидания ответа в секундах
curl -IL https://github.com/Lifailon/hwstat/archive/refs/tags/hwstat-0.0.8.zip # получить информацию о файле перед скачиванием (--head/--location)
curl -O https://raw.githubusercontent.com/Lifailon/hwstat/rsa/hwstat.sh # скачать файл
curl -o /tmp/hwstat.sh https://raw.githubusercontent.com/Lifailon/hwstat/rsa/hwstat.sh # указать путь
curl -Ik https://192.168.3.104:9443/ # игнорировать ошибку самоподписанного сертификата SSL (--insecure)
curl -u <user:password> https://test.com/endpoint # авторизация
curl -x "http://Proxy:[email protected]:9090" "https://kinozal.tv/rss.xml" # использовать Proxy-сервер
curl --insecure --ssl-reqd "smtps://smtp.yandex.ru" --mail-from "[email protected]" --mail-rcpt "[email protected]" --user "[email protected]" --upload-file out.txt # отправка email через SMTPS (SMTP over SSL/TLS) сервер
### influxdb
ip="192.168.3.104"
db="dbash"
table="icmp_metrics_table"
server="google.com"
host=$(hostname)
date=$(echo $EPOCHREALTIME | sed -E "s/\..+//")"000000000"
ping=$(ping $server -c 1)
loss=$(printf "%s\n" "${ping[@]}" | grep -Eo "[0-9]+%" | sed "s/%//")
if (( $(echo "$loss != 100" | bc) )); then
status="true"
rtt=$(printf "%s\n" "${ping[@]}" | grep rtt | awk -F"/" '{print $5}')
else
status="false"
rtt="0"
fi
curl -i -XPOST "http://$ip:8086/write?db=$db" --data-binary "$table,host=$host,server=$server status=$status,rtt=$rtt $date"
### wget
wget --spider https://download.nextcloud.com/server/releases/nextcloud-21.0.1.tar.bz2 # проверить (--spider) работоспособность URL и узнать размер файла (Length)
wget -O nextcloud.tar.bz2 https://download.nextcloud.com/server/releases/nextcloud-21.0.1.tar.bz2 # скачать с указанным именем (-O)
wget -P /tmp https://download.nextcloud.com/server/releases/nextcloud-21.0.1.tar.bz2 # скачать в указанную директорию (-P)
wget -b -o ~/wget.log https://download.nextcloud.com/server/releases/nextcloud-21.0.1.tar.bz2 # загрузить в фоновом режиме (-b) и записать вывод в лог-файл (-o)
### curlie
curl -sS https://webinstall.dev/curlie | bash # альтернатива curl и httpie (https://github.com/rs/curlie)
curlie get https://jsonplaceholder.typicode.com/posts # возвращает заголовки ответа и отформатированный вывод JSON
curlie get https://jsonplaceholder.typicode.com/posts/1
curlie get https://jsonplaceholder.typicode.com/posts -H "Authorization: Bearer YOUR_TOKEN"
curlie post https://jsonplaceholder.typicode.com/posts -d '{"title": "foo", "body": "bar", "userId": 1}'
### httpie
sudo snap install httpie # HTTP-клиент командной строки (https://github.com/httpie/cli)
https httpie.io/hello
https POST pie.dev/post X-API-Token:123 name=John
## json
### jq
apt install jq # установить jq (https://github.com/jqlang/jq)
nodes=$(curl -s -H "Accept: application/json" https://check-host.net/nodes/ips) # получить список node
echo $nodes | jq # обработка входных данных командой jq (вывод отображается в правильно структурированном формате, а все элементы подсвечиваются соответствующим цветом)
echo $nodes | jq '.nodes | length' # количество дочерних объектов в блоке node[]
echo $nodes | jq -r .nodes[1] # получить значение второго объекта массива в формате raw string (not JSON)
echo $nodes | jq -r .nodes[-1] # получить значение последнего объекта массива
hosts=$(curl -s -H "Accept: application/json" https://check-host.net/nodes/hosts) # получить список всех хостов
echo $hosts | jq -r '.nodes | to_entries[].key' # получить список всех вложенных ключей (адреса хостов) из объека (не является массивом)
echo $hosts | jq -r '.nodes | to_entries[].value' # получить только значения всех вложанных ключей
echo $hosts | jq '.nodes."bg1.node.check-host.net"' # получить значение дочернего ключа nodes по имени
echo $hosts | jq '.nodes | [.[]] | last' # преобразовать отдельные объекты внутри nodes в массив, и передать полученный вывод в функцию last для получения значений последнего объекта
echo $hosts | jq '.nodes | to_entries[].value.location[0] == "ru"' # проверить каждый элемент объекта в условии на true/false (вернет массив)
echo $hosts | jq '.nodes | to_entries[] | {Host: .key, Country: .value.location[1], City: .value.location[2]}' # получить данные key-value из объекта nodes и пересобрать массив с новыми значениями ключей
echo $hosts | jq -r '.nodes | to_entries[] | "\(.key) (\(.value.location[1]), \(.value.location[2]))"' # собрать массив строки из содержимого ключей
var="-" && echo $hosts | jq --arg v "$var" -r '.nodes | to_entries[] | "\(.key) \($v) \(.value.location[1]) \($v) \(.value.location[2])"' # передать внешнюю переменную, которая будет использоваться внутри запроса
echo $hosts | jq -r '.nodes | to_entries[] | select(.value.location[0] == "ru") | .key' # произвести фильтрацию (select), что бы получить только нужные объекты
echo $hosts | jq '.nodes | to_entries[] | select(.value.location[0] != "ru") | .key' # вывести объекты, которые не равны значению
echo $hosts | jq '.nodes | length' # вывести общее количество объектов
echo $hosts | jq '.nodes | to_entries | map(select(.value.location[0] != "ru")) | length' # создать массив функцией map() (объеденяет отдельные объекты {}{} группируются в один массив [{},{}]) только из тех объектов, которые соответствуют условию select() и вывести количество найденных объектов
echo $hosts | jq -r '.nodes | to_entries[] | select(.value.location[0] == "ru" or .value.location[0] == "tr") | .key' # проверить два условия через or или and (для проверяемого типа данных int кавычки не используются)
echo $hosts | jq -r '.nodes | to_entries[] | select(.key | index("jp")) | .key' # вывести список хостов региона Japan, которые в названии ключа содержат ключевое слово jp (частичное совпадение в значении)
host="yandex.ru"
protocol="ping"
host="yandex.ru:443"
protocol="tcp" # udp/http/dns
# Забрать id для получения результатов
check_id=$(curl -s -H "Accept: application/json" "https://check-host.net/check-$protocol?host=$host&max_nodes=3" | jq -r .request_id)
# Функция получения результатов проверки по id
function check-result {
curl -s -H "Accept: application/json" https://check-host.net/check-result/$1 | jq .
}
# Получить суммарное количество хостов, с которых производится проверка
hosts_length=$(check-result $check_id | jq length)
while true; do
check_result=$(check-result $check_id)
# Забираем результат и проверем, что содержимое всех проверок не равны null
check_values_not_null=$(echo $check_result | jq -e 'to_entries | map(select(.value != null)) | length')
if [[ $check_values_not_null == $hosts_length ]]; then
echo $check_result | jq
break
fi
sleep 1
done
echo '{"iso": [{"name": "Ubuntu", "size": 4253212899}, {"name": "Debian", "size": 3221225472}]}' | jq '.iso[] | {name: .name, size: (.size / 1024 / 1024 / 1024 | tonumber * 100 | floor / 100 | tostring + " GB")}' # получить ГБ из байт и округлить вывод до 2 символом после запятой
echo '{"iso": [{"name": "Ubuntu", "progress": 0.333}]}' | jq '.iso[] | {name: .name, progress: (.progress * 100 | floor / 100 * 100 | tostring + " %")}' # получить процент из дробной части (33%)
echo '[{"name": "Ubuntu", "added_on": 1625072400}, {"name": "Debian", "added_on": 1625158800}]' | jq '.[] | {name: .name, date: (.added_on + 3 * 3600 | strftime("%H:%M:%S %d.%m.%Y"))}' # получить дату
### netcheck
sudo curl -s https://raw.githubusercontent.com/Lifailon/Check-Host/rsa/netcheck/netcheck.sh -o /usr/bin/netcheck
sudo chmod +x /usr/bin/netcheck
netcheck -t ping yandex.ru
netcheck -n
netcheck -t ping yandex.ru ru1.node.check-host.net
netcheck -t dns yandex.ru
netcheck -t http yandex.ru:443 5
netcheck -t tcp yandex.ru:443
### brew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # установить менеджер пакетов brew (https://github.com/Homebrew/brew) для macOS/Linux
echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> ~/.profile
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
brew --version
### fx
brew install fx || snap install fx # установить fx (https://github.com/antonmedv/fx) TUI интерфейс для JSON на GoLang
hosts=$(curl -s -H "Accept: application/json" https://check-host.net/nodes/hosts)
echo $hosts | fx # доступна навигация с раскрытием блоков и отображает ключи доступа для jq
source <(fx --comp bash) # добавить autocomplete в интерпритатор bash
echo $hosts > hosts.json
fx hosts.json .nodes .\[\"ru1.node.check-host.net\"\] .ip # происходит автоматический вывод ключей и подстановка
### jid
brew install jid # установить jid (https://github.com/simeji/jid) для интерактивной фильтрации JSON данных с использованием автозавершения на GoLang
echo '{"info":{"date":"2016-10-23","version":1.0},"users":[{"name":"simeji","uri":"https://github.com/simeji","id":1},{"name":"simeji2","uri":"https://example.com/simeji","id":2},{"name":"simeji3","uri":"https://example.com/simeji3","id":3}],"userCount":3}}' | jid # .users[1].uri
### jqp
brew install noahgorstein/tap/jqp # установить jqp (https://github.com/noahgorstein/jqp) TUI интерфейс для отображения jq запросов на GoLang
curl -s https://api.github.com/repos/Lifailon/PS-Commands/contents | jqp # слева отображается исходный файл, справа отфильтрованный вывод
curl -s https://check-host.net/nodes/hosts | jqp # пример для фильтрации: .nodes | to_entries[] | select(.value.location[0] == "ru") | .key
### xmllint
apt-get install libxml2-utils || snap install libxml2 || brew install libxml2
curl -s https://kinozal.tv/rss.xml -x kinozal:[email protected]:9090 | xmllint --xpath '//rss/channel/item/link/text()' -
curl -s https://kinozal.tv/rss.xml -x kinozal:[email protected]:9090 | xmllint --xpath '//rss/channel/item[1]/link/text()' -
### dasel
brew install dasel # установить dasel (https://github.com/TomWright/dasel) для обработки JSON, YAML, TOML, XML и CSV (поддерживает преобразование между форматами) на GoLang
echo '{"name": "Tom"}' | dasel -r json 'name'
echo '{"name": "Tom"}' | dasel -r json -w yaml # конвертировать json в yaml
echo '{"name": "Tom"}' | dasel -r json -w xml # конвертировать json в xml
echo '{"name": "Tom"}' | dasel put -r json -t string -v '[email protected]' 'email' # добавить свойство
echo '{"email": "[email protected]","name": "Tom"}' | dasel delete -r json '.email' # удалить свойство
tee users.json <<EOF
{
"users": [
{
"name": "Иван Иванов",
"email": "[email protected]"
},
{
"name": "Мария Петрова",
"email": "[email protected]"
}
]
}
EOF
dasel -f users.json -r json ".users.[0].email"
tee users.yaml <<EOF
users:
- name: Иван Иванов
email: [email protected]
- name: Мария Петрова
email: [email protected]
EOF
dasel -f users.yaml -r yaml ".users.[1].email"
tee users.toml <<EOF
[[users]]
name = "Иван Иванов"
email = "[email protected]"
[[users]]
name = "Мария Петрова"
email = "[email protected]"
EOF
dasel -f users.toml -r toml ".users.[1].email"
tee users.xml <<EOF
<users>
<user>
<name>Иван Иванов</name>
<email>[email protected]</email>
</user>
<user>
<name>Мария Петрова</name>
<email>[email protected]</email>
</user>
</users>
EOF
dasel -f users.xml -r xml ".users.user.[0].email"
### xq
apt-get install xq || brew install xq # установить xq (https://github.com/sibprogrammer/xq) для XML и HTML на GoLang
curl -s https://kinozal.tv/rss.xml -x kinozal:[email protected]:9090 | xq -nx /rss/channel/item # вывод содержимого дочерних элементов с тегами
curl -s https://kinozal.tv/rss.xml -x kinozal:[email protected]:9090 | xq -x /rss/channel/item/link # вывести только содержимое (массив ссылок)
curl -s https://kinozal.tv -x kinozal:[email protected]:9090 | xq -nq "head" # вывести блок head целиком (с тегами)
curl -s https://kinozal.tv -x kinozal:[email protected]:9090 | xq -q "head" # вывести только текст из дочерних элементов выбранного тега (содержимое title)
curl -s https://kinozal.tv/browse.php?s=the+rookie -x kinozal:[email protected]:9090 | xq -nq "body > div > div > div > div > table > tbody > tr > td"
curl -s -X POST -u "Login:Password" "http://localhost:9091/transmission/rpc" | xq -q a -a href # забрать X-Transmission-Session-Id для дальнейших запросов к API (обратиться к тэгу a и атрибуту href)
### htmlq
brew install htmlq # установить htmlq (https://github.com/mgdm/htmlq) line jq for HTML
curl -s https://kinozal.tv/browse.php?s=the+rookie -x kinozal:[email protected]:9090 | htmlq table tr td a -t # получить содержимое таблицы (вывести только текст содержимого)
curl -s https://kinozal.tv/browse.php?s=the+rookie -x kinozal:[email protected]:9090 | htmlq table tr td a -a href # получить только ссылки
curl -s -X POST -u "Login:Password" "http://localhost:9091/transmission/rpc" | htmlq a -a href # забрать X-Transmission-Session-Id для дальнейших запросов к API (обратиться к тэгу a и атрибуту href)
### yq
snap install yq || pip install yq # установить yq (https://github.com/kislyuk/yq) для YAML/XML/TOML на Python
cat /etc/netplan/*.yaml | yq .network.ethernets # список адаптеров netplan
cat /etc/netplan/*.yaml | yq .network.ethernets.eth0.nameservers.addresses[] # вывести массив dns адресов, настроенные на адаптере
curl -s https://kinozal.tv/rss.xml -x kinozal:[email protected]:9090 | yq -p xml .rss.channel.item[1].link # вывести ссылку из первого элемента
curl -s https://raw.githubusercontent.com/JingWangTW/dark-theme-editor/main/hugo.toml | yq -p toml .params.footer.socialLink # прочитать конфигурацию Hugo
### yamllint
apt install yamllint # установить yamllint (https://github.com/adrienverge/yamllint) для проверки синтаксических ошибки YAML-файла на Python
yamllint /etc/netplan/*.yaml
### jsonlint
apt-get install -y nodejs # установить Node.js
npm install jsonlint -g # установить jsonlint (https://github.com/zaach/jsonlint) для проверки синтаксических ошибок JSON
echo '{"name":"example","value":"test",}' | jsonlint
echo '{"name":"example","value":"test"}' | jsonlint
### csv
brew install csvlens # установить csvlens (https://github.com/YS-L/csvlens) для взаимодестия в csv через TUR на Rust
pwsh -Command "Get-Process | ConvertTo-Csv | Out-File process.csv"
csvlens process.csv
### sttr
snap install sttr # установить sttr (https://github.com/abhimanyu003/sttr) для конвертации и работы данными на GoLang
curl -s curl -s -H "Accept: application/json" https://check-host.net/nodes/hosts | sttr json-yaml # конвертировать JSON в YAML
cat /etc/netplan/*.yaml | sttr yaml-json | jq # конвертировать YAML в JSON
curl -s https://raw.githubusercontent.com/Lifailon/hwstat/rsa/README.md | sttr markdown-html # конвертировать Markdown в HTML
echo "test" | sttr hex-encode # кодировать в HEX формат
echo "74657374" | sttr hex-decode # декодировать HEX
echo "Test" | sttr upper # поднять регистр (TEST)
echo "Test" | sttr lower # опустить регистр (test)
echo -e "test1\ntest1\ntest2" | sttr unique-lines # получить уникальные строки
echo -e "a\nz\nb" | sttr sort-lines # сортировать строки по алфавиту
echo -e "test1 \ntest2" | sttr remove-newlines # удалить новые строки
echo -e "test1\ntest2" | sttr count-chars # посчитать количество символов
echo -e "test1\ntest2" | sttr count-lines # посчитать количество строк
## grep
cat /var/log/auth.log | grep sshd # логи всех SSH-подключений
cat /etc/passwd | grep -w sys # поиск целого слова, окруженное пробелами (-w)
cat /etc/ssh/sshd_config | grep -win port # не учитывать регистр (-i) и отобразить номера строк (-n)
ss -n | grep -P ":22|:80|:443|:8080" # искать по нескольким шаблонам, использовать Regex (-E)
ss -n | grep -Pc ":22|:80" # вывести кол-во (--count) совпадений
ss -n | grep "192.168.3...:" # поиск любых двух символов (.)
ss -n | grep "192.168.3.*:" # поиск любого кол-ва (*)
cat /etc/ssh/sshd_config | grep -v "#" # вывести значения, не подходящие под критерии поиска (-v)
cat /etc/zabbix/zabbix_agentd.conf | grep -v "^#" # отсеить только в начале строки (^)
cat /etc/zabbix/zabbix_agentd.conf | grep "=$" # найти строки, которые кончаются ($) на символ "=" (получить все параметры)
cat /etc/zabbix/zabbix_agentd.conf | grep -Pv "^$|^#" # удалить пустые строки (^$) и комментарии (^#)
cat /etc/zabbix/zabbix_agentd.conf | grep -E "#+{5}" # регулярное выражение (-E), где последний символ "#" повторяется 5 или более раз
echo -e "Test\ntest\n123-45" | grep -E "[a-zA-Z\-]" # искать только текст (где есть буквы и тире)
echo 'test<version>1.2.3</version>test' | grep -P -o "(?<=<version>).*(?=</version>)" # найти неизвестное значение (.*) между известными и вывести только найденное (-o)
echo "test<version>3.6.4</version>test" | grep -Eo '[0-9.]+' # найти любую цифру и точку на конце, которые повторяются любое кол-во раз подряд
echo $(lshw -class bus) | grep -P -o "(?<=Motherboard product: ).*(?=serial)" # с применение группировки (-P)
zabbix_path=$(systemctl status zabbix-agent | grep -Po "(?<=-c ).*(?=.conf)" | sed "s/$/.conf/") # забрать путь до конфигурационного файла Zabbix агента
cat $zabbix_path | grep -E "^Server=|^ServerActive=" # найти имя сервера
cat $zabbix_path | grep -Po "(?<=^Server=).+" # вывести только имя сервера
resolvectl | grep "DNS Servers" -m 1 # напечатать только первое совпадение (-m int)
networkctl status | grep -A 3 "DNS:" # найти строку и напечатать три строки после нее (-A)
networkctl status | grep -B 3 "DNS:" # найти строку и напечатать три строки до нее (-B)
networkctl status | grep -C 1 "DNS:" # найти строку и напечатать одну строки до нее и одну после (-C)
resolvectl | grep -Ex ".+DNS Servers:.+" # вывести строки с точным совпадение (-x/like), сопоставлять только целые строки
if echo "GET" | grep -Eq "^GET"; then echo da; else echo net; fi # подавлять вывод (-q) для проверки условия
curl https://api.github.com/repos/PowerShell/PowerShell/releases/latest | grep -Eom 1 "https://.+.deb" # забрать только первый подходящий под поиск
### ripgrep
apt-get install ripgrep # установить ripgrep (https://github.com/BurntSushi/ripgrep), аналог grep на Rust
cat /var/log/auth.log | rg sshd # вывести журнал логов аудентификации фильтрацией по названию
cat /var/log/auth.log | rg "Accepted password for \w+ from \d+\.\d+\.\d+\.\d+" # вывести строки, где указано "Accepted password for", далее любое слово (имя пользователя) и IP-адрес в формате x.x.x.x
cat /var/log/auth.log | rg "user \w+\(uid=\d+\)" # вывести строки с текстом user, затем имя пользователя (любое слово), и далее uid с числовым значением в скобках
cat /var/log/auth.log | rg "192\.168\.\d+\.\d+" # вывести строки, где первые два октета соответствуют 192.168
cat /var/log/auth.log | rg "sshd\[\d+\]: .* port \d+" # вывести строки, содержащие sshd с идентификатором процесса (например, "sshd[4188420]"), а затем текст "port" и номер порта.
cat /var/log/auth.log | rg "\b12:\d{2}:\d{2}\b" # фильтрация по времени за последние 12 часов (время начинается с 12:, затем две цифры для минут и две для секунд)
### sig
brew install ynqa/tap/sigrs # установить sig (https://github.com/ynqa/sig) интерактивный grep на Rust
curl -s https://raw.githubusercontent.com/Lifailon/hwstat/rsa/README.md > README.md
cat README.md |& sig -a
## sed
cat /etc/passwd | sed -n "1,5p" # отобразить с первой по пятую строку (p)
cat /etc/passwd | sed "$ d" # удалить (d) последнюю строку
cat /etc/passwd | sed "1,3d" # удалить c первой по третью строку (2,3d)
echo "One 1" | sed "s/One/Two/; s/1/2/" # заменить One на Two и 1 на 2
cat /etc/zabbix/zabbix_agentd.conf | sed "s/127.0.0.1/192.168.3.102/" # > /etc/zabbix/zabbix_agentd.conf # заменить (s) ip-адрес
cat /etc/zabbix/zabbix_agentd.conf | sed "/^#\|^$/d" # удалить пустые строки (^$) и комментарии (^#)
timedatectl | grep zone | sed -E "s/.+zone: //" # удалить любое кол-во лимволов до слова "zone: " включительно, используя Regex (-E/-r)
echo -e "test\ntest" | sed "2s/test/test2/" # заменить во второй строке (2s)
echo -e "test\ntest\ntest\ntest" | sed "2,3s/test/test2/" # заменить во второй и третей строке (2,3s)
echo -e "test\ntest\ntest\ntest" | sed "2ctest2" # заменить вторую строку (2c)
echo "The test and test" | sed "s/test/test2/g" # заменить для каждого совпадения (/global)
echo "The test and test" | sed "s/test/test2/2" # заменить для второго совпадения (/2)
echo "line2" | sed "i\line1" # добавить строку в начало (i)
echo "line1" | sed "a\line2" # добавить строку в конец (a) или в после указанной строки (2a)
echo "11 22 33 34" | sed "y/123/234/" # заменить 1 на 2, 2 на 3, 3 на 4 (y)
ls -R | grep ':' | sed "s/:$//; s/[^\/]*\// - /g" # удалить ":" в конце и заменить вначале строки "/любое кол-во символов между/" на " - " для всех (/g global)
echo "test<version>3.6.4</version>test" | sed -r 's/[^<]*<(.*)>.*/\1/;s/<.*//;s/.*>//' # использовать regex (-r)
ps aux | grep -E "^zabbix .+ -c" | sed -E "s/^zabbix.+-c //" # найти процесс zabbix с ключем -c и оставить путь conf
echo "MPEG-H HEVC, 88.5 Мбит/с, 3840x2160, 23.976 кадр/с, 10 бит" | sed -nr 's/.* ([0-9]+x[0-9]+).*/\1/p' # выводить только найденные строки (-n) с заменой (s/), ищем только цифры [0-9] где одно или более вхождений (+) и между ними "x", вывести только первую группу поиска (то, что в скобках) на печать (/p)
## awk
cat /etc/passwd | awk -F: '{print "name: " $1 " \t Dir: " $NF}' # вывести содержимое первого и последнего ($NF) элемента в строке, используя разделитель ":" и табуляцию (\t)
echo 'one two three four' | awk '{print $(NF-1)}' # вывести содержимое преподследнего элемента
echo 'one two three four five' | awk '{print $((NF/2)+1)}' # вывести содержимое из середины
echo "One Two Three" | awk '{$3="Four"; print $0}' # заменить третье значение/переменную в строке
cat /etc/passwd | awk 'BEGIN{FS=":"; OFS=" - "} {print $1,$7}' # указать разделитель послей (элементов) на вход (FS) и заменить его на выходе (OFS)
uptime | awk 'BEGIN{RS=" "; ORS="\n"} {print $0}' # указать разделитель записей (строк) на входе (RS) и заменить его на выходе (ORS)
echo -e "12345\n54321" | awk 'BEGIN{FIELDWIDTHS="2 3"}{print $1,$2}' # указать фиксированное кол-во символов для разделения
lsof | awk '{if($7=="REG")print $0}' # условие для выборки по столбцу
cat /etc/ssh/sshd_config | awk '/Port / {print $2}' # условие поиска для вывода
cat /etc/ssh/sshd_config | awk 'length $0 > 1' # вывести строки, которые длиннее, чем 1 символ (удалить пустые строки)
cat /var/log/syslog | grep "$date" | awk '{print length($6)}' # вывести длинну значения
awk 'BEGIN{x = "low"; print toupper(x)}' # использовать функцию для перевода в вверхний регистр
awk 'BEGIN{x = "LOW"; print tolower(x)}' # использовать функцию для перевода в нижний регистр
echo "1 2 3 4:5:6" | awk '{item=$4; split(item,array,":"); print array[2]}' # разбить 4 значение на массив (используя функцию split) и забрать значение по 2-му индексу
free | awk '{if (NR == 2) print $0}' # вывести только вторую строку
free | awk '{if (NR >= 2) print $0}' # вывести втроую и последующие строки
free | awk '{if (NF >= 5) print $0}' # вывести строки, где 5 или больше значений
cat /etc/passwd | awk '{ if (NR >= 10 && NR <= 20) print $0}' # вывести с 10 по 20 строки
last | sed -n 1p | awk '$2=" ",$4=" "{print $0}' # вывести все, кроме 2 и 4 значения (заменить)
ps -A | awk '{sum=""; for(i=1;i<=NF;i++) { if (i != 2) {sum=sum" "$i} } print sum}' # вывести все, кроме 2-го значения
## printf
top=$(top -bn1)
printf "%s\n" "${top[@]}" # вывести вывод массива построчно
printf "%.2f \n" 1.1111 # округлить до 2 символов после запятой
printf "%.0f \n" 1.6 # удалить дробную часть (округлить до 2)
printf "Arg1: %s\nArg2: %s\n" "10" "20" # принимает и выводит аргументы (%s) в виде строки
## cut
echo "1 2 3" | cut -c 1,5 # вывести первый и пятый симов (--bytes/--characters)
echo "1 2 3" | cut -c 1-3 # вывести с первой по третий символ
echo "1 2 3" | cut -c3- # удалить первые 2 символа
echo -e "test1,test2,test3\ntest1,test2,test3" | cut -d , -f 2-100 # указать разделитель полей/столбцов (--delimiter) и какие столбцы вывести (--fields) с 2 по 100
echo -e "test1,test2,test3\ntest1,test2,test3" | cut -d , -f 1,3 | sed "s/,/ /" # вывести 1 и 3
echo -e "test1,test2,test3\ntest1 test2 test3" | cut -d , -f 1,3 -s # печатать строки, где есть разделитель (-s)
### rev
echo "D:\plex-content\Rick.and.Morty.S07.2023.WEBDLRip.MegaPeer" | rev | cut -d \\ -f 1 | rev # забрать последний элемент в пути (вначале разворачивает всю строку, забирает первый элемент и разворачивает строку обратно)
echo "D:\plex-content\Rick.and.Morty.S07.2023.WEBDLRip.MegaPeer" | sed -r 's/.+\\//' # удалить все до последнего слеша
echo "D:\plex-content\Rick.and.Morty.S07.2023.WEBDLRip.MegaPeer" | sed 's/.*\\\(.*\)/\1/' # удаляет все до последнего слеша и забирает одну группу захвата, что остается после удаления, и заменяет вывод на первую группу (1)
echo "D:\plex-content\Rick.and.Morty.S07.2023.WEBDLRip.MegaPeer" | awk -F '\\' '{print $NF}' # забрать последний элемент массива (NF)
## tr
echo "10 20 100 200" | tr 1 2 # translate заменяет 1 на 2 для всех подходящих сомволов (20 20 200 200)
echo "1 2 3" | tr " " "," # заменить пробелы на запятые (1,2,3)
echo "1 2 3" | tr -d " " # удалить пробелы (123)
## man
### cheat sh
curl cheat.sh/curl
curl cheat.sh/grep
curl cheat.sh/sed
curl cheat.sh/awk
curl cheat.sh/jq
curl cheat.sh/iptables
curl cheat.sh/find
### tldr
pip3 install tldr # упрощенный вариант man с примерами использования
tldr curl # веб-версия: https://manned.org/man/curl
## debug
trap 'echo "$BASH_COMMAND"' DEBUG # построчная отладка скриптов bash, команда trap перехватывает сигнал DEBUG, посылаемый перед выполнением команды и выводит команду на экран
trap 'echo "$BASH_COMMAND";read' DEBUG # read ожидает ввода с клавиатуры (Enter или Ctrl+C) перед выполнением каждой командой
bash -x script.sh # отладка (печать команд и их аргументов по мере их выполнения)
bash -x -c "ls -l" | grep *.sh | awk '{print $5,$NF}' # запуск команды через интерпритатор bash и вывод отладки
bash --debug script.sh # проверка на ошибки
apt-get install shellcheck # установить shellcheck
shellcheck -S error hwstat.sh # error/warning/info/style
pip3 install thefuck # установить thefuck
bas hwstat.sh # запустить команду с ошибкой
fuck # автоматически исправляет последнюю ошибочную команду из выпадающего списка (up/down)
## tools
pip install toolong
tl /var/log/auth.log # интерактивный просмотр логов в консоли с фильтрацией
tl access.log* --merge # просмотр нескольких файлов
apt install bat # аналог cat (https://github.com/sharkdp/bat) с подсветкой синтаксиса
bat /etc/netplan/*.yaml
tree /var/log/ # древовидный просмотр директорий и дочерних файлов
cargo install --locked broot # установить broot (https://github.com/Canop/broot), аналог tree
broot kinozal-bot/
echo 'deb http://cz.archive.ubuntu.com/ubuntu jammy main universe' >> /etc/apt/sources.list && apt update
apt install exa # установить аналог ls (https://github.com/ogham/exa)
exa $(pwd) -l --icons # отобразить иконки с подсветкой прав доступа
cargo install eza # аналог ls (https://github.com/eza-community/eza) на базе exa
eza -l --icons
eza --tree kinozal-bot/
cargo install lsd # аналог ls (https://github.com/lsd-rs/lsd)
lsd -l kinozal-bot/
column /etc/passwd -t -s ":"
netcheck -t ping yandex.ru us1.node.check-host.net | sed -r 's/"//g; s/,$//; s/\{|\}|\[|\]//' | column -t -s ":" # распарсить JSON и добавить отступ (табуляцию) для колонок
ls /home | wc -l # word count выводит количество строк (--line)
ls /home | wc -w # количество слов (--words)
ls /home | wc -m # количество символом (--chars)
ls /home | wc -c # количество символов/байт (--bytes)
echo "(5.5-2.2)" | bc # математические вычисления
echo "(5.5-2.2)" | bc | sed -E "s/\..+//" # удалить дробную часть
echo "1 < 2" | bc # возвращает булевое значение (1 - да или 0 - нет)
echo "1 > 2" | bc # false (0)
icmp_ignore=$(cat /proc/sys/net/ipv4/icmp_echo_ignore_all) # забрать значение
if (( $(echo "$icmp_ignore == 1" | bc) )); then echo "true"; else echo "false"; fi # проверить в условии арефметическое значение на равенство (возвращает 0 - false или 1 - true)
a=1
b=0.55
echo $(bc <<< "scale=2; $a+$b")
echo "print $a+$b" | perl
echo "print($a+$b)" | python3
echo "print($a+$b)" | lua
echo "puts $a+$b" | ruby
pwsh -Command $a+$b
echo -e "key1\nkey2\nkey3" > 1.txt
echo -e "value1\nvalue2\nvalue3" > 2.txt
paste 1.txt 2.txt -d : # объединяет два файла в один многоколоночный вывод
cat /etc/passwd | paste -s -d + # объеденить (join) многострочный файл, используя указанный delimiter
echo -e "test1\ntest2" > 1.txt
echo -e "test\ntest2\ntest3" > 2.txt
diff 1.txt 2.txt -c # ! есть изменения, + есть новая строка
diff 1.txt 2.txt -yi # сравнивает в две колонки (| есть изменения, + есть новая строка) и игнорировать регистр (-i)
diff 1.txt 2.txt -u # объеденяет два файла в один вывод с отображением изменений (+/)
diff 1.txt 2.txt -ibBEt # не учитывать пробелы (-b) и пустые строки (-B), игнорировать изменения в табуляциях (-E) и заменить табуляции на пробелы в выводе (-t)
diff -c <(echo "$predu") <(echo "$du") # сравнить содержимое переменных
snap install diff-so-fancy
diff -u file-1.txt file-2.txt | diff-so-fancy
apt install jdupes
jdupes . # поиск дубликатов
cat /etc/passwd | sort -r # отсортировать вывод по алфовиту в обратном порядке (-r)
du -h ~ | sort -n # сортировать по арифметическому значению (-n) размер файлов и директорий
ls -l | sed 1d | sort -nk5 # сортировка по пятой колонке (-k)
cat $tmp | sort -t "." -nk4 # сортировать по четвертой колонке, используя разделитель (-t) точку
echo -e "1 2\n1 2\n2 1\n1 2" | uniq # удаляет соседние одинаковые строки
echo -e "1 2\n1 2\n2 1\n1 2" | sort | uniq # удалить все дубликаты
echo -e "1 2\n1 2\n2 1\n1 2" | sort | uniq -c # добавляет в начало каждой строки кол-во повторений
echo -e "1 2\n1 2\n2 1\n1 2" | sort | uniq -u # отобразить только уникальные строки, без строк с повторениями
ls -l | fold -w 50 # задать ширину вывода каждой строки, выпадающее за указанный предел переносится на новую строку
ls -l | fold -w 50 -s # разбивать строки только на символах пробела (--space)
cat /var/log/syslog | head -n 5 # выводит первые 5 строк файла
cat /var/log/syslog | tail -n 5 # просмотр последних 5 строк файла
tail -f /var/log/syslog # просмотр содержимого файла в реальном времени
apt install multitail
multitail -f /var/log/auth.log -f /var/log/kern.log
multitail -l "journalctl -fu ssh" -l "journalctl -fu cron"
less /var/log/dmesg # вывести лог ядра с возможностью пролистывания
watch df -h # выводит на экран и обновляет состояния подключенных устройств каждые 2 секунды
echo "line1" | tee test.txt # перезаписать файл (>)
ls > /dev/null # перенаправить вывод в null
echo "line2" | tee -a test.txt # добавить (>>) текст новой стройокй в конец файла
echo -e "line3\nline4" >> test.txt # добавить две новые строки
du -a /var/log | awk '{print $2}' | xargs fincore # передать вывод первой команды построчно в аргументы следующей
split -l 100 input_file.txt output_prefix # разделить файл на части по 100 строк в каждой
split -b 10M input_file.txt output_prefix # разделить файл на части по указанному размеру (например, 10MB)
yes # предназначена для автоматического вывода строки или символа, повторяющегося бесконечно (для нагрузки системы), либо для автоматического подтверждения запросов в других командах
## dust
snap install dust # аналог du на Rust (https://github.com/bootandy/dust)
dust /home/lifailon # выводит график используемого пространства по директориям и файлам для анализа занятого пространства
dust -s # показывает размер файла, а не объем используемого им дискового пространства
dust -n 30 # выводит 30 каталогов (по умолчанию — высота терминала)
dust -d 3 # показывает 3 уровня подкаталогов
dust -D # отобразить только директории
dust -F # отобразить только файлы
dust -f # считайте файлы вместо дискового пространства
dust -i # не показывать скрытые файлы
dust -z 10M # минимальный размер, включать только файлы размером более 10 МБ
dust -z 40000/30MB/20kib # исключить выходные файлы/каталоги размером менее 40 000 байт/30 МБ/20 КБ
dust -o si/b/kb/kib/mb/mib/gb/gib # формат вывода
dust -e "\.png$" # включать только те файлы, которые соответствуют регулярному выражению (например, только файлы png)
dust -v "\.png$" # регулярное выражение для игнорирования файлов с разрешением png
dust -j | jq # вывод в формате JSON
dust -P # отключить индикатор прогресса
## find
find / -name "*.sql" # найти файлы, начать поиск с корня (/)