awk 系列:怎樣使用 awk 變數、數值表示式以及賦值運算子
我覺得 awk 系列 將會越來越好,在本系列的前七節我們討論了在 Linux 中處理檔案和篩選字串所需要的一些 awk 命令基礎。
在這一部分,我們將會進入 awk 更高階的部分,使用 awk 處理更復雜的文字和進行字串過濾操作。因此,我們將會講到 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=”admin@tecmint.com”
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
使用 cat 命令檢視列表檔案內容
然後,我們也可以使用下面的 awk 命令把列表中第一個使用者的第一個和第二個名字分別儲存到變數 first_name 和 second_name 上:
$ awk '/Aaron/{ first_name=$2 ; second_name=$3 ; print first_name, second_name ; }' names.txt
使用 Awk 命令為變數賦值
再看一個例子,當你在終端執行 'uname -a' 時,它可以列印出所有的系統資訊。
第二個欄位包含了你的主機名,因此,我們可以像下面這樣把它賦給一個叫做 hostname 的變數並且用 awk 列印出來。
$ uname -a
$ uname -a | awk '{hostname=$2 ; print hostname ; }'
使用 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
檢視檔案內容
如果想要計算出域名 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
計算一個字串或文字在檔案中出現次數的 shell 指令碼
寫完指令碼後儲存並賦予執行許可權,當我們使用檔案執行指令碼的時候,檔案 domains.txt 作為指令碼的輸入,我們會得到下面的輸出:
$ ./script.sh ~/domains.txt
計算字串或文字出現次數的指令碼
從指令碼執行後的輸出中,可以看到在檔案 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
修改了的 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
相關文章
- awk 系列:如何讓 awk 使用 Shell 變數變數
- awk使用shell變數變數
- 運算子-賦值運算子賦值
- awk變數變數
- Linux Shell Awk獲得外部變數(變數傳值)簡介Linux變數
- 1:賦值運算子函式賦值函式
- 數字索引賦值給多個變數簡單表示式索引賦值變數
- 賦值運算子(轉)賦值
- linux awk 運算子Linux
- awk中的變數變數
- awk引用shell變數變數
- If-Let 賦值運算子賦值
- 使用AWK計算某一列的所有數值和
- 變數的賦值 指標間接賦值變數賦值指標
- php之普通變數賦值、物件賦值、引用賦值的區別PHP變數賦值物件
- javascript變數賦值或者重新賦值注意事項JavaScript變數賦值
- JavaScript 等號 = 賦值運算子JavaScript賦值
- 按位“或”賦值運算子 (|=)賦值
- 配置 babel 支援物件擴充套件運算子、class 直接賦值變數等新特性Babel物件套件賦值變數
- 變數的解構賦值變數賦值
- shell 變數賦值問題變數賦值
- shell變數命名與賦值變數賦值
- php變數賦值給jsPHP變數賦值JS
- python 多變數賦值Python變數賦值
- PLSQL Language Reference-PL/SQL語言基礎-變數賦值-使用賦值語句賦值SQL變數賦值
- MySQL中變數的定義和變數的賦值使用MySql變數賦值
- 把匿名函式賦值給變數,通過變數來呼叫函式賦值變數
- 把匿名函式賦值給變數,透過變數來呼叫函式賦值變數
- Linux Awk 內建變數使用介紹Linux變數
- awk中使用shell的環境變數(轉)變數
- PLSQL Language Reference-PL/SQL語言基礎-變數賦值-對BOOLEAN變數賦值SQL變數賦值Boolean
- 物件屬性值賦給變數物件變數
- 給物件引用變數賦值(轉)物件變數賦值
- matlab中怎麼給符號變數賦值Matlab符號變數賦值
- awk內建變數NR與FNR使用詳解變數
- [Linux]變數加減賦值以及將String轉intLinux變數賦值
- PLSQL Language Reference-PL/SQL語言基礎-變數賦值-使用SELECT INTO賦值SQL變數賦值
- Python學習-算術運算子,賦值運算子和複合運算子Python賦值