我以爲 awk 系列 將會愈來愈好,在本系列的前七節咱們討論了在 Linux 中處理文件和篩選字符串所須要的一些 awk 命令基礎。html
在這一部分,咱們將會進入 awk 更高級的部分,使用 awk 處理更復雜的文本和進行字符串過濾操做。所以,咱們將會講到 Awk 的一些特性,諸如變量、數值表達式和賦值運算符。linux
學習 Awk 變量,數值表達式和賦值運算符git
你可能已經在不少編程語言中接觸過它們,好比 shell,C,Python 等;這些概念在理解上和這些語言沒有什麼不一樣,因此在這一小節中你不用擔憂很難理解,咱們將會簡短的說起經常使用的一些 awk 特性。github
這一小節多是 awk 命令裏最容易理解的部分,因此放鬆點,咱們開始吧。shell
在不少編程語言中,變量就是一個存儲了值的佔位符,當你在程序中新建一個變量的時候,程序一運行就會在內存中建立一些空間,你爲變量賦的值會存儲在這些內存空間上。express
你能夠像下面這樣定義 shell 變量同樣定義 Awk 變量:編程
variable_name=value
上面的語法:vim
variable_name
: 爲定義的變量的名字value
: 爲變量賦的值再看下面的一些例子:windows
computer_name=」tecmint.com」 port_no=」22」 email=」admin@tecmint.com」 server=computer_name
觀察上面的簡單的例子,在定義第一個變量的時候,值 'tecmint.com' 被賦給了 'computer_name' 變量。bash
此外,值 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 把命令的輸出賦給變量
在 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 行,你能夠本身計算進行驗證。
咱們要說的最後的 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