Скрытность в Linux /заметаем следы/
  • Использование Операторов «Grep ИЛИ / Grep И / Grep НЕ» в BASH
  • Печать Столбцов (Колонок) в Bash с помощью AWK
  • Удаление Первых и Последних Символов из Строк в Bash
  • Добавить Символ в Начале или в Конце Каждой Строки с AWK и SED
  • Проверить Существует ли Файл
  • Напечатать Usage и Прервать Скрипт при Незаданных Аргументах
  • CASE — Оператор Выбора в Bash
  • «Да/Нет» в Bash Скрипте — Запрос Подтверждения
  • Выполнить и Повторить Команду N Раз в Bash

Использование Операторов «Grep ИЛИ / Grep И / Grep НЕ» в BASH

Оператор Grep ‘OR’

Находим все строки в файле, которые содержат какие-либо из перечисленных шаблонов.

Используя команду GREP :

grep "pattern1\|pattern2" file.txt
grep -E "pattern1|pattern2" file.txt
grep -e pattern1 -e pattern2 file.txt
egrep "pattern1|pattern2" file.txt

Используя команду AWK :

awk '/pattern1|pattern2/' file.txt

Используя команду SED :

sed -e '/pattern1/b' -e '/pattern2/b' -e d file.txt

Оператор Grep ‘AND’

Находим и печатаем строки содержащие все перечисленные паттерны.

Используя команду GREP :

grep -E 'pattern1.*pattern2' file.txt # в такой последовательности
grep -E 'pattern1.*pattern2|pattern2.*pattern1' file.txt # в любой последовательности
grep 'pattern1' file.txt | grep 'pattern2' # в любой последовательности

Используя команду AWK :

awk '/pattern1.*pattern2/' file.txt # в такой последовательности
awk '/pattern1/ && /pattern2/' file.txt # в любой последовательности

Используя команду SED :

sed '/pattern1.*pattern2/!d' file.txt # в такой последовательности
sed '/pattern1/!d; /pattern2/!d' file.txt # в любой последовательности

Оператор Grep ‘NOT’

Находим и печатаем строки, которые не содержат указанный паттерн.

Используя команду GREP :

grep -v 'pattern1' file.txt

Используя команду AWK :

awk '!/pattern1/' file.txt

Используя команду SED :

sed -n '/pattern1/!p' file.txt

Печать Столбцов (Колонок) в Bash с помощью AWK

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

С помощью примеров из данной статьи, Вы сможете решать такие распространенные задачи, как :

  • Печать Столбцов по Номерам
  • Изменять Разделители Колонок
  • Исключать Определенные Столбцы
  • Печатать или Исключать Диапазон Столбцов

Печать Столбцов по Номерам с помощью AWK

Вывести все столбцы.

$ awk '{print $0}' file

Напечатать 3-ий столбец.

$ awk '{print $3}' file

Напечатать 1-ый и 3-ий столбцы.

$ awk '{print $1 $3}' file

Изменить Разделитель Колонок в AWK

По умолчанию AWK, в качестве разделителя колонок, использует пробелы и табуляции.

Использовать «,» (запятую) в качестве разделителя и вывести 2-ую колонку.

$ awk -F "," '{print $2}' file

Использовать «:» (двоеточие) в качестве разделителя и напечатать 3-ий столбец.

$ awk -F ":" '{print $3}' file

Исключить Определенные Столбцы с помощью AWK

Напечатать все столбцы, за исключением 3-его.

$ awk '{$3=""; print $0}' file

Напечатать все столбцы, за исключением 1-ого и 2-ого.

$ awk '{$1=$2=""; print $0}' file

Напечатать или Исключить Диапазон Столбцов с помощью AWK

Вывести колоноки со 2-ой по 4-ую.

$ awk -v f=2 -v t=4 '{for(i=f;i<=t;i++) printf("%s%s",$i,(i==t)?"\n":OFS)}' file

