Awk üýtgeýjileri, san aňlatmalaryny we belleme operatorlaryny nädip ulanmalydygyny öwreniň - 8-nji bölüm


Awk buýruk seriýasy tolgundyrýar, öňki ýedi bölümde Linux-da käbir esasy tekstleri ýa-da simli süzgüçleri ýerine ýetirmek üçin özleşdirmeli Awk-yň käbir esaslaryny öwrenipdik.

Bu bölümden başlap, has çylşyrymly tekst ýa-da süzgüçli amallary dolandyrmak üçin Awk-iň öňdäki ýerlerine çümeris. Şonuň üçin üýtgeýjiler, san aňlatmalary we ýumuş operatorlary ýaly Awk aýratynlyklaryny ýapmakçy.

Bu düşünjeler, “C”, “Python” we başga-da köp sanly programmirleme dillerinde duş gelen bolmagyňyzdan düýpgöter tapawutlanmaýar, şonuň üçin bu mowzuk hakda kän alada etmegiň zerurlygy ýok, biz diňe umumy pikirleri täzeden gözden geçirýäris agzalan aýratynlyklar.

Bu, düşünmek üçin iň aňsat Awk buýruk bölümleriniň biri bolar, şonuň üçin oturyň we dowam ediň.

1. Awk üýtgeýjiler

Islendik programmirleme dilinde üýtgeýji, bahany saklaýan ýer eýesidir, bir programma faýlynda üýtgeýji döredeniňizde, faýl ýerine ýetirilende, üýtgeýji üçin görkezen bahaňyzy ýatda saklar.

Awk üýtgeýjilerini gabyk üýtgeýänlerini kesgitlän ýaly kesgitläp bilersiňiz:

variable_name=value 

Aboveokardaky sintaksisde:

  1. üýtgeýän_name : üýtgeýjini berýän adyňyz
  2. value : üýtgeýjide saklanýan baha

Aşakdaky käbir mysallara seredeliň:

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

Aboveokardaky ýönekeý mysallara göz aýlaň, ilkinji üýtgeýän kesgitlemede computer_name üýtgeýänine linux-console.net bahasy berilýär.

Mundan başga-da, 22 bahasy üýtgeýän port_no üýtgeýjisine bellenilýär, bahany bellän iň soňky mysaldaky ýaly bir üýtgeýjiniň bahasyny başga bir üýtgeýjä bellemek hem mümkindir. üýtgeýän serwere computer_name .

Recalladyňyzda bolsa, bu Awk seriýasynyň 2-nji bölüminden başlap, meýdan redaktirlemesini öz içine aldyk, Awk giriş setirlerini meýdanlara nädip bölýär we dürli meýdanlary okamak üçin adaty meýdan giriş operatory $ ulanýar. derňeldi. Şeýle hem meýdanlaryň bahalaryny aşakdaky ýaly saklamak üçin üýtgeýjileri ulanyp bileris.

first_name=$2
second_name=$3

Aboveokardaky mysallarda first_name bahasy ikinji meýdana, second_name bahasy üçünji meýdana düzüldi.

Mysal hökmünde, names.txt atly bir faýly göz öňünde tutuň, onda programma ulanyjylarynyň atlaryny we familiýalaryny we jynsyny görkezýän sanawy bar. Pişik buýrugyny ulanyp, faýlyň mazmunyny aşakdaky ýaly görüp bileris:

$ cat names.txt

Soňra, sanawdaky ilkinji ulanyjynyň birinji we ikinji atlaryny aşakdaky Awk buýrugyny ýerine ýetirmek ýaly saklamak üçin first_name we second_name üýtgeýjileri hem ulanyp bileris:

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

Başga bir meselä hem göz aýlalyň, terminalyňyzda uname -a buýrugy bereniňizde, ulgamyňyzdaky ähli maglumatlary çap edýär.

Ikinji meýdanda host adyňyz bar, şonuň üçin host adyny hostname atly üýtgeýjide saklap bileris we Awk ulanyp aşakdaky ýaly çap edip bileris:

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

2. San aňlatmalary

Awk-da san aňlatmalary aşakdaky san operatorlarynyň kömegi bilen gurulýar:

  1. * : köpeltmek operatory
  2. + : goşmaça operator
  3. /: bölüm operatory
  4. - : aýyrmak operatory
  5. % : modul operatory
  6. ^: eksponentasiýa operatory

San aňlatmalarynyň sintaksisidir:

$ operand1 operator operand2

Aboveokardaky görnüşde, operand1 we operand2 sanlar ýa-da üýtgeýän atlar bolup biler we operator ýokardaky operatorlaryň biridir.

Aşakda san aňlatmalaryny nädip gurmalydygyny görkezmek üçin käbir mysallar bar:

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

Awk-da san aňlatmalarynyň ulanylyşyna düşünmek üçin, Tecmint-e degişli ähli domenleri öz içine alýan domains.txt faýly bilen aşakdaky mysaly gözden geçireris.

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

Faýlyň mazmunyny görmek üçin aşakdaky buýrugy ulanyň:

$ cat domains.txt

linux-console.net domeniniň faýlda näçe gezek peýda bolandygyny sanamak islesek, aşakdaky ýaly etmek üçin ýönekeý skript ýazyp bileris:

#!/bin/bash
for file in [email ; 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

Scriptazgy döredilenden soň, ony ýatda saklaň we ýerine ýetirip bolýan ýerine ýetiriň, domains.txt faýly bilen işledenimizde, aşakdaky çykyşy alarys:

$ ./script.sh  ~/domains.txt

Scriptazuwyň çykyşyndan, el bilen sanap biljekdigiňizi tassyklamak üçin domains.txt faýlynda linux-console.net bar bolan 6 setir bar.

3. Belleme operatorlary

Iň soňky “Awk” aýratynlygy, bellän operatorlar, Awkda birnäçe bellän operator bar we bular aşakdakylary öz içine alýar:

  1. *=: köpeltmek belligi operatory
  2. +=: goşmaça bellemek operatory
  3. /= : bölüniş belligi operatory
  4. -=: aýyrmak belligi operatory
  5. %=: modul bellemek operatory
  6. ^= : eksponentasiýa bellemek operatory

Awk-da ýumuş amalynyň iň ýönekeý sintaksisidir:

$ variable_name=variable_name operator operand

Mysallar:

counter=0
counter=counter+1

num=20
num=num-1

Awk-daky tabşyryk amallaryny gysgaltmak üçin ýokardaky tabşyryk operatorlaryny ulanyp bilersiňiz, öňki mysallara serediň, tabşyrygy aşakdaky görnüşde ýerine ýetirip bileris:

variable_name operator=operand
counter=0
counter+=1

num=20
num-=1

Şol sebäpden, ýokarda ýazan gabyk skriptindäki Awk buýrugyny aşakdaky ýaly += belleme operatory ulanyp üýtgedip bileris:

#!/bin/bash
for file in [email ; 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” seriýasynyň bu bölüminde üýtgeýänler, san aňlatmalaryny gurmak we ýumuş operatorlaryny ulanmak bilen käbir güýçli Awk aýratynlyklaryny öz içine aldyk, üstesine-de olary nädip ulanyp boljakdygymyzyň käbir suratlary.

Bu düşünjeler beýleki programmirleme dillerindäki düşünjelerden tapawudy ýok, ýöne Awk programmirlemesinde käbir tapawutlar bolup biler.

9-njy bölümde, aýratyn nagyşlar bolan has köp Awk aýratynlyklaryna serederis: BEGIN we END . Oňa çenli Tecmint-e birikdiriň.