注:假设列表中的变脸值为x = A, y = 15, z = 2.3, $1 = "Bob Smith"/> echo "Linux" | awk '{printf "|%-15s|\n", $1}'# %-15s表示保留15个字符的空间,同时左对齐。|Linux |/> echo "Linux" | awk '{printf "|%15s|\n", $1}'# %-15s表示保留15个字符的空间,同时右对齐。| Linux|
#%8d表示数字右对齐,保留8个字符的空间。/> awk '{printf "The name is %-15s ID is %8d\n", $1,$3}' employeesThe name is Tom ID is 4424
The name is Mary ID is 5346
The name is Sally ID is 1654
The name is Billy ID is 16833. awk中的记录和域:awk中默认的记录分隔符是回车,保存在其内建变量ORS和RS中。$0变量是指整条记录。/> awk '{print $0}' employees#这等同于print的默认行为。Tom Jones 4424 5/12/66 543354
Mary Adams 5346 11/4/63 28765
Sally Chang 1654 7/22/54 650000
Billy Black 1683 9/23/44 336500变量NR(Number of Record),记录每条记录的编号。/> awk '{print NR, $0}' employees1 Tom Jones 4424 5/12/66 543354
2 Mary Adams 5346 11/4/63 28765
3 Sally Chang 1654 7/22/54 650000
4 Billy Black 1683 9/23/44 336500变量NF(Number of Field),记录当前记录有多少域。/> awk '{print $0,NF}' employeesTom Jones 4424 5/12/66 543354 5
Mary Adams 5346 11/4/63 28765 5
Sally Chang 1654 7/22/54 650000 5
Billy Black 1683 9/23/44 336500 5
#根据employees生成employees2。sed的用法可以参考上一篇blog。/> sed 's/[[:space:]]\+\([0-9]\)/:\1/g;w employees2' employees/> cat employeesTom Jones:4424:5/12/66:543354
Mary Adams:5346:11/4/63:28765
Sally Chang:1654:7/22/54:650000
Billy Black:1683:9/23/44:336500/> awk -F: '/Tom Jones/{print $1,$2}' employees2#这里-F选项后面的字符表示分隔符。Tom Jones 4424变量OFS(Output Field Seperator)表示输出字段间的分隔符,缺省是空格。/> awk -F: '{OFS = "?"}; /Tom/{print $1,$2 }' employees2#在输出时,域字段间的分隔符已经是?(问号)了Tom Jones?4424对于awk而言,其模式部分将控制这动作部分的输入,只有符合模式条件的记录才可以交由动作部分基础处理,而模式部分不仅可以写成正则表达式(如上面的例子),awk还支持条件表达式,如:/> awk '$3 < 4000 {print}' employeesSally Chang 1654 7/22/54 650000
Billy Black 1683 9/23/44 336500在花括号内,用分号分隔的语句称为动作。如果模式在动作前面,模式将决定什么时候发出动作。动作可以是一个语句或是一组语句。语句之间用分号分隔,也可以用换行符,如:pattern { action statement; action statement; etc. } orpattern {action statementaction statement}模式和动作一般是捆绑在一起的。需要注意的是,动作是花括号内的语句。模式控制的动作是从第一个左花括号开始到第一个右花括号结束,如下:/> awk '$3 < 4000 && /Sally/ {print}' employeesSally Chang 1654 7/22/54 6500004.匹配操作符:" ~ "用来在记录或者域内匹配正则表达式。/> awk '$1 ~ /[Bb]ill/' employees#显示所有第一个域匹配Bill或bill的行。Billy Black 1683 9/23/44 336500/> awk '$1 !~ /[Bb]ill/' employees#显示所有第一个域不匹配Bill或bill的行,其中!~表示不匹配的意思。Tom Jones 4424 5/12/66 543354
Mary Adams 5346 11/4/63 28765
Sally Chang 1654 7/22/54 6500005. awk的基本应用实例:/> cat testfilenorthwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13/> awk '/^north/' testfile#打印所有以north开头的行。northwest NW Charles Main 3.0 .98 3 34
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9/> awk '/^(no|so)/' testfile#打印所有以so和no开头的行。northwest NW Charles Main 3.0 .98 3 34
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9/> awk '$5 ~ /\.[7-9]+/' testfile#第五个域字段匹配包含.(点),后面是7-9的数字。southwest SW Lewis Dalsass 2.7 .8 2 18
central CT Ann Stephens 5.7 .94 5 13/> awk '$8 ~ /[0-9][0-9]$/{print $8}' testfile#第八个域以两个数字结束的打印。34
23
18
15
17
20
13