Поиск по сайту:

Узнайте, как использовать переменные Awk, числовые выражения и операторы присваивания — часть 8


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

Начиная с этой части, мы углубимся в дополнительные области Awk для выполнения более сложных операций фильтрации текста или строк. Поэтому мы собираемся рассмотреть такие функции Awk, как переменные, числовые выражения и операторы присваивания.

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

Вероятно, это будет один из самых простых для понимания разделов команд Awk, так что расслабьтесь и приступим.

1. Переменные Awk

В любом языке программирования переменная представляет собой заполнитель, в котором хранится значение. Когда вы создаете переменную в файле программы, по мере выполнения файла в памяти создается некоторое пространство, в котором будет храниться значение, указанное вами для переменной.

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

variable_name=value 

В синтаксисе выше:

  1. имя_переменной: имя, которое вы даете переменной.
  2. value: значение, хранящееся в переменной.

Давайте посмотрим на несколько примеров ниже:

computer_name=”linux-console.net”
port_no=”22”
email=”[email ”
server=”computer_name”

Взгляните на простые примеры выше: в первом определении переменной значение linux-console.net присваивается переменной computer_name.

Кроме того, переменной port_no присваивается значение 22, также можно присвоить значение одной переменной другой переменной, как в последнем примере, где мы присвоили значение имя_компьютера на сервер переменных.

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

first_name=$2
second_name=$3

В приведенных выше примерах значение first_name установлено во втором поле, а второе_имя установлено в третьем поле.

В качестве иллюстрации рассмотрим файл с именем names.txt, который содержит список пользователей приложения с указанием их имени и фамилии, а также пола. Используя команду cat, мы можем просмотреть содержимое файла следующим образом:

cat names.txt

Затем мы также можем использовать переменные first_name и Second_name для хранения имени и второго имени первого пользователя в списке, как при запуске Awk команда ниже:

awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt

Давайте также рассмотрим другой случай: когда вы вводите команду uname -a на своем терминале, она распечатывает всю вашу системную информацию.

Второе поле содержит ваше имя хоста, поэтому мы можем сохранить имя хоста в переменной с именем hostname и распечатать его с помощью Awk. > следующим образом:

uname -a
uname -a | awk '{hostname=$2 ; print hostname ; }' 

2. Числовые выражения

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

  1. * : оператор умножения
  2. + : оператор сложения
  3. / : оператор деления
  4. - : оператор вычитания
  5. % : оператор модуля
  6. ^ : оператор возведения в степень

Синтаксис числовых выражений:

operand1 operator operand2

В приведенной выше форме operand1 и operand2 могут быть числами или именами переменных, а operand — любым из приведенных выше операторов.

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

counter=0
num1=5
num2=10
num3=num2-num1
counter=counter+1

Чтобы понять использование числовых выражений в Awk, мы рассмотрим следующий пример ниже с файлом domains.txt, который содержит все домены, принадлежащие Tecmint . .

news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
linux-console.net
news.linux-console.net
linux-console.net
linuxsay.com
windows.linux-console.net
linux-console.net

Чтобы просмотреть содержимое файла, используйте команду ниже:

cat domains.txt

Если мы хотим подсчитать, сколько раз домен linux-console.net появляется в файле, мы можем написать простой скрипт, который сделает это следующим образом:

#!/bin/bash
for file in $@; do
        if [ -f $file ] ; then
                #print out filename
                echo "File is: $file"
                #print a number incrementally for every line containing linux-console.net 
                awk  '/^linux-console.net/ { counter=counter+1 ; printf "%s\n", counter ; }'   $file
        else
                #print error info incase input is not a file
                echo "$file is not a file, please specify a file." >&2 && exit 1
        fi
done
#terminate script with exit code 0 in case of successful execution 
exit 0

После создания сценария сохраните его и сделайте исполняемым. Когда мы запустим его с файлом domains.txt в качестве входных данных, мы получим следующий результат:

./script.sh  ~/domains.txt

В результате выполнения скрипта в файле domains.txt есть 6 строк, содержащих linux-console.net, что подтверждает возможность подсчета их вручную.

3. Операторы присваивания

Последняя функция Awk, которую мы рассмотрим, — это операторы присваивания. В Awk есть несколько операторов присваивания, в том числе следующие:

  1. *= : оператор умножения-присваивания
  2. += : оператор сложения и присваивания.
  3. /= : оператор присваивания деления
  4. -= : оператор вычитания-присваивания
  5. %= : оператор присваивания модуля
  6. ^= : оператор возведения в степень

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

variable_name=variable_name operator operand

Примеры:

counter=0
counter=counter+1

num=20
num=num-1

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

variable_name operator=operand
counter=0
counter+=1

num=20
num-=1

Таким образом, мы можем изменить команду Awk в сценарии оболочки, который мы только что написали выше, используя оператор присваивания += следующим образом:

#!/bin/bash
for file in $@; do
        if [ -f $file ] ; then
                #print out filename
                echo "File is: $file"
                #print a number incrementally for every line containing linux-console.net 
                awk  '/^linux-console.net/ { counter+=1 ; printf  "%s\n",  counter ; }'   $file
        else
                #print error info incase input is not a file
                echo "$file is not a file, please specify a file." >&2 && exit 1
        fi
done
#terminate script with exit code 0 in case of successful execution 
exit 0

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

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

В части 9 мы рассмотрим дополнительные возможности Awk, а именно специальные шаблоны: BEGIN и END. А до тех пор оставайтесь на связи с Tecmint.