awk是什么?
awk - pattern-directed scanning and processing language.
标准用法
awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
参数
-F
指定每行的分隔符
-v
在prog
执行之前定义一些变量
'prog'
格式为pattern {action}
,pattern为匹配的模式,action为执行的操作
-f
方便过长的awk命令书写,以及加强awk的可读性,可单独将awk命令放在一个文件中
file
输入文件名,可以有多个
常用内置变量
$0 | 整行内容 |
$1,$2... | 每行的第1,2...列内容(以参数FS分隔) |
FILENAME | 当前处理文件名 |
NR | 当前处理文件行号 |
NF | 当前行的列数量 |
FS | 分隔符 |
... | ... |
用法介绍
awk命令的用处在于扫描输入文件inputfile的每行,进行pattern匹配,每个pattern会绑定一个action,匹配的pattern就执行相应的action
example,命令直接执行
这应该是awk最常见的用法了,匹配以M开始的行,输出每行的第1和第3列
localhost:~ shine$ cat inputfile
name id math computer english
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
localhost:~ shine$ awk '/^M/ {print $1,$3}' inputfile
Marry 78
Mike 87
注意命令行中的程序是用单引号包围着的。这会防止shell解释程序中 $ 这样的字符,也允许程序的长度超过一行。
/^m/
是pattern,必须用/.../包裹正则表达式
{print $1,$3}
为action
- 若pattern为空则每行都匹配
- 若action为空则输出默认输出整行内容
pattern-action对也可以有多个,如
localhost:~ shine$ awk '/^M/ {print $1,$3} NR==1{print $1,$3}' inputfile
name math
Marry 78
Mike 87
将命令放在单独文件awk.sh执行,以增强可读性
./awk.sh inputfile
#!/usr/bin/awk -f
BEGIN{
mat=0
eng=0
comp=0
FS="\t"
}
NR==1{
#action部分
mat+=$3
eng+=$4
comp+=$5
if($3>80){
print "great!"$1
}
printf "%d %s %d %d %d\n",NR,$1,$3,$4,$5
}
NR==2{
printf "hello world!"
}
END{
print mat,eng,comp
}
执行方法
./awk.sh inputfile
BEGIN
在匹配pattern前,初始化一些变量
END
文件处理完成后的一些操作
pattern-action部分
和之前类似,用于匹配文本和操作
其中action中可以兼容C语言的一些基本语法,如if、for、while等
网友评论