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:
nazwa_zmiennej
: to nazwa, którą nadajesz zmiennejwartość
: 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:
*
: operator mnożenia+
: operator dodawania/
: operator dzielenia-
: operator odejmowania%
: operator modułu^
: 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:
*=
: operator przypisania mnożenia+=
: operator przypisania dodawania/=
: operator przypisania dzielenia-=
: operator przypisania odejmowania%=
: operator przypisania modułu^=
: 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.