linux下熟悉使用awk的指令结构
正则里分为基础正则,和扩展正则。基础正则一般的命令就是grep和sed。而awk和egrep不止可以在基础正则内使用,还可以在扩展正则内使用。之前咱们见过sed了,其实grep和sed差不多,只是基本的语法有出入。而今天和大家说的awk,其实使用方法和egrep也差不多。
awk 指令结构格式
1、确保整个awk命令用单引号括起来
2、确保命令内所有引号成对出现
3、确保用花括号括起动作语句,用圆括号括起条件语句
4、确保动作语句打印的字符串及转义字符用双引号引起来。
awk条件操作符
|操作符 |描述 |操作符 |描述 |
|------|---------|---------|---------|
|< |小于 |== |等于 |
|>= |大于等于 |~ |匹配正则 |
|<= |大于等于 |!= |不等于 |
|> |大于 |!~ |不匹配正则|
awk条件逻辑操作符
| 操作符 | 描述 |
|---------|---------|
| && | 与运算 |
| || | 或运算 |
| ! | 非运算 |
awk内置变量
内置变量名称 | 描述
--------------|--------------
ARGC |命令行参数个数
ARGV |命令行参数排列
ENVIRON |支持队列中系统环境变量的使用
FILENAME |awk浏览的文件名称
FNR |浏览文件的记录数
FS |设置输入域分隔符,等价命令行-F选项
NF |记录浏览域的个数
NR |已读的记录数
OFS |输出域分隔符
ORS |输出记录分隔符
RS |控制记录分隔符
awk中使用操作符,基本表达式可以划分为数字型,字符串型,变量型,域,数组元素
赋值操作符 = += *= /- %= ^=
条件表达操作符 ?
并、与、非 || && !
匹配操作符 ~ !~
关系操作符 < <= == != >>
算术操作符 + - * / % ^
前缀和后缀 ++ --
awk的常用内置字符串函数
函数 | 描述
---------------|---------------
gsub(r,s) |在整个$0中用s替代r(全局替换)
gsub(r,s,t) |在整个t中用s替换r(全局替换)
index(s,t) |返回s中字符串的t的第一位置
length(s) |返回s长度
match(s,r) |测试s是否包含匹配r的字符串
gsplit(s,a,fs) |在fs上将s分成序列
sprint(fmt,exp)|返回经fmt格式化后的exp
sub(r,s) |用$0中最左边最长的字符串代替s(只替换第一匹配的字符串)
sub(s,p) |返回字符串s中从p开始的后缀部分(只替换第一匹配的字符串)
subtr(s,p,n) |返回字符串s中从p开始长度位n的后缀部分(只替换第一匹配的字符串)
例如:
>[root@localhost ~]# cat wow
>
>M.Tansley 05/99 48311 Green 8 40 44
>
>J.Lulu 06/99 48317 green 9 24 26
>
>P.Bunny 02/99 48 Yellow 12 35 28
>
>J.Troll 07/99 4842 Brown-3 12 26 26
>
>L.Tansley 05/99 4712 Brown-2 12 30 28
将整篇wow中的4全局替换成999
[root@localhost ~]# awk ‘gsub(/4/,999)’ wow M.Tansley 05/99 9998311 Green 8 9990 999999
J.Lulu 06/99 9998317 green 9 2999 26
P.Bunny 02/99 9998 Yellow 12 35 28
J.Troll 07/99 99989992 Brown-3 12 26 26
L.Tansley 05/99 999712 Brown-2 12 30 28
或者
>[root@localhost ~]# awk 'gsub(/4/,999,$0)' wow //默认就是$0,可以不加
>
>M.Tansley 05/99 9998311 Green 8 9990 999999
>
>J.Lulu 06/99 9998317 green 9 2999 26
>
>P.Bunny 02/99 9998 Yellow 12 35 28
>
>J.Troll 07/99 99989992 Brown-3 12 26 26
>
>L.Tansley 05/99 999712 Brown-2 12 30 28
将用户名为M.Tansley所在行所有4替换成999
[root@localhost ~]# awk ‘{if( 1=="M.Tansley")gsub(/4/,999);print 1 ==" M . T a n s l e y " ) g s u b ( / 4 / , 999 ) ; p r i n t 0}’ wow (这里的是$0)
M.Tansley 05/99 9998311 Green 8 9990 999999
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
将用户名为M.Tansley所在行第三列的所有4替换成999
[root@localhost ~]# awk ‘{if( 1=="M.Tansley")gsub(/4/,999, 1 ==" M . T a n s l e y " ) g s u b ( / 4 / , 999 , 3); print 0}' wow (这里的1和3都是 0}' wow (这里的1和3都是 的,加不上。以下类推)
M.Tansley 05/99 9998311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28
将用户名为M.Tansley所在行第三列的所有4替换成999,并且仅显示替换行
[root@localhost ~]# awk ‘{if(1=="M.Tansley"){gsub(/4/,999, 1=="M.Tansley"){gsub(/4/,999, 3); print $0}}’ wow
M.Tansley 05/99 9998311 Green 8 40 44
将用户名为M.Tansley所在行第一个出现的4替换成999,
[root@localhost ~]# awk ‘{if( 1=="M.Tansley")sub(/4/,999);print 1 ==" M . T a n s l e y " ) s u b ( / 4 / , 999 ) ; p r i n t 0}’ wow
M.Tansley 05/99 9998311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brown-2 12 30 28查询字符串Bunny中ny是第几个出现的字符。
[root@localhost ~]# awk ‘BEGIN {print index(“Bunny”,”ny”)}’ grade.txt
4
查询字符串J.Troll的字符长度是多少?
[root@localhost ~]# awk ‘1=="J.Troll" {print length( 1=="J.Troll" {print length( 1),$1}’ grade.txt
7 J.Troll
分别测试字符串“ANCD”中是否包含字符 d 或 C 或 D,如果没包含返回字符0,如果包含返回时第几个出现
字符。[root@localhost ~]# awk ‘BEGIN {print match(“ANCD”,/d/)}’
0
[root@localhost ~]# awk ‘BEGIN {print match(“ANCD”,/C/)}’
3
[root@localhost ~]# awk ‘BEGIN {print match(“ANCD”,/D/)}’
4
显示字符串L.Tansley中从第1个字符(包含)开始的后面共5个字符
[root@localhost ~]# awk ‘1=="L.Tansley" {print substr( 1=="L.Tansley" {print substr( 1,1,5)}’ grade.txt
L.Tan
用printf格式化awk的输出
[root@localhost ~]# awk ‘BEGIN{printf “%-60s\n”,”——————–”}{printf “%-15s %s %-15s %s %s\n”, 1,"|", 1 , " | " , 3,”|”,$5}’ grade.txt
M.Tansley | 48311 | 8
J.Lulu | 48317 | 9
P.Bunny | 48 | 12
J.Troll | 4842 | 12
L.Tansley | 4712 | 12