Исключить диапазон столбцов со 2-ого по 4-ый и напечатать все остальные.

$ awk -v f=2 -v t=4 '{for(i=1;i<=NF;i++)if(i>=f&&i<=t)continue;else printf("%s%s",$i,(i!=NF)?OFS:ORS)}' file

Удаление Первых и Последних Символов из Строк в Bash

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

$ cat file
12345===I Love Bash===54321
12345===I Love Bash===54321
12345===I Love Bash===54321

Удалить Первые N Символов Каждой Строки

Используйте следующую команду чтобы удалить первые 5 символов каждой строки (удаляем первые 5 символов и печатаем каждую строку, начиная с 6-ого символа) :

$ cat file | cut -c 6-
===I Love Bash===54321
===I Love Bash===54321
===I Love Bash===54321

Печать Строки Между Заданными Символами

Используйте следующую команду чтобы напечатать содержимое каждой строки между 9-ым и 20-ым символами в Bash :

$ cat file | cut -c 9-20
I Love Bash
I Love Bash
I Love Bash

Печать Первых N Символов Каждой Строки

Используйте следующую команду чтобы напечатать первые 20 символовкаждой строки в Bash :

$ cat file | cut -c 1-20
12345===I Love Bash
12345===I Love Bash
12345===I Love Bash

Удалить Последний Символ Каждой Строки

Используя сочетание команд reverse и cut, мы можем удалять последние N символов каждой строки, как показано ниже. (источник)
Используйте следующую команду чтобы удалить последний символ каждой строки в Bash :

$ rev file | cut -c 2- | rev
12345===I Love Bash===5432
12345===I Love Bash===5432
12345===I Love Bash===5432

Удалить Последние N Символов Каждой Строки

Используйте следующую команду чтобы удалить последние 8 символовкаждой строки в Bash :

$ rev file | cut -c 9- | rev
12345===I Love Bash
12345===I Love Bash
12345===I Love Bash

Добавить Символ в Начале или в Конце Каждой Строки с AWK и SED 

Я создал файл со следующим содержимым и буду использовать его в примерах ниже :

$ cat file 
I Love Bash
I Love Bash
I Love Bash

Допустим нам необходимо добавить символы в НАЧАЛЕ или в КОНЦЕ каждой строки этого файла.

Добавить Символы в НАЧАЛЕ Каждой Строки

Используйте следующие команды, чтобы добавить один или несколько символов в НАЧАЛЕ каждой строки файла :

# добавить символы в начале каждой строки используя AWK
awk '{print "добавить_в_начале"$0}' file
# добавить символы в начале каждой строки используя SED
sed 's/^/добавить_в_начале/' file

Закомментировать Строки в Файле

Используйте следующую AWK команду для того, чтобы закомментировать все строки файла, вставив «#» (знак решетки) в НАЧАЛЕ каждой строки файла :

$ awk '{print "#"$0}' file
#I Love Bash
#I Love Bash
#I Love Bash

Добавить Символы в КОНЦЕ Каждой Строки

Используйте следующие команды, чтобы добавить какой-либо текст в КОНЦЕ каждой строки файла :

# добавить символы в конце каждой строки используя AWK
awk '{print $0"добавить_в_конце"}' file
# добавить символы в конце каждой строки используя SED
sed 's/$/добавить_в_конце/' file

Добавить Точку с Запятой в Конце Каждой Строки

Используйте следующую AWK команду для того, чтобы вставить «;» (точку с запятой) в КОНЦЕ каждой строки файла :

$ awk '{print $0";"}' file
I Love Bash;
I Love Bash;
I Love Bash;

Добавить Символы в НАЧАЛЕ и в КОНЦЕ Строк

Используйте следующие команды, чтобы добавить какой-либо префикс в НАЧАЛЕ и какой-либо суффикс в КОНЦЕ каждой строки файла :

