grep - "наше фсё"

Инструменты для управления и диагностики системы

Модераторы: Olej, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

grep - "наше фсё"

Непрочитанное сообщение Olej » 13 апр 2021, 21:29

Про grep и регулярные выражения понаписаны тома... нечего тут рассуждать.

Я здесь только практические полезные памятки для себя буду оставлять - то что пригодилось но не очень сразу удаётся найти.
Те опции и случаи, которыми я активно пользуюсь, но временами они забываются... :-(

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: grep - "наше фсё"

Непрочитанное сообщение Olej » 13 апр 2021, 21:36

Очень и очень частая ситуация - нужно найти не только строку (строки) содержащие контекст, но и несколько (N) строк следующих за найденной.
И это делает опция -An
Вот как на моём "ядрёном" :lol: сервере выглядит информация по частотам, а заодно и по размерам кэша:

Код: Выделить всё

olej@R420:~$ cat /proc/cpuinfo | grep 'cpu MHz' -A1
cpu MHz		: 1200.030
cache size	: 15360 KB
--
cpu MHz		: 1199.877
cache size	: 15360 KB
--
cpu MHz		: 1200.116
cache size	: 15360 KB
--
cpu MHz		: 1200.000
cache size	: 15360 KB
--
cpu MHz		: 1244.731
cache size	: 15360 KB
--
cpu MHz		: 1200.344
cache size	: 15360 KB
--
cpu MHz		: 1252.516
cache size	: 15360 KB
--
cpu MHz		: 1199.972
cache size	: 15360 KB
--
cpu MHz		: 1336.749
cache size	: 15360 KB
--
cpu MHz		: 1200.267
cache size	: 15360 KB
--
cpu MHz		: 1232.074
cache size	: 15360 KB
--
cpu MHz		: 1200.214
cache size	: 15360 KB
--
cpu MHz		: 1279.366
cache size	: 15360 KB
--
cpu MHz		: 1199.889
cache size	: 15360 KB
--
cpu MHz		: 1228.880
cache size	: 15360 KB
--
cpu MHz		: 1200.041
cache size	: 15360 KB
--
cpu MHz		: 1269.996
cache size	: 15360 KB
--
cpu MHz		: 1200.030
cache size	: 15360 KB
--
cpu MHz		: 1285.710
cache size	: 15360 KB
--
cpu MHz		: 1199.809
cache size	: 15360 KB
--
cpu MHz		: 1155.861
cache size	: 15360 KB
--
cpu MHz		: 1200.061
cache size	: 15360 KB
--
cpu MHz		: 1230.238
cache size	: 15360 KB
--
cpu MHz		: 1200.113
cache size	: 15360 KB
Поскольку теперь возникли группы строк, в этом случае по 2, но в общем виде при -An - по n+1 - то теперь grep добавляет разделители: "--".

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: grep - "наше фсё"

Непрочитанное сообщение Olej » 13 апр 2021, 21:40

Olej писал(а):
13 апр 2021, 21:36
несколько (N) строк следующих за найденной.
А если мне нужны строки не следующие, а предшествующие контексту поиска?
Пожалуйста! ;-) (опция -B):

Код: Выделить всё

olej@nvme:~$ cat /proc/cpuinfo | grep ^stepping -B3
cpu family	: 6
model		: 158
model name	: Intel(R) Celeron(R) CPU G3930 @ 2.90GHz
stepping	: 9
--
cpu family	: 6
model		: 158
model name	: Intel(R) Celeron(R) CPU G3930 @ 2.90GHz
stepping	: 9

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: grep - "наше фсё"

Непрочитанное сообщение Olej » 14 апр 2021, 12:43

Поиск независимо от малых/больших букв в контексте...
Например, при работе с оборудованием часто требуется разборка с VID:PID ... когда я знаю, например, что производитель (VID, Vendor) NVIDIA - это 10DE:

Код: Выделить всё

olej@nvme:~$ lspci -n | grep -i 10DE
01:00.0 0300: 10de:1287 (rev a1)
01:00.1 0403: 10de:0e0f (rev a1)
То же самое очень часто для USB:

Код: Выделить всё

olej@nvidia:~$ lsusb
Bus 002 Device 003: ID 14cd:168a Super Top 
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 007: ID 05d8:4002 Ultima Electronics Corp. Artec Ultima 2000 (GT6801 based)/Lifetec LT9385/ScanMagic 1200 UB Plus Scanner
Bus 001 Device 006: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 003: ID 0624:0200 Avocent Corp. 
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Тогда:

Код: Выделить всё

olej@nvidia:~$ lsusb | grep -i 1D6B
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Но:

Код: Выделить всё

olej@nvidia:~$ lsusb | grep 1D6B
olej@nvidia:~$ 

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: grep - "наше фсё"

Непрочитанное сообщение Olej » 14 апр 2021, 12:56

Современный grep отлично справляется с UNICODE в кодировке UTF-8, т.е. "разбирается" и в русскоязычных текстах.
Возьмём за пример 2-х строчный (опция -e и управляющий символ \n в строке) образец:

