awk 系列Part8:怎樣使用 awk 變量、數值表達式以及賦值運算符

awk 系列:怎樣使用 awk 變量、數值表達式以及賦值運算符

我覺得 awk 系列 將會越來越好,在本系列的前七節我們討論了在 Linux 中處理文件和篩選字符串所需要的一些 awk 命令基礎。

在這一部分,我們將會進入 awk 更高級的部分,使用 awk 處理更復雜的文本和進行字符串過濾操作。因此,我們將會講到 Awk 的一些特性,諸如變量、數值表達式和賦值運算符。

awk 系列Part8:怎樣使用 awk 變量、數值表達式以及賦值運算符

學習 Awk 變量,數值表達式和賦值運算符

你可能已經在很多編程語言中接觸過它們,比如 shell,C,Python 等;這些概念在理解上和這些語言沒有什麼不同,所以在這一小節中你不用擔心很難理解,我們將會簡短的提及常用的一些 awk 特性。

這一小節可能是 awk 命令裏最容易理解的部分,所以放鬆點,我們開始吧。

1. Awk 變量

在很多編程語言中,變量就是一個存儲了值的佔位符,當你在程序中新建一個變量的時候,程序一運行就會在內存中創建一些空間,你爲變量賦的值會存儲在這些內存空間上。

你可以像下面這樣定義 shell 變量一樣定義 Awk 變量:

variable_name=value 

上面的語法:

  • variable_name: 爲定義的變量的名字
  • value: 爲變量賦的值

再看下面的一些例子:

computer_name=”tecmint.com”
port_no=”22”
email=”[email protected]”
server=computer_name

觀察上面的簡單的例子,在定義第一個變量的時候,值 'tecmint.com' 被賦給了 'computer_name' 變量。

此外,值 22 也被賦給了 port_no 變量,把一個變量的值賦給另一個變量也是可以的,在最後的例子中我們把變量 computer_name 的值賦給了變量 server。

你可以看看本系列的第 2 節中提到的字段編輯,我們討論了 awk 怎樣將輸入的行分隔爲若干字段並且使用標準字段訪問操作符 $ 來訪問拆分出來的不同字段。我們也可以像下面這樣使用變量爲字段賦值。

first_name=$2
second_name=$3

在上面的例子中,變量 first_name 的值設置爲第二個字段,second_name 的值設置爲第三個字段。

再舉個例子,有一個名爲 names.txt 的文件,這個文件包含了一個應用程序的用戶列表,這個用戶列表包含了用戶的名和姓以及性別。可以使用 cat 命令 查看文件內容:

$ cat names.txt

awk 系列Part8:怎樣使用 awk 變量、數值表達式以及賦值運算符

使用 cat 命令查看列表文件內容

然後,我們也可以使用下面的 awk 命令把列表中第一個用戶的第一個和第二個名字分別存儲到變量 first_name 和 second_name 上:

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

awk 系列Part8:怎樣使用 awk 變量、數值表達式以及賦值運算符

使用 Awk 命令爲變量賦值

再看一個例子,當你在終端運行 'uname -a' 時,它可以打印出所有的系統信息。

第二個字段包含了你的主機名,因此,我們可以像下面這樣把它賦給一個叫做 hostname 的變量並且用 awk 打印出來。

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

awk 系列Part8:怎樣使用 awk 變量、數值表達式以及賦值運算符

使用 Awk 把命令的輸出賦給變量

2. 數值表達式

在 Awk 中,數值表達式使用下面的數值運算符組成:

  • * : 乘法運算符
  • + : 加法運算符
  • / : 除法運算符
  • - : 減法運算符
  • % : 取模運算符
  • ^ : 指數運算符

數值表達式的語法是:

$ operand1 operator operand2

上面的 operand1 和 operand2 可以是數值和變量,運算符可以是上面列出的任意一種。

下面是一些展示怎樣使用數值表達式的例子:

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

要理解 Awk 中數值表達式的用法,我們可以看看下面的例子,文件 domians.txt 裏包括了所有屬於 Tecmint 的域名。

news.tecmint.com
tecmint.com
linuxsay.com
windows.tecmint.com
tecmint.com
news.tecmint.com
tecmint.com
linuxsay.com
tecmint.com
news.tecmint.com
tecmint.com
linuxsay.com
windows.tecmint.com
tecmint.com

可以使用下面的命令查看文件的內容:

$ cat domains.txt

awk 系列Part8:怎樣使用 awk 變量、數值表達式以及賦值運算符

查看文件內容

如果想要計算出域名 tecmint.com 在文件中出現的次數,我們就可以通過寫一個簡單的腳本實現這個功能:

#!/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 tecmint.com 
awk  '/^tecmint.com/ { 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

awk 系列Part8:怎樣使用 awk 變量、數值表達式以及賦值運算符

計算一個字符串或文本在文件中出現次數的 shell 腳本

寫完腳本後保存並賦予執行權限,當我們使用文件運行腳本的時候,文件 domains.txt 作爲腳本的輸入,我們會得到下面的輸出:

$ ./script.sh  ~/domains.txt

awk 系列Part8:怎樣使用 awk 變量、數值表達式以及賦值運算符

計算字符串或文本出現次數的腳本

從腳本執行後的輸出中,可以看到在文件 domains.txt 中包含域名 tecmint.com 的地方有 6 行,你可以自己計算進行驗證。

3. 賦值操作符

我們要說的最後的 Awk 特性是賦值操作符,下面列出的只是 awk 中的部分賦值運算符:

  • *= : 乘法賦值操作符
  • += : 加法賦值操作符
  • /= : 除法賦值操作符
  • -= : 減法賦值操作符
  • %= : 取模賦值操作符
  • ^= : 指數賦值操作符

下面是 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

因此,我們可以在 shell 腳本中改變 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 tecmint.com 
awk  '/^tecmint.com/ { 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 系列Part8:怎樣使用 awk 變量、數值表達式以及賦值運算符

修改了的 shell 腳本

awk 系列 的這一部分,我們討論了一些有用的 awk 特性,有變量,使用數值表達式和賦值運算符,還有一些使用它們的實例。

這些概念和其他的編程語言沒有任何不同,但是可能在 awk 中有一些意義上的區別。

在本系列的第 9 節,我們會學習更多的 awk 特性,比如特殊格式: BEGIN 和 END。請繼續關注。


via: http://www.tecmint.com/learn-awk-variables-numeric-expressions-and-assignment-operators/

作者:Aaron Kili
譯者:vim-kakali
校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章