# добавить символы в начале и в конце каждой строки используя AWK
awk '{print "добавить_в_начале"$0"добавить_в_конце"}' file
# добавить символы в начале и в конце каждой строки используя SED
sed "s/.*/добавить_в_начале&добавить_в_конце/" file

Пример :

$ awk '{print "+++"$0"---"}' file
+++I Love Bash---
+++I Love Bash---
+++I Love Bash---

Добавить Запятые и Напечатать в Одну Строку

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

# добавить запятые и напечатать в одну строку
echo $(awk 'NR > 1{print line", "}{line=$0;}END{print $0" "}' file)
I Love Bash, I Love Bash, I Love Bash

Проверить Существует ли Файл

В процессе написания BASH скриптов, очень часто возникает ситуация, когда необходимо проверить существование файла, прежде чем предпринимать какие-либо действия.

Эта работа для команды test (то же, что и []). Эта команда позволяет проводить ряд тестов, и по окончанию устанавливает код завершение равным 0 (правда) или 1 (ложь), в зависимости от того, чем окончился тест.

Синтаксис

[ параметр ФАЙЛ ]
или
test параметр ФАЙЛ

Основные параметры

ПараметрыОписание
-eВозвращает значение если файл существует
-fВозвращает значение если файл существует и это обычный файл
-rВозвращает значение если файл существует и он доступен для чтения
-wВозвращает значение если файл существует и он доступен для записи
-xВозвращает значение если файл существует и он исполняемый

Примеры

1. Проверим существует ли файл /etc/passwd и напечатаем Файл Найден, если он существует :

if test -f "/etc/passwd"; then echo "Файл Найден";fi

2. Проверим существует ли файл /etc/passwd и напечатаем Файл НЕ Найден, если он НЕ существует :

if [ ! -f "/etc/passwd" ]; then echo "Файл НЕ Найден"; fi

3. Проверим существование файла /etc/passwd и выполним какое-либо действие если он существует, либо иное действие, если этот файл НЕ существует :

[ -f "/etc/passwd" ] && echo "Файл Найден" || echo "Файл НЕ Найден"

Пример BASH Скрипта

Этот скрипт проверяет существует ли файл или нет :

#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
   echo "File '$FILE' Exists"
else
   echo "The File '$FILE' Does Not Exist"
fi

Сохраните и выполните скрипт :

chmod +x script.sh
./script.sh /path/to/SomeFile.txt
The File ‘/path/to/SomeFile.txt’ Does Not Exist
./script.sh /etc/resolv.conf
The File ‘/etc/resolv.conf’ Exists

Напечатать Usage и Прервать Скрипт при Незаданных Аргументах

Используйте следующую проверку в shell скриптах, чтобы :

1. проверить количество входящих аргументов

2. вывести сообщение об ошибке, если количество входящих аргументов некорректно

3. прервать shell скрипт со статусом ошибки

[ $# -eq 0 ] && { echo «Usage: $0 argument»; exit 1; }

ПараметрОписание
$#переменная, содержащая количество аргументов, преданных скрипту
-eq 0проверяем, равняется ли количество переданных аргументов нулю
$0возвращает путь к shell скрипту

Пример Bash Скрипта

Следующий скрипт использует команду dig для поиска DNS-сервера доменного имени. Проверяемый домен должен передаваться скрипту в качестве аргумента.

#!/bin/bash
domain=$1
[ $# -eq 0 ] && { echo "Usage: $0 domain_name"; exit 1; }
dig NS $domain @8.8.8.8 +short

Пример выполнения скрипта, если аргумент не указан :

$ ./find_ns.sh
Usage: ./find_ns.sh domain_name

Пример работы скрипта при заданном аргументе :
$ ./find_ns.sh shellhacks.com
ns2.ukraine.com.ua.
ns3.ukraine.com.ua.
ns1.ukraine.com.ua.

CASE — Оператор Выбора в Bash

 

Базовый Синтаксис Оператора Выбора CASE

case $variable in
     pattern-1)      
          commands
          ;;
     pattern-2)      
          commands
          ;;
     pattern-3|pattern-4|pattern-5)
          commands
          ;; 
     pattern-N)
          commands
          ;;
     *)
          commands
          ;;
