gawk進階

1、使用變量

 gawk支持兩種不一樣類型的變量:正則表達式

  • 內建變量
  • 自定義變量

1.1 內建變量

①字段和記錄分隔符變量shell

 FIELDWIDTHS:有空格分割的一列數字,定義了每一個數據字段確切寬度express

  • FS:輸入字段分隔符
  • RS:輸入記錄分隔符
  • OFS:輸出字段分隔符
  • ORS:輸出記錄分隔符
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS=","; OFS="-"} {print $1,$2,$3}' data1
data11-data12-data13
data21-data22-data23
data31-data32-data33
chen@ubuntu:~/shell/ch22$ cat data1 
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS=","; OFS="--"} {print $1,$2,$3}' data1
data11--data12--data13
data21--data22--data23
data31--data32--data33
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS=","; OFS="<-->"} {print $1,$2,$3}' data1
data11<-->data12<-->data13
data21<-->data22<-->data23
data31<-->data32<-->data33

cat data1b 
1005.3247596.37
115-2.349194.00
05180.1298100.1
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FIELDWIDTHS="3 5 2 5"}{print $1,$2,$3,$4}' data1b
100 5.324 75 96.37
115 -2.34 91 94.00
051 80.12 98 100.1


chen@ubuntu:~/shell/ch22$ cat data2
Riley Mullen
123 Main Street
Chicago, IL 60601
(312)555-1234

Frank Williams
456 Oak Street
Indianapolis, IN 46201
(317)555-9876

Haley Snell
4231 Elm Street
Detroit, MI 48201
(313)555-4938
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS="\n"; RS=""}{print $1,$4}' data2
Riley Mullen (312)555-1234
Frank Williams (317)555-9876
Haley Snell (313)555-4938
#把換行符變成字段分隔符,把空行當作一個字段分隔符
字段分隔符例子

②數據變量ubuntu

  • ARGC:當前命令行參數個數
  • ARGIND:當前文件在ARGV中的位置
  • ARGV:包含命令行參數的數組
  • CONVFMT:數字的轉換格式
  • ENVIRON:當前shell環境變量及其值組成的關聯數組
  • ERRNO:當讀取或閉輸入文件發生錯誤時的系統錯誤號
  • FILENAME:用做gawk輸入數據的數據文件的文件名
  • FNR:當前數據文件中的數據行數
  • IGNORECASE:設成非零值時,忽略gawk命令中出現的字符串的字符大小寫
  • NF:數據文件中的字段總數
  • NR:已處理的輸入記錄數
  • OFMT:數字的輸出格式,默認值爲%.6g
  • RLENGTH:由match函數所匹配的子字符串的長度
  • RSTART:由match函數所匹配的子字符串的起始位置
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{print ARGC,ARGV[1]}' data1
2 data1
chen@ubuntu:~/shell/ch22$ cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{print ARGC,ARGV[0]}' data1
2 gawk
chen@ubuntu:~/shell/ch22$ gawk '
> BEGIN{
> print ENVIRON["HOME"]
> print ENVIRON["PATH"]
> }'
/home/chen
/home/chen/bin:/home/chen/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS=":"; OFS=":"} {print $1,$NF}' /etc/passwd
root:/bin/bash
daemon:/usr/sbin/nologin
bin:/usr/sbin/nologin
sys:/usr/sbin/nologin

chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{FS=","}{print $1,"FNR="FNR}' data1 data1
data11 FNR=1
data21 FNR=2
data31 FNR=3
data11 FNR=1
data21 FNR=2
data31 FNR=3
chen@ubuntu:~/shell/ch22$ cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
數據變量例子

1.2 自定義變量

gawk自定義變量名能夠是任意數目的字母、數字和下劃線。gawk變量名區分大小寫。api

①在腳本中給變量賦值

chen@ubuntu:~/shell/ch22$ gawk '
> BEGIN{
> testing="This is a test"
> print testing
> }'
This is a test
chen@ubuntu:~/shell/ch22$ gawk '
> BEGIN{
> testing="This is a test"
> print testing
> testing=45
> print testing
> }'
This is a test
45

chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{x=4; x= x * 2 + 3; print x}'
11
變量賦值例子

②在命令行上給變量賦值

chen@ubuntu:~/shell/ch22$ cat script1 
BEGIN{FS=","}
{print $n}
chen@ubuntu:~/shell/ch22$ gawk -f script1 n=2 data1
data12
data22
data32
chen@ubuntu:~/shell/ch22$ gawk -f script1 n=3 data1
data13
data23
data33

chen@ubuntu:~/shell/ch22$ gawk -f script2 n=3 data1
The starting value is 
data13
data23
data33
chen@ubuntu:~/shell/ch22$ cat script2 
BEGIN{print "The starting value is",n; FS=","}
{print $n}

chen@ubuntu:~/shell/ch22$ gawk -v n=3 -f script2 data1
The starting value is 3
data13
data23
data33
命令行上給變量賦值例子

 

2、處理數組

2.1 定義數組變量

數組變量賦值的格式以下:數組

var[index] = elementbash

其中var是變量,index是關聯數組的索引值,element是數據元素ide

chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{
> capital["Illinois"] = "Springfield"
> print capital["Illinois"]
> }'
Springfield
chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{
> var[1] = 34
> var[2] = 3
> total = var[1] + var[2]
> print total
> }'
37
定義數組變量

 

2.2 遍歷數組變量

gawk中遍歷數組,用一種for的特殊形式函數

for ( var in array )
{
  statements
}

使用例子:spa

chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{
var["a"] = 1
var["g"] = 2
var["m"] = 3
var["u"] = 4
for ( test in var)
{
    print "Index:",test," - Value:",var[test]
}
}'
Index: u  - Value: 4
Index: m  - Value: 3
Index: a  - Value: 1
Index: g  - Value: 2
數組遍歷

 

2.3 刪除數組變量

從關聯數組中刪除數組索引要用一個特殊的命令。

delete array[index]

刪除命令會從數組中刪除關聯索引值和相關的數據元素值

chen@ubuntu:~/shell/ch22$ gawk 'BEGIN{
> var["a"] = 1
> var["g"] = 2
> for (test in var)
> {
>     print "Index:",test," - Value:",var[test]
> }
> delete var["g"]
> print "---"
> for (test in var)
>     print "Index:",test," - Value:",var[test]
> }'
Index: a  - Value: 1
Index: g  - Value: 2
---
Index: a  - Value: 1
刪除例子

 

3、使用模式

本節將會演示如何在gawk腳本中用匹配模式來限定程序腳本做用在哪些記錄上。

3.1 正則表達式

在使用正則表達式時,正則表達式必須出如今它要控制的程序腳本的左花括號前。 

myfly2@ubuntu:~$ cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
myfly2@ubuntu:~$ awk 'BEGIN{FS=","} /11/{print $1}' data1
data11
myfly2@ubuntu:~$ awk 'BEGIN{FS=","} /,d/{print $1}' data1
data11
data21
data31
匹配符例子

3.2 匹配操做符

匹配操做符:容許將正則表達式限定在記錄中的特定數據字段。

匹配操做符是波浪線(~)。能夠指定匹配操做符、數據字段變量以及要匹配的正則表達式。

$1 ~ /^data/

$1:表明記錄中的第一個數據字段。這個表達式會過濾出第一個字段以文本data開頭的全部記錄。

myfly2@ubuntu:~$ awk 'BEGIN{FS=","} $2 ~ /^data2/{print $0}' data1
data21,data22,data23,data24,data25

myfly2@ubuntu:~$ awk -F: '$1 ~ /myfly/{print $1,$NF}' /etc/passwd
myfly2 /bin/bash
匹配操做符例子

$1 !~ /expression/

myfly2@ubuntu:~$ awk -F: '$1 !~ /myfly2/{print $1,$NF}' /etc/passwd
root /bin/bash
daemon /usr/sbin/nologin
bin /usr/sbin/nologin
sys /usr/sbin/nologin
sync /bin/sync
games /usr/sbin/nologin
man /usr/sbin/nologin
lp /usr/sbin/nologin
!~例子

 

3.3 數學表達式

除了正則表達式,也能夠在匹配模式中用數學表達式。 經常使用的表達式:

  • x == y:值x等於y
  • x <= y:值x小於等於y
  • x < y:值x小於y
  • x >= y:值x大於等於y
  • x > y:值x大於y
myfly2@ubuntu:~$ awk -F: '$4 == 0{print $1}' /etc/passwd
root
myfly2@ubuntu:~$ awk -F, '$1 == "data"{print $1}' data1
myfly2@ubuntu:~$ cat data1
data11,data12,data13,data14,data15
data21,data22,data23,data24,data25
data31,data32,data33,data34,data35
myfly2@ubuntu:~$ awk -F, '$1 == "data11"{print $1}' data1
data11

#與正則表達式不一樣,數學表達式必須徹底匹配
例子

 

4、結構化命令

4.1 if語句

gawk支持標準的if-then-else格式的if語句。 

格式: if (condition)

  statement1

也能夠這樣:if (condition) statement1

awk '{if ($1 > 20) print $1}' data4
50
34
myfly2@ubuntu:~/shell/ch22$ awk '{
> if ($1 > 20)
> {
>     x = $1 * 2
>     print x
> }
> }' data4
100
68
if-then例子

 

4.2 while語句

基本循環的格式:

while (condition)

{

  statement1

}

myfly2@ubuntu:~/shell/ch22$ awk '{
total = 0
i = 1
while (i<4)
{
    total += $i
    i++
}
avg = total / 3
print "Average:",avg
}' data5
Average: 128.333
Average: 137.667
Average: 176.667
myfly2@ubuntu:~/shell/ch22$ awk '{
> total = 0
> i = 1
> while (i<4)
> {
>     total += $i
>     if(i == 2)
>         break
>     i++
> }
> avg = total /2
> print "The average of the first two data elements is:",avg
> }' data5
The average of the first two data elements is: 125
The average of the first two data elements is: 136.5
The average of the first two data elements is: 157.5
while例子

 

4.3 do-while語句

格式:

do

{

  statements

}

myfly2@ubuntu:~/shell/ch22$ awk '{
> total = 0
> i = 1
> do
> {
>     total += $i
>     i++
> }
> while (total < 150)
> print total }' data5
250
160
315
do while例子

 

4.4 for語句

格式:for( variable assignment; condition; iteration process)

myfly2@ubuntu:~/shell/ch22$ awk '{
> total = 0
> for(i=1;i<4;i++)
> {
>     total += $i
> }
> avg = total / 3
> print "Average:",avg
> }' data5
Average: 128.333
Average: 137.667
Average: 176.667
for例子

 

5、格式化打印

 

6、內建函數

6.1 數學函數

 

6.2 字符串函數

 

6.3 時間函數

 

7、自定義函數

7.1 定義函數

 

7.2 使用自定義函數

 

7.3 建立函數庫

 

8、實例

相關文章
相關標籤/搜索