awk基本语法
一个awk指令由一个模式(pattern)后跟一个动作(action)组成,动作被括在{ }内,用来与模式分隔。
pattern { action }
—awk常用选项如下—
- -F fs——指定用于输出数据的列分割符
- -v var=value——在awk程序执行之前指定一个value给变量var。这些变量值用于awk程序的BEGIN块。
- -f program file——指定一个awk程序文件,代替在命令行指定wak命令。
- “–” 选项——根据POSIX参数解析约定,此选项表示命令行选项的结束。例如,利用这个选项可以指定以“-” 开头的输入文件,否则它将被解析为一个命令行选项。
运行awk主要有两种方式:
- 如果awk程序很短,则可以在命令行直接运行awk命令,如下
awk [OPTIONS] [--] program-text file … …
##打印/etc/passwd文件,相当于cat /etc/passwd
$ awk 'print' /etc/passwd
lwl:x:1000:1000:lwl:/home/lwl:/bin/bash
oracle:x:1002:1003::/home/oracle:/bin/bash
mysql:x:1003:1004::/home/mysql:/bin/bash
… …
$ awk 'BEGIN { FS=":" } $1=="lwl" {print $7}' /etc/passwd
/bin/bash
$ awk -F: '/lwl/{print $7}' /etc/passwd
/bin/bash
$ awk -F: '{print $7}' /etc/passwd | wc -l
49
##~ 表示匹配
$ awk 'BEGIN { FS=":"} ($1 ~ "lwl" || $1 ~ "mysql") {print}' /etc/passwd
lwl:x:1000:1000:lwl:/home/lwl:/bin/bash
mysql:x:1003:1004::/home/mysql:/bin/bash
$ awk 'BEGIN { FS=":"} {if ($1 ~ "lwl" || $1 ~ "mysql") {print}}' /etc/passwd
lwl:x:1000:1000:lwl:/home/lwl:/bin/bash
mysql:x:1003:1004::/home/mysql:/bin/bash
注释:FS变量,设置希望awk在列之间查找的字符序列
##info.txt文件中内容
$ cat info.txt
Mat wshed(markers.size(), CV_8UC3)
printf( "execution time = %gms\n", t*1000./getTickFrequency() )
int b = theRNG().uniform(0, 255)
int g = theRNG().uniform(0, 255)
int r = theRNG().uniform(0, 255)
##NF此变量记录的是列的数量,此条语句用于输出列数超过3列行的内容
$ awk '{if (NF > 3) {print NR ".\t" $0 } }' info.txt
2. printf( "execution time = %gms\n", t*1000./getTickFrequency() )
3. int b = theRNG().uniform(0, 255)
4. int g = theRNG().uniform(0, 255)
5. int r = theRNG().uniform(0, 255)
##特殊变量NR,用于记录当前记录的数量(awk将第一条记录记录的数字为1),此条语句用于打印info.txt中第三行以后输入记录
$ awk '{if (NR > 3) {print NR ".\t" $0 } }' info.txt
4. int g = theRNG().uniform(0, 255)
5. int r = theRNG().uniform(0, 255)
##awk的 while循环语句,语法形式
## whlie(condition)
## program-body
## whlie循环第一件事就是检查循环条件condition,如果不成立这直接执行循环外的语句,如果成立这一直执行下去,
## 如下awk语句是,打印info.txt每行的前三列。(默认以空格分隔)
$ awk '{
> i=1
> while (i <= 3) {
> print $i
> i++
> }
> }' info.txt
Mat
wshed(markers.size(),
CV_8UC3)
printf(
"execution
time
int
b
=
int
g
=
int
r
=
##for循环
$ awk '{
> for ( i=1; i<=3; i++)
> print $i
> }' info.txt
Mat
wshed(markers.size(),
CV_8UC3)
printf(
"execution
time
int
b
=
int
g
=
int
r
=
2. 当一个awk程序较长得时候,通常把他放到文件内,此方法语法:
awk [OPTIONS] -f program-file [--] file …
##同样使用info.txt文件
##创建文件名为myAWKscript 内容如下:
$ cat myAWKscript
BEGIN {
FS=" "
}
{ print $2}
$ awk -f myAWKscript info.txt
wshed(markers.size(),
"execution
b
g
r
$ cat awkSearchPatternBetter.sh
#!/bin/bash
##从标准输入读取变量pattern的直
read -p "Enter seach pattern: " pattern
##使用awk的-v选项指定pat,并将shell变量的直赋给pat变量,在处理完成打印匹配的总次数
awk -v pat="${pattern}" '$0 ~ pat { nmatches++; print} END { print nmatches, "found."}' info.txt
$ ./awkSearchPatternBetter.sh
Enter seach pattern: uniform
int b = theRNG().uniform(0, 255)
int g = theRNG().uniform(0, 255)
int r = theRNG().uniform(0, 255)
3 found.