Wyszukiwanie w witrynie

Dowiedz się, jak używać zmiennych Awk, wyrażeń numerycznych i operatorów przypisania – część 8


Seria poleceń Awk robi się coraz bardziej ekscytująca. Wierzę, że w poprzednich siedmiu częściach omówiliśmy pewne podstawy Awk, które musisz opanować, aby móc wykonywać podstawowe filtrowanie tekstu lub ciągów znaków w systemie Linux.

Zaczynając od tej części, zagłębimy się w zaawansowane obszary Awk, aby obsłużyć bardziej złożone operacje filtrowania tekstu lub ciągów znaków. Dlatego omówimy funkcje Awk, takie jak zmienne, wyrażenia numeryczne i operatory przypisania.

Koncepcje te nie różnią się całkowicie od tych, które prawdopodobnie spotkałeś w wielu językach programowania przed pojawieniem się powłoki, C, Pythona i wielu innych, więc nie ma potrzeby zbytnio martwić się tym tematem, po prostu rewidujemy powszechne koncepcje używania te wymienione cechy.

Będzie to prawdopodobnie jedna z najłatwiejszych do zrozumienia sekcji poleceń Awk, więc usiądź wygodnie i zaczynajmy.

1. Zmienne awk

W dowolnym języku programowania zmienna jest elementem zastępczym przechowującym wartość. Kiedy utworzysz zmienną w pliku programu, podczas wykonywania pliku, w pamięci zostanie utworzone miejsce, w którym zostanie przechowana wartość określona dla zmiennej.

Zmienne Awk możesz definiować w ten sam sposób, w jaki definiujesz zmienne powłoki:

variable_name=value 

W powyższej składni:

  1. nazwa_zmiennej: to nazwa, którą nadajesz zmiennej
  2. wartość: wartość przechowywana w zmiennej

Spójrzmy na kilka przykładów poniżej:

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

Spójrz na powyższe proste przykłady, w pierwszej definicji zmiennej wartość linux-console.net jest przypisana do zmiennej nazwa_komputera.

Ponadto do zmiennej port_no przypisana jest wartość 22, możliwe jest także przypisanie wartości jednej zmiennej do drugiej zmiennej jak w ostatnim przykładzie gdzie przypisaliśmy wartość nazwa_komputera do serwera zmiennych.

Jeśli pamiętasz, od drugiej części tej serii Awk, gdzie omówiliśmy edycję pól, mówiliśmy o tym, jak Awk dzieli linie wejściowe na pola i używa standardowego operatora dostępu do pól, $, aby odczytać różne pola, które zostały przeanalizowane. Możemy również używać zmiennych do przechowywania wartości pól w następujący sposób.

first_name=$2
second_name=$3

W powyższych przykładach wartość first_name jest ustawiona na drugie pole, a drugie_name jest ustawiona na trzecie pole.

Jako ilustrację rozważ plik o nazwie names.txt, który zawiera listę użytkowników aplikacji ze wskazaniem ich imion i nazwisk oraz płci. Za pomocą polecenia cat możemy wyświetlić zawartość pliku w następujący sposób:

cat names.txt

Następnie możemy również użyć zmiennych first_name i drugie_name do przechowywania pierwszego i drugiego imienia pierwszego użytkownika na liście, uruchamiając Awk polecenie poniżej:

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

Przyjrzyjmy się także innemu przypadkowi, gdy wydasz polecenie uname -a na swoim terminalu, wydrukuje ono wszystkie informacje o twoim systemie.

Drugie pole zawiera Twoją nazwę hosta, dlatego możemy zapisać nazwę hosta w zmiennej o nazwie nazwa hosta i wydrukować ją za pomocą Awk > w następujący sposób:

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

2. Wyrażenia numeryczne

W Awk wyrażenia numeryczne są budowane przy użyciu następujących operatorów numerycznych:

  1. *: operator mnożenia
  2. +: operator dodawania
  3. /: operator dzielenia
  4. -: operator odejmowania
  5. %: operator modułu
  6. ^: operator potęgowania

Składnia wyrażeń numerycznych jest następująca:

operand1 operator operand2

W powyższym formularzu operand1 i operand2 mogą być liczbami lub nazwami zmiennych, a operand to dowolny z powyższych operatorów.

Poniżej znajduje się kilka przykładów ilustrujących sposób tworzenia wyrażeń liczbowych:

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

Aby zrozumieć użycie wyrażeń numerycznych w Awk, rozważymy poniższy przykład z plikiem domains.txt, który zawiera wszystkie domeny należące do 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

Aby wyświetlić zawartość pliku użyj poniższego polecenia:

cat domains.txt

Jeśli chcemy policzyć, ile razy domena linux-console.net pojawia się w pliku, możemy napisać prosty skrypt, który zrobi to w następujący sposób:

#!/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

Po utworzeniu skryptu zapisz go i uczyń wykonywalnym, a gdy uruchomimy go z plikiem domains.txt jako wyjściem, otrzymamy następujące dane wyjściowe:

./script.sh  ~/domains.txt

Z wyniku działania skryptu wynika, że w pliku domains.txt znajduje się 6 wierszy zawierających linux-console.net, aby potwierdzić, że można je policzyć ręcznie.

3. Operatory przypisania

Ostatnią funkcją Awk, którą omówimy, są operatory przypisania. W Awk jest kilka operatorów przypisania, a wśród nich są następujące:

  1. *=: operator przypisania mnożenia
  2. +=: operator przypisania dodawania
  3. /=: operator przypisania dzielenia
  4. -=: operator przypisania odejmowania
  5. %=: operator przypisania modułu
  6. ^=: operator przypisania potęgowania

Najprostsza składnia operacji przypisania w Awk jest następująca:

variable_name=variable_name operator operand

Przykłady:

counter=0
counter=counter+1

num=20
num=num-1

Możesz użyć powyższych operatorów przypisania, aby skrócić operacje przypisania w Awk, rozważ poprzednie przykłady, możemy wykonać przypisanie w następującej formie:

variable_name operator=operand
counter=0
counter+=1

num=20
num-=1

Dlatego możemy zmienić polecenie Awk w skrypcie powłoki, który właśnie napisaliśmy powyżej, używając operatora przypisania += w następujący sposób:

#!/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

W tej części serii Awk omówiliśmy kilka potężnych funkcji Awk, czyli zmienne, budowanie wyrażeń numerycznych i używanie operatorów przypisania, a także kilka ilustracji pokazujących, jak faktycznie możemy z nich korzystać.

Koncepcje te nie różnią się niczym od koncepcji stosowanych w innych językach programowania, ale w programowaniu w Awk mogą istnieć pewne istotne różnice.

W części 9 przyjrzymy się większej liczbie funkcji Awk, czyli specjalnym wzorcom: BEGIN i END. Do tego czasu pozostań w kontakcie z Tecmint.