Команда grep – полезные ключи и примеры использования

1 февраля запускаем «Paranoid Rebirth» — курс по анонимности и безопасности от команды Кодебай

Как сохранить вывод команды grep в переменной оболочки? Каков синтаксис для хранения вывода команды в переменную для Linux или Unix?

Вы можете использовать grep command для любых заданных входных файлов, выбирая строки, соответствующие одному или нескольким шаблонам. По умолчанию вывод отображается на экране. Но вы можете хранить вывод в переменную в сценариях оболочки.

Синтаксис: замена команд

Подстановка команд означает не что иное, как запуск команды оболочки и сохранение ее вывода в переменную или отображение в исходном состоянии с помощью команды echo. Синтаксис выглядит следующим образом:

VAR=`command-name` VAR=»`grep word /path/to/file`» ## or ## VAR=$(command-name) VAR=»$(grep word /path/to/file)»

Примеры

Отображение даты и времени с помощью команды echo:

echo «Today is $(date)» ## or ## echo «Today is `date`»

Вы можете сохранить вывод команды в переменную оболочки с помощью следующего синтаксиса:

Чтобы сохранить текущую дату и время в переменном значении, существует команда под названием todays:

todays=$(date)

Вы можете вывести на экран значение $todays, для этого введите:

Как сохранить вывод команды grep в переменной оболочки? Каков синтаксис для хранения вывода команды в переменную для Linux или Unix?

echo «$todays»

В этом примере используйте команду grep для поиска имени пользователя vivek и сохранения вывода в переменном значении под названием myuser:

myuser=»$(grep ‘^vivek’ /etc/passwd)» echo «$myuser»

Примеры вывода данных:

// : grep сохраняет вывод в оболочке переменной и возвращает его на экран с помощью команды echo

Вы можете сохранить вывод команды grep в переменном значении одновременно с печатью вывода с использованием следующего синтаксиса на основе команды tee:

foo=»$(grep ‘^vivek’ /etc/passwd | tee /dev/tty) » echo «$foo»

Это полезно для прямого вывода команды grep на переменную оболочки и отображения на экране одновременно.

Это интересно:

  • Установка и настройка сервера Apache, PHP, MySQL, phpMyAdmin на Windows 10
  • mysql_connect() и PHP 7
  • Лучшие хакерские программы

Поиск по регулярному выражению в grep

Это всё, конечно, замечательно, но я бы хотел при поиске определения функции искать именно определение функции, без указания файлов, где она только упоминается. То есть мне нужна строка, где будет тип возвращаемого значения (char*), после которого будет идти какое-то количество спец-слов и пробелов, а потом название функции. Нет ничего проще:

grep -r -C 3 -E ‘char.*?\*.*?SDL_GetError’ /usr/local/include

Читайте также:  Управление автозагрузкой сервисов и скриптов в Linux

Почти все ключи нам известны кроме -E – он включает режим расширенных регулярных выражений для шаблона поиска. Так в данном регулярном выраженнии мы написали ‘char.?*.?SDL_GetError’ то есть:

  • в строке должная встретиться подстрока «char»,
  • сразу за ней должны встретиться любые символы до «*». Тут важно сказать, что . в регулярных выражениях отвечает за любой символ, * – модификатор, указывающий количество: от 0 до бесконечности повторений. Далее идёт ? – ограничитель жадности: да, любое количество повторений, пока не встретишь следующее из регулярного выражения.
  • \* – мы уже знаем, что * – спец. символ, означающий любое количество повторений. Поэтому, чтобы указать, что здесь должна быть просто *, мы используем экранирующий символ – \. Им же мы можем указать, что нужен символ «точка» или «вопросительный знак», не указывая на их дополнительные символы в рамках данного диалекта регулярных выражений.
  • снова .*? – съедаем все символы, не относящиеся к далее идущим в регулярке.
  • ну и наша функция «SDL_GetError».

Схематично это можно выразить следующим образом:

| char | .*? | \* | .*? | SDL_GetError | extern DECLSPEC | char | | * | SDLCALL | SDL_GetError | (void);

Регулярные выражения – отнюдь не очевидная тема. И понять её с ходу вы вряд лм сможете. Я подготовил некоторое объяснение в рамках второй пары по Linux. Но явно нужно более тщательное рассмотрение этой темы.

Специальные ярлыки

Если просто ввести команду cd без указания пути, то будет выполнен переход в домашнюю директорию. Проверим.

12345 [[email protected] bin]$ cd[[email protected] ~]$ pwd/home/mikhail

Чтобы сменить рабочую директорию на предыдущую, можно использовать символ «-» (минус). Сейчас мы в домашней директории, до этого были в /usr/bin. Значит после ввода команды cd — должны снова вернуться в /usr/bin. Проверим.

123456 [[email protected] ~]$ cd -/usr/bin[[email protected] bin]$ pwd/usr/bin

Сослаться на домашнюю директорию любого пользователя можно добавим перед именем учетной записи символ «~» (тильда), например ~mikhail. Так мы можем указать домашнюю директорию любого пользователя вне зависимости от того, где она расположена. Проверим.

12345 [[email protected] bin]$ cd ~mikhail[[email protected] ~]$ pwd/home/mikhail

Если после символа «~» (тильда) не указать имя пользователя, то данный символ будет ссылаться на собственную домашнюю директорию.

Механизм работы подобной «ссылки» реализован за счет развертывания строк (материал из будущего ;)).

А теперь заморозим виртуальную машину в данном состоянии.

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

4.1 Просмотр установленных пакетов

RPM-дистрибутивы

# rpm -qa # Отображается список пакетов RPM, установленных в системе.

DEB–дистрибутивы

# dpkg -l |more # Для показа списка пакетов DEB, установленных в системе; # apt-cache search имя пакета # Для поиска в индексах доступного пакета и вывода на экран краткой информации о нужном пакете (это весьма полезная команда, обеспечивающая поиска программ из консоли); # apt-cache showpkg имя пакета # Для отображения полной информации об указанном пакете.

4.2 Установка и удаление пакетов

RPM-дистрибутивы

# [sudo] rpm -i # Устанавливается RPM-пакет ; # [sudo] dpkg -i *.rpm # Устанавливаются все пакеты в директории; # [sudo] rpm -e pkgname # Удаляется RPM-пакет pkgname.

DEB-дистрибутивы

# [sudo] apt-get update # Обновляется список доступных пакетов из интернета; # [sudo] apt-get upgrade # Обновляется доступная версия установленных пакетов в системе; # [sudo] dpkg -i *.deb # Устанавливаются все пакеты в директории; # [sudo] apt-get install pkgname # Устанавливается DEB-пакет pkgname; # [sudo] apt-get remove pkgname # Удаляется DEB-пакет pkgname.

Команды для отображения базовой информации и управления системой

Утилиты, делящиеся разного рода справочной информацией с администратором компьютера.

  • df — показывает, сколько пространства занято на подключенных дисках и разделах. По умолчанию отображает данные в килобайтах. Можно переключиться на мегабайт, добавив параметр -m. Это выглядит так: df -m.
  • du — расскажет, сколько места занимает конкретный файл или папка. Чтобы узнать, насколько тяжелая директория Desktop, введем: du ~/Desktop. du отображает информацию в блоках. Но это неудобно, поэтому обычно к ней добавляют опцию -h, чтобы появились привычные мегабайты, килобайты и байты.
  • free — тоже связана с памятью, только с оперативной. Показывает, сколько занято, а сколько свободно. Чтобы включить отображение в мегабайтах, надо так же добавить аргумент -h.
  • uname — вывод информации о системе и сервере. Аргумент -a показывает имя компьютера, версию ядра, текущую дату и время, разрядность системы и ее тип. Можно запрашивать отдельные фрагменты данных через дополнительные опции: -s — только имя ядра; -n — имя компьютера (ноды) в сети; -o — название операционной системы; -p — тип процессора; -s — версия ядра.
  • whoami — покажет, кто вы есть. Имя учетной записи, через которую вы зашли в систему или подключились к серверу.
  • date — из названия ясно, что команда отображает текущее время и дату.
  • sleep — задерживает запуск скриптов на выбранный период времени. Единица времени указывается через опции: -s — секунды; -m — минуты; -h — часы; d — дни.

На этом все. Это список команд, которыми я хотел бы поделиться с новичками. Я разобрал основное, что будет важно в самом начале работы. Ну а вы всегда можете воспользоваться документацией, открывающейся через man, и подробнее ознакомиться с любой из команд или утилит.

Читайте также:  Unix / Linux — режим доступа к файлам / доступа

Процессы

top -P

Мониторинг нагрузки системы и процессов. -P — раздельное отображение нагрузки для каждого ядра процессора.

man top FreeBSD. Подробное руководство: Исследование процессора, памяти и операций ввода-вывода с помощью top(1)

atop

Мониторинг нагрузки на процессор, память, дисковую подсистему и сеть. Отображение списка активных процессов. Возможность фонового сбора статистики.

Требуется установка порта atop.

man atop

ps -ax -lprocstat -a

Отобразить список процессов.

Параметры команды ps: -a — отображать процессы всех пользователей. -x — отображать процессы не связанные с терминалами. -j, -l, -u, -v вывод различного набора столбцов. -d — отобразить процессы в виде дерева родитель-потомок. -r — упорядочить список по текущей нагрузке на процессор. -ww — отображать команду запуска полностью.

ps -lp PIDps -axl | grep процесс

Отображение информации о процессе c заданным PID или именем.

man ps man procstat man grep FreeBSD. Подробное руководство: Исследование процессов

pgrep -l regexp-шаблон

Найти процессы с именем, соответствующим заданному шаблону. Проверить, запущен ли процесс. -l — отображать имя процесса в дополнение к идентификатору.

man pgrep

killall имя-процессаpkill regexp-шаблон

Отправить сигнал завершения всем процессам с заданным именем, либо именем, соответствующим заданному шаблону.

man killall man pkill

kill PID

Отправить сигнал завершения процессу с заданным PID.

man kill

procstat -b -aprocstat -b PIDprocstat -b `pgrep -a ^процесс$`

Отобразить путь к исполняемому файлу процесса.

procstat -c -aprocstat -c PIDprocstat -c `pgrep -a ^процесс$`

Отобразить командную строку запуска процесса.

procstat -f PIDprocstat -f `pgrep -a ^процесс$`

Отобразить список файлов, открытых процессом.

procstat -s PIDprocstat -s `pgrep -a ^процесс$`

Отобразить параметры безопасности процесса: идентификаторы пользователя и группы, umask, флаги.

procstat -t PIDprocstat -t `pgrep -a ^процесс$`

Отобразить потоки процесса.

man procstat man pgrep

nice -n 20 команда

Выполнить команду с минимальным приоритетом.

man nice

nice +20 команда

Выполнить команду с минимальным приоритетом. Вариант для csh

man csh FreeBSD. Подробное руководство: Изменение приоритетов с помощью nice

renice приоритет -p PID

Задать приоритет процессу.

Приоритет задается в диапазоне от -20 до 20, отрицательные значения увеличивают приоритет, положительные — уменьшают.

man renice

idprio 15 командаidprio 15 -PID

Выполнять команду или процесс только при простое системы. 15 — приоритет среди других процессов, работающих в режиме бездействия.

man idprio

rtprio 15 командаrtprio 15 -PID

Выполнять команду или процесс в реальном времени. 15 — приоритет среди других процессов реального времени.

man rtprio