awk
awk语句由模式(pattern)和动作(action)组成。
awk 支持 ”?” 和 “+” 两个扩展元字符,而grep和sed并不支持。
awk的三种用法
awk -F’分隔符’ “awk程序段” inputfile
awk -f awk脚本 inputfile
./awk 脚本文件 inputfile
cp /etc/passwd ./input
1.awk第1种调用方法(打印空行)
awk '/^$/ {print "this is a blankline."}' input
2.第2种调用awk方法
[root@attzz test]#cat src.awk
/^$/{print"this is a blank line."}
[root@attzz test]# awk -f src.awk input
3.第3种调用awk方法
[root@attzz test]# cat src.awk
#!/bin/awk-f
/^$/{print"this is a blank line."}
[root@attzz test]# chmod u+x src.awk; ./src.awk input
awk 默认以空格为分割符
awk -F ‘\t’ 发tab键为分割符
1awk -FS=”\t” 以一个tab键为分割符
2awk -FS=”\t+” 以一个或多个tab键为分割符
ifelz\t\tzz 1解析为 ifelz、空域、zz
2解析为 ifelz和zz,两个域
$1表示第一个域 $0表示所有的域
awk关系运算符及其意义
< > <= >= == != ~ !~ ~匹配正则表达式
4.例使用正则表达式~,打印出/etc/passwd文件中第一个域为’root’的记录
[root@attzz test]# awk 'FS=":" $1~/root/' input == awk 'BEGIN {FS=":"} $1~/root/'input
root:x:0:0:root:/root:/bin/bash
awk 'FS=":"$0~/root/' input 匹配所有包含’root’的行
awk 'FS=":"$0!~/nologin/' input
awk中的if语句
awk 'FS=":"{if ($3>$4) print $0}' input
grep ^[^$] input| awk 'FS=":" {print $3}'| sort –n grep ^[^$] inputg不过滤空行
awk 'FS=":" { if ($3<10)print $3 }'
4.awk布尔运算符及其意义
|| && !
==精确 ~模糊
awk 'FS=":" {if ($3==9 && $4==0) print $0}' input 精确匹配
awk 'FS=":" {if ($3~9 && $4~0) print $0}' input 模糊匹配
awk算术运算及其意义
+ - * / % ^或** ++x x++
[root@attzz test]# awk'/^$/ {print ++x}' input
1
2
3
[root@attzz test]# awk'/^$/ {print x+=1}' input
1
2
3
[root@attzz test]# awk '/^$/ {print x++}' input
0
1
2
[root@attzz test]# awk '/^$/ {print x++1}' input
01
11
21
5.系统变量
ARGV | 命令行参数数组 |
ENVIRON | 环境变量数组 |
FILENAME | 当前输入文件名 |
FNR | 当前文件中的记录号 |
FS | 字段分隔符 |
IGNORECASE | 忽略正则表达式和串的大小写 |
NF | 当前记录中的字段数 |
NR | 至今读取的记录数 |
OFMT | 数的输出格式,缺省为"%.6g" |
OFS | 输出字段分隔符 |
ORS | 输出记录分隔符 |
RS | 输入记录分隔符 |
RSTART | 由match() 匹配的第一个字符的索引 |
RLENGTH | 由match() 匹配的串的长度 |
SUBSEP | 下标分隔符,缺省为”\34” |
[root@attzz test]# tail -3 input |awk 'FS=":" { print NF,NR,$0}' NF:符串段数
8 1 oprofile:x:16:16:Special user account to be used byOProfile:/home/oprofile:/sbin/nologin
7 2 jack:x:500:500::/home/jack:/bin/bash
7 3 tom:x:501:501::/home/tom:/bin/bash
[root@attzz test]#
awk 'BEGIN{FS=":"} {print NF,NR,$0} END {print FILENAME}' input
6.printf修饰符及基意义
- 左对齐
width 域的步长
.prec 小数点右边的位数
printf格式符及基意义
%c ASCII字符 %o 八进制数
%d 整型数 %s 字符串
%e 浮点数,科学记数法 %x 十六进制数
%f 浮点数
awk 'FS=":" { printf ("%d\t%s\n",$3,$6) }' “printf“
[root@attzz test]# awk 'BEGIN{printf ("%c\t%f\n",89,99)}' 此时必须打BEGIN
Y 99.000000
[root@attzz test]#
[root@attzz test]# awk 'BEGIN {FS=","} { printf("%-15s\t%s\n",$1,$3)}' file “BEGIN“
li hao 027-2348797
zh jdu 027-7463528
ds fwk 027-2890763
ld wek 027-1987634
“%10.3f“ 默认为右对齐
7.内置字符串函数
gsub(r,s,t) | 在字符串t中,用字符串s替换和正则表达式r匹配的所有字符串。返回替换的个数。如果没有给出t,缺省为$0 |
index(s,t) | 返回s 中字符串t 的位置,不出现时为0 |
length(s) | 返回字符串s 的长度,当没有给出s时,返回$0的长度 |
match(s,r) | 返回r 在s 中出现的位置,不出现时为0。设置RSTART和RLENGTH的值 |
split(s,a,r) | 利用r 把s 分裂成数组a,返回元素的个数。如果没有给出r,则使用FS。数组分割和字段分割采用同样的方式 |
sprintf(fmt,expr_list) | 根据格式串fmt,返回经过格式编排的expr_list |
sub(r,s,t) | 在字符串t中用s替换正则表达式t的首次匹配。如果成功则返回1,否则返回0。如果没有给出t,默认为$0 |
substr(s,p,n) | 返回字符串s中从位置p开始最大长度为n的字串。如果没有给出n,返回从p开始剩余的字符串 |
tolower(s) | 将串s 中的大写字母改为小写,返回新串 |
toupper(s) | 将串s 中的小写字母改为大写,返回新串 |
gsub 替换
[root@attzz test]# awk ' BEGIN{ FS=":";OFS="---"} gsub(/root/,"gridsphere",$1){print $0}' input
gridsphere---x---0---0---root---/root---/bin/bash
[root@attzz test]#
[root@attzz test]# awk ' BEGIN {FS=":";OFS=":"} gsub(/root/,"gridsphere") {print$0}' input
gridsphere:x:0:0:gridsphere:/gridsphere:/bin/bash
operator:x:11:0:operator:/gridsphere:/sbin/nologin
index和length
[root@attzz test]# awk 'BEGIN{print index("gridsphere","ph")}'第2个字符在字符串出现位置
6
[root@attzz test]# awk 'BEGIN {printlength("gridsphere")}' 返回字符串的长度
10
match(s,t),t可以为正则
[root@attzz test]# awk 'BEGIN{print match("gridsphere",/D/)}' 返回字符所在位置
0
[root@attzz test]# awk 'BEGIN{IGNORECASE=1;print match("gridsphere",/D/)}'
4
IGNORECASE=1 忽略大小写(awk严格区分大小写)
sub函数
[root@attzz test]# awk 'BEGIN {FS=","} { $1~/li/sub(/10/,"99",$0);print $0}' file
li hao,fsd,027-2379799,45,67,78,35
zh jdu,dks,027-7499528,67,25,98,76
ds fwk,sfd,027-2890763,89,56,72,18
ld wek,fsd,027-1989910,87,34,13,65
substr函数
[root@attzz test]# awk 'BEGIN{str="multiprocessor programming"; print substr(str,6)}'
processor programming
[root@attzz test]# awk 'BEGIN{str="multiprocessor programming"; print substr(str,6,9)}'
processor
[root@attzz test]#
附算术运算符
x^y x的y次幂
x**y 同上
x%y 计算x/y的余数(求模)
x+y x加y
x-y x减y
x*y x乘y
x/y x除y
-y 负y(y的开关符号);也称一目减
++y y加1后使用y(前置加)
y++ 使用y值后加1(后缀加)
–y y减1后使用y(前置减)
y– 使用后y减1(后缀减)
x=y 将y的值赋给x
x+=y 将x+y的值赋给x
x-=y 将x-y的值赋给x
x*=y 将x*y的值赋给x
x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x
x^=y 将x^y的值赋给x
x**=y 将x**y的值赋给x