esac

Пример BASH Скрипта с Оператором CASE

#!/bin/bash
printf 'Какой Linux дистрибутив Вы знаете? '
read DISTR

case $DISTR in
     ubuntu)
          echo "Я тоже знаю Ubuntu! Эта система основана на Debian."
          ;;
     centos|rhel)
          echo "Эй! Это мой любимый серверный дистрибутив!"
          ;;
     windows)
          echo "Очень смешно..."
          ;; 
     *)
          echo "Хмм, кажется я никогда не использовал этот дистрибутив."
          ;;
esac

Примеры работы скрипта :
$ ./testcase.sh
Какой Linux дистрибутив Вы знаете? centos
Эй! Это моя любимая серверная операционная система!
$ ./testcase.sh
Какой Linux дистрибутив Вы знаете? rhel
Эй! Это моя любимая серверная операционная система!
$ ./testcase.sh
Какой Linux дистрибутив Вы знаете? ubuntu
Я тоже знаю ubuntu! Это операционная система, основанная на Debian.
$ ./testcase.sh
Какой Linux дистрибутив Вы знаете? pfff
Хмм, кажется я никогда не использовал этот дистрибутив.

«Да/Нет» в Bash Скрипте — Запрос Подтверждения

В bash скриптах очень часто возникает необходимость приостановить выполнение задачи и поставить пользователю вопрос, на который тот должен ответить Да или Нет.

Например, перед выполнением потенциально опасной части bash скрипта, хорошей идеей будет запросить подтверждение у пользователя, задав вопрос — «Вы уверены?».

В этой заметке Вы найдете три самых простых и быстрых способа задать «Да/Нет» вопрос в bash скрипте.

Запрос о Продолжении в Bash

Лучший способ запросить подтверждение на продолжение в bash скрипте — это с помощью команды read (источник) :

read -p "Are you sure? " -n 1 -r
echo    # (optional) move to a new line
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
    exit 1
fi

Простой «Да/Нет» Вопрос в Bash

Одним из самых распространенных способов постановки вопросов в bash скриптах — это комбинирование команд read + case (источник) :

while true; do
    read -p "Do you wish to install this program?" yn
    case $yn in
        [Yy]* ) make install; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer yes or no.";;
    esac
done

Выбираем «Да/Нет» из Меню в Bash

Еще один легкий способ — с помощью команды select (источник) :

echo "Do you wish to install this program?"
select yn in "Yes" "No"
case $yn in
    Yes ) make install;;
    No ) exit;;
esac

Выполнить и Повторить Команду N Раз в Bash

Иногда возникает необходимость несколько раз выполнить одну и ту же команду из командной строки в Linux.

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

Из этой небольшой заметки вы узнаете, что лучший способ чтобы выполнить одну и ту же команду N раз подряд — это использовать цикл FOR в Bash.

Повторить Команду Несколько Раз в Linux Shell

Используйте следующий синтаксис, чтобы выполнить какую-либо команду 5 раз :

for n in {1..5}; do command; done

Давайте поможем Барту Симпсону со школьной доской :

$ for n in {1..5}; do echo "Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ"; done
Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ
Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ
Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ
Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ
Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ

Если вам необходимо часто использовать такую конструкцию, тогда не помешает создать соответствующую Bash функцию (добавьте в ~/.bashrc) :

function run() {
    number=$1
    shift
    for n in $(seq $number); do
      $@
    done
}

Использование :

$ run 5 command

Пример :

$ run 5 echo "Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ"
Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ
Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ
Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ
Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ
Я НЕ БУДУ КАТАТЬСЯ НА СКЕЙТЕ В КОРИДОРАХ