Код: Выделить всё

olej@nvidia:~$ echo -e "ЭТО БОЛЬШИЕ БУКВЫ. \nА это малые буквы"
ЭТО БОЛЬШИЕ БУКВЫ. 
А это малые буквы
А теперь через grep:

Код: Выделить всё

olej@nvidia:~$ echo -e "ЭТО БОЛЬШИЕ БУКВЫ. \nА это малые буквы" | grep буквы
А это малые буквы
В противовес:

Код: Выделить всё

olej@nvidia:~$ echo -e "ЭТО БОЛЬШИЕ БУКВЫ. \nА это малые буквы" | grep -i буквы
ЭТО БОЛЬШИЕ БУКВЫ. 
А это малые буквы

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: grep - "наше фсё"

Непрочитанное сообщение Olej » 02 июн 2022, 10:20

Olej писал(а):
13 апр 2021, 21:36
Очень и очень частая ситуация - нужно найти не только строку (строки) содержащие контекст, но и несколько (N) строк следующих за найденной.
И это делает опция -An
Olej писал(а):
13 апр 2021, 21:40
А если мне нужны строки не следующие, а предшествующие контексту поиска?
Пожалуйста! (опция -B):
Понадобилось, при настройках локализаций для Raspbian OS выделить целый фрагмент, и до и после искомой строки ("xkb") - Raspberry Pi 2 ... снова. Естественно, это достигается объединением опций -B и -A:

Код: Выделить всё

pi@raspberrypi:~/.config/lxpanel/LXDE/panels $ cat ~/.config/lxpanel/LXDE/panels/panel | grep xkb -B1 -A 7
Plugin {
  type=xkb
  Config {
    Model=pc105
    LayoutsList=us,ru
    VariantsList=,
    ToggleOpt=grp:alt_shift_toggle
    KeepSysLayouts=0
  }

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: grep - "наше фсё"

Непрочитанное сообщение Olej » 02 июн 2022, 10:27

Olej писал(а):
13 апр 2021, 21:36
Очень и очень частая ситуация
Нужно оставить только те строки, которые НЕ содержат образца.
Простейший пример - отбраковать в конфигурационных файлах строки комментариев.

Код: Выделить всё

root@raspberrypi:/etc# cat /etc/dphys-swapfile  | grep ^# | wc -l
18
18 строк комментариев.
Отбраковываем (опция -v):

Код: Выделить всё

root@raspberrypi:/etc# cat /etc/dphys-swapfile  | grep -v ^#





CONF_SWAPSIZE=100





Правда осталось ещё куча пустых строк. :oops:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: grep - "наше фсё"

Непрочитанное сообщение Olej » 02 июн 2022, 10:32

Olej писал(а):
02 июн 2022, 10:27
Правда осталось ещё куча пустых строк.
Но пустые строки я могу отфильтровать так:

Код: Выделить всё

root@raspberrypi:/etc# cat /etc/dphys-swapfile  | grep -v ^# | grep -v ^$
CONF_SWAPSIZE=100

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: grep - "наше фсё"

Непрочитанное сообщение Olej » 29 июн 2022, 20:40

Логические операции в grep
1. Операция ИЛИ
...
2. Операция И
...
3. Операция НЕ
...
4. Регулярные выражения
...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: grep - "наше фсё"

Непрочитанное сообщение Olej » 02 янв 2023, 10:35

Olej писал(а):
29 июн 2022, 20:40
1. Операция ИЛИ
Вот как выглядит идентификация в /proc//kallsyms адресов первых 10-ти системных вызовов:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/sys_call_table/call_table$ sudo grep 'ffffffffacecdf00\|ffffffffacece020\|ffffffffacec9bd0\|ffffffffacec7c80\|ffffffffaced2fe0\|ffffffffaced3200\|ffffffffaced30a0\|ffffffffacee6ed0\|ffffffffacecb820\|ffffffffacc36820' /proc//kallsyms 
ffffffffacc36820 T __x64_sys_mmap
ffffffffacec7c80 T __x64_sys_close
ffffffffacec9bd0 T __x64_sys_open
ffffffffacecb820 T __x64_sys_lseek
ffffffffacecdf00 T __x64_sys_read
ffffffffacece020 T __x64_sys_write
ffffffffaced2fe0 T __x64_sys_newstat
ffffffffaced30a0 T __x64_sys_newlstat
ffffffffaced3200 T __x64_sys_newfstat
ffffffffacee6ed0 T __x64_sys_poll
Видно как grep их переупорядочил - в той последовательности как они перечислены в /proc//kallsyms:

Код: Выделить всё

olej@mint:/usr/include/x86_64-linux-gnu/asm$ head -n13 /usr/include/x86_64-linux-gnu/asm/unistd_64.h
#ifndef _ASM_X86_UNISTD_64_H
#define _ASM_X86_UNISTD_64_H 1

#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
#define __NR_fstat 5
#define __NR_lstat 6
#define __NR_poll 7
#define __NR_lseek 8
#define __NR_mmap 9

Ответить

Вернуться в «Системные утилиты»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей