Как использовать коды завершения в Bash-скриптах

Рейтинг: 5  / 5

Поиск слова в файле с помощью grep

Пожалуй, самый простой пример использования команды grep – это поиск подстроки в файле:

grep «Безухов»

– выведет строки, в которых grep нашёл точное совпадение. Однако, в этом списке строк сложно ориентироваться. Предлагаю немного апгрейдить нашу команду, чтобы и номера строк выводила, да ещё и контекст добавляла:

grep -in -C 3 «Безухов»

Пробежимся по ключам:

  • -i – игнорирование регистра – grep будет находить, даже если строчные буквы в подстроке оказались заглавными и наоборот. В случае с «Безуховым» это не так критично, но если бы мы искали «Граф», то в начале предложения оно таким и было бы, а вот внутри могло быть и с маленькой буквы.
  • -n – вывод номера строки, где было найдено вхождение нашей подстроки. Согласитесь, так приятнее и искать, да и представлять, на сколько подстрока разбросана по файлу, легче.
  • -C 3 – выводим по 3 строки до найденой строки и после – полезно понимать, в каком контексте была произнесена та или иная фраза. Для удобства каждая находка отделяется от других строкой из «—«.

В итоге мы получим нечто следующее:

— 848- 849-Но дамы невольно смеялись и сами. 850- 851:— Насилу спасли этого несчастного, — продолжала гостья. — И это сын графа Кирилла Владимировича Безухова так умно забавляется! — прибавила она. — А говорили, что так хорошо воспитан и умен. Вот всё воспитание заграничное куда довело. Надеюсь, что здесь его никто не примет, несмотря на его богатство. Мне хотели его представить. Я решительно отказалась: у меня дочери. 852- 853-— Отчего вы говорите, что этот молодой человек так богат? — спросила графиня, нагибаясь от девиц, которые тотчас же сделали вид, что не слушают. — Ведь у него только незаконные дети. Кажется… и Пьер незаконный. 854- —

Обрабатываем строку в Python

Представим, что ожидается ввод числа с клавиатуры. Перед преобразованием введенной нами строки в число можно легко проверить, введено ли действительно число. Если это так, выполнится операция преобразования. Для обработки строки используем такой метод в Python, как isnumeric():

Следующий пример позволяет удалять пробелы в конце и начале строки:

Так можно дополнить строку пробелами и выполнить выравнивание:

В консоли Python будет выведено следующее:

Поиск подстроки в строке

Чтобы в Python выполнить поиск в строке, используют метод find(). Он имеет три формы и возвращает индекс 1-го вхождения подстроки в строку:

find(str): поиск подстроки str производится с начала строки и до её конца;

find(str, start): с помощью параметра start задаётся начальный индекс, и именно с него и выполняется поиск;

find(str, start, end): посредством параметра end задаётся конечный индекс, поиск выполняется до него.

Когда подстрока не найдена, метод возвращает -1:

Замена в строке

Чтобы в Python заменить в строке одну подстроку на другую, применяют метод replace():

replace(old, new): подстрока old заменяется на new;

replace(old, new, num): параметр num показывает, сколько вхождений подстроки old требуется заменить на new.

Пример замены в строке в Python:

Разделение на подстроки в Python

Для разделения в Python используется метод split(). В зависимости от разделителя он разбивает строку на перечень подстрок. В роли разделителя в данном случае может быть любой символ либо последовательность символов. Этот метод имеет следующие формы:

split(): в роли разделителя применяется такой символ, как пробел;

split(delimeter): в роли разделителя применяется delimeter;

split(delimeter, num): параметром num указывается, какое количество вхождений delimeter применяется для разделения. При этом оставшаяся часть строки добавляется в перечень без разделения на подстроки.

Система

Информация о системе

С этими командами вы с легкостью получите все подробности о компьютере:

Читайте также:  Как установить Linux на Windows 10 с помощью WSL

uname -a # показывает информацию о системе (kernel, architecture…) sudo lshw # (только для Linux) предоставляет информацию об аппаратном обеспечении sudo lshw -short # (только для Linux) краткая информацию об аппаратном обеспечении lscpu # (только для Linux) Показывает информацию о ЦП lsusb # (только для Linux) вывод информации о подключенном USB устройстве date # выводит дату и время

Работам с процессами

Следующие команды предоставляют общие сведения о всех процессах, происходящих в системе. В macOS и некоторых дистрибутивах Linux htop не установлен, поэтому перед использованием нужно установить его с помощью стандартного менеджера пакетов (для macOS  — Homebrew):

ps # показывает текущие процессы, происходящие в терминальном сеансе

ps aux # показывает все процессы, происходящие на компьютере

htop # отображает в терминале монитор активности

Система

Команда htop в Linux

Смена пользователей

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

su # смена текущего пользователя на администратора(root) su — # смена текущего пользователя на администратора(root), со сменой локальных переменных su maria # смена текущего пользователя на «maria» sudo nano # выполнить команду «nano» от имени администратора (root)

Копирование и вставка в буфер обмена

Вы можете скопировать и вставить текст из/в терминал, выделив их и нажав Ctrl + C или Ctrl + V. Но иногда хочется напрямую получить доступ к буферу обмена. И как вы видите ниже, это не так уж и просто, что на Linux, что на macOS.

# Linux echo «Hello my friend!» | xclip # копировать «Hello my friend!» в буфер обмена xclip -o >> pasted_ # вставить содержимое буфера в текст файла # macOS echo «Hello my friend!» | pbcopy # копировать «Hello my friend!» в буфер обмена pbpaste >> pasted_ # вставить содержимое буфера в текст файла

Как использовать коды завершения в Bash-скриптах

Удаление из скрипта команды echo позволило нам получить код завершения. Что делать, если нужно сделать разные действия в случае успешного и неуспешного выполнения команды touch? Речь идёт о печати stdout в случае успеха и stderr в случае неуспеха.

Читайте также:  Zabbix: установка и базовая настройка системы мониторинга

Проверяем коды завершения

Выше мы пользовались специальной переменной $?, чтобы получить код завершения скрипта. Также с помощью этой переменной можно проверить, выполнилась ли команда touch успешно.

#!/bin/bash touch /root/test 2> /dev/null if [ $? -eq 0 ] then echo «Successfully created file» else echo «Could not create file» >&2 fi

После рефакторинга скрипта получаем такое поведение:

  • Если команда touch выполняется с кодом 0, скрипт с помощью echo сообщает об успешно созданном файле.
  • Если команда touch выполняется с другим кодом, скрипт сообщает, что не смог создать файл.

Любой код завершения кроме 0 значит неудачную попытку создать файл. Скрипт с помощью echo отправляет сообщение о неудаче в stderr.

Выполнение:

$ ./ Could not create file

Создаём собственный код завершения

Наш скрипт уже сообщает об ошибке, если команда touch выполняется с ошибкой. Но в случае успешного выполнения команды мы всё также получаем код 0.

$ ./ Could not create file $ echo $? 0

Поскольку скрипт завершился с ошибкой, было бы не очень хорошей идеей передавать код успешного завершения в другую программу, которая использует этот скрипт. Чтобы добавить собственный код завершения, можно воспользоваться командой exit.

#!/bin/bash touch /root/test 2> /dev/null if [ $? -eq 0 ] then echo «Successfully created file» exit 0 else echo «Could not create file» >&2 exit 1 fi

Теперь в случае успешного выполнения команды touch скрипт с помощью echo сообщает об успехе и завершается с кодом 0. В противном случае скрипт печатает сообщение об ошибке при попытке создать файл и завершается с кодом 1.

Выполнение:

$ ./ Could not create file $ echo $? 1

Удаление текста

Можно легко удалить текст, который мы выводили в предыдущем примере, заменив команду “p” на команду “d”. Команда «-n» нам больше не нужна, потому что при использовании команды удаления утилита выводит все, что не удалено. Это позволяет нам видеть, что происходит. Изменим последнюю команду из предыдущего раздела так, чтобы она удаляла все нечетные строки, начиная с первой. В результате мы должны получить все строки, которые не были выведены в прошлый раз.

sed ‘1~2d’ BSD All rights reserved. Redistribution and use in source and binary forms, with or without are met: notice, this list of conditions and the following disclaimer. notice, this list of conditions and the following disclaimer in the 3. Neither the name of the University nor the names of its contributors without specific prior written permission. . . . . . .

При этом исходный файл не меняется. Результаты редактирования просто выводятся на экран. Если результат нужно сохранить, можно перенаправить стандартный вывод в файл:

sed ‘1~2d’ BSD >

Открыв этот файл командой cat, мы увидим тот же результат, который был на экране после выполнения предыдущей команды. По умолчанию sed не редактирует исходный файл в целях безопасности. Это можно изменить при помощи опции «-i», которая означает редактирование на месте. Исходный файл будет изменен. Давайте попробуем отредактировать только что созданный нами файл «». Снова удалим все нечетные строки:

Читайте также:  14 команд CMD, которые должен знать каждый пользователь

sed -i ‘1~2d’

При помощи cat можно убедиться, что файл был отредактирован.

Опция “-i” может быть опасной, но утилита предоставляет возможность создания резервной копии перед редактированием. Для этого сразу после опции “-i” укажите расширение резервной копии “.bak”:

sed ‘1~2d’

Будет создан файл резервной копии с расширением “bak”, а затем выполнено редактирование исходного файла.

Работа с подстроками

Рассмотрим javascript функции для работы с подстроками.

  • slice(start, [end]) — возвращает символы, между конкретных позиций.

    let s = ‘0123456789’; let s_new = (0, 4); (s_new); // 0123

    Если второй параметр не указан, то вернет всё до конца строки.

  • substring(start, [end]) — работает аналогично. Отличие от «slice» в 2 моментах. Если стартовое значение больше конечного, то первая функция вернет пустую строку.

    let s = ‘0123456789’; ((6, 4)); // » ((6, 4)); // 45

    Ещё различие в подходе при неверных параметрах.

    let s = ‘0123456789’; ((-4, -2)); // 67 ((-4, -2)); // »

    Функция «slice()» конвертирует отрицательные значения в положительные, отталкиваясь от длины строки, а «substring()» просто устанавливает их в ноль, поэтому возвращает пустую строку.

  • substr(start, [length]) — возвращает подстроку, начиная с определенной позиции и определенной длины.

    let s = ‘0123456789’; let s_new = (4, 3); (s_new); // 456

* — как «подстановочный» знак последовательности символов

Вы можете использовать «подстановочный» знак звездочка (*) для обозначения любой последовательности символов, включая отсутствие символов. Рассмотрим следующий шаблон имени файла:

ls badge*

* - как

Это соответствует всем следующим:

Он соответствует «», потому что «подстановочный» знак представляет собой любую последовательность символов или не содержит символов.

Эта команда сопоставляет все файлы, называемые «исходными», независимо от расширения файла.

* - как

ls source.*

Обоснуйте строки

Python предоставляет функции для выравнивания строк, позволяя заполнять текст, чтобы упростить выравнивание различных строк.

Ниже приведен пример и :

interstates_lengths = { 5: (1381, 2222), 19: (63, 102), 40: (2555, 4112), 93: (189,305), } for road, length in interstates_(): miles,kms = length print(‘{} -> {} mi. ({} km.)’.format(str(road).rjust(4), str(miles).ljust(4), str(kms).ljust(4)))

40 -> 2555 миль (4112 км.) 19 -> 63 миль. (102 км.) 5 -> 1381 миль. (2222 км.) 93 -> 189 миль. (305 км.)

ljust и rjust очень похожи. Оба имеют width параметр и необязательный fillchar параметр. Любая строка , создаваемая эти функции, по крайней мере до тех пор , как width параметр , который был передан в функцию. Если строка длиннее , чем width alread, она не усекается. fillchar аргумент, который по умолчанию используется символ пробела ‘ ‘ должен быть один символ, а не multicharacter строка.

ljust функция подушечки конца строки она называется на с fillchar до тех пор, пока width длиной символов. rjust функция подушечки начала строки в подобной манере. Таким образом, l и r в названиях этих функций относятся к стороне , что исходная строка, а не fillchar , расположена в выходной строке.