gawk支持兩種不一樣類型的變量:正則表達式
①字段和記錄分隔符變量shell
FIELDWIDTHS:有空格分割的一列數字,定義了每一個數據字段確切寬度express
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
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
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
數組變量賦值的格式以下:數組
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
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
從關聯數組中刪除數組索引要用一個特殊的命令。
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
本節將會演示如何在gawk腳本中用匹配模式來限定程序腳本做用在哪些記錄上。
在使用正則表達式時,正則表達式必須出如今它要控制的程序腳本的左花括號前。
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
匹配操做符:容許將正則表達式限定在記錄中的特定數據字段。
匹配操做符是波浪線(~)。能夠指定匹配操做符、數據字段變量以及要匹配的正則表達式。
$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
除了正則表達式,也能夠在匹配模式中用數學表達式。 經常使用的表達式:
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 #與正則表達式不一樣,數學表達式必須徹底匹配
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
基本循環的格式:
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
格式:
do
{
statements
}
myfly2@ubuntu:~/shell/ch22$ awk '{ > total = 0 > i = 1 > do > { > total += $i > i++ > } > while (total < 150) > print total }' data5 250 160 315
格式: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
5、格式化打印
6、內建函數
6.1 數學函數
6.2 字符串函數
6.3 時間函數
7、自定義函數
7.1 定義函數
7.2 使用自定義函數
7.3 建立函數庫
8、實例