1、确保整个awk命令用单引号括起来
2、确保命令内所有引号成对出现
3、确保用花括号括起动作语句,用圆括号括起条件语句
4、确保动作语句打印的字符串及转义字符用双引号引起来。
----------------------------------------------------------------
awk条件操作符
操作符
描述
操作符
描述
<
小于
==
等于
<=
大于等于
!=
不等于
>
大于
~
匹配正则表达式
>=
大于等于
!~
不匹配正则表达式
awk条件逻辑操作符
操作符
描述
&&
与运算
||
或运算
!
非运算
awk内置变量
内置变量名称
描述
内置变量名称
描述
ARGC
命令行参数个数
FS
设置输入域分隔符,等价命令行-F选项
ARGV
命令行参数排列
NF
记录浏览域的个数
ENVIRON
支持队列中系统环境变量的使用
NR
已读的记录数
FILENAME
awk浏览的文件名称
OFS
输出域分隔符
FNR
浏览文件的记录数
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的字符串
split(s,a,fs)
在fs上将s分成序列a
sprint(fmt,exp)
返回经fmt格式化后的exp
sub(r,s)
用$0中最左边最长的字串代替s(只替换第一匹配的字符)
sub(s,p)
返回字符串s中从p开始的后缀部分 (只替换第一匹配的字符)
substr(s,p,n)
返回字符串s中从p开始长度为n的后缀部分 (只替换第一匹配的字符)
E.G
原例文:
[[email protected] ~]# 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
1)将整篇wow中的4全局替换成999
[[email protected] ~]# 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
或者
[[email protected] ~]# 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
2)将用户名为M.Tansley所在行所有4替换成999
[[email protected] ~]# awk ‘{if($1=="M.Tansley") gsub(/4/,999); print $0}‘ wow
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
3)将用户名为M.Tansley所在行第三列的所有4替换成999
[[email protected] ~]# awk ‘{if($1=="M.Tansley") gsub(/4/,999,$3); print $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
4)将用户名为M.Tansley所在行第三列的所有4替换成999,并且仅显示替换行
[[email protected] ~]# awk ‘{if($1=="M.Tansley") {gsub(/4/,999,$3); print $0}}‘ wow
M.Tansley 05/99 9998311 Green 8 40 44
5)将用户名为M.Tansley所在行第一个出现的4替换成999,
[[email protected] ~]# awk ‘{if($1=="M.Tansley") sub(/4/,999); print $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
5)将用户名为M.Tansley所在行第一个出现的4替换成999 , 并且仅显示替换行
[[email protected] ~]# awk ‘{if($1=="M.Tansley") {sub(/4/,999); print $0}}‘ wow
M.Tansley 05/99 9998311 Green 8 40 44
6)查询字符串Bunny中ny是第几个出现的字符。
[[email protected] ~]# awk ‘BEGIN {print index("Bunny","ny")}‘ grade.txt
4
7)查询字符串J.Troll的字符长度是多少?
[[email protected] ~]# awk ‘$1=="J.Troll" {print length($1),$1}‘ grade.txt
7 J.Troll
8)分别测试字符串“ANCD”中是否包含字符 d 或 C 或 D,如果没包含返回字符0,如果包含返回时第几个出现的字符。
[[email protected] ~]# awk ‘BEGIN {print match("ANCD",/d/)}‘
0
[[email protected] ~]# awk ‘BEGIN {print match("ANCD",/C/)}‘
3
[[email protected] ~]# awk ‘BEGIN {print match("ANCD",/D/)}‘
4
9)显示字符串L.Tansley中从第1个字符(包含)开始的后面共5个字符
[[email protected] ~]# awk ‘$1=="L.Tansley" {print substr($1,1,5)}‘ grade.txt
L.Tan
显示字符串L.Tansley中从第2个字符(包含)开始的后面共3个字符
[[email protected] ~]# awk ‘$1=="L.Tansley" {print substr($1,2,3)}‘ grade.txt
.Ta
10)用printf格式化awk的输出
[[email protected] ~]# awk ‘BEGIN{printf "%-60s\n","-------------------------------------------------------------"}{printf "%-15s %s %-15s %s %s\n",$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
[[email protected] ~]# awk ‘BEGIN{printf "%-39s\n","----------------------------------------";printf "%-15s %s %-15s %s %-1s %s\n","name","|","student_id","|","age","|";printf "%-52s\n","----------------------------------------"}{printf "%-15s %s %-15s %s %-3s %s\n",$1,"|",$3,"|",$5,"|"}END{printf "%-39s\n","----------------------------------------"}‘ grade.txt
----------------------------------------
name | student_id | age |
----------------------------------------
M.Tansley | 48311 | 8 |
J.Lulu | 48317 | 9 |
P.Bunny | 48 | 12 |
J.Troll | 4842 | 12 |
L.Tansley | 4712 | 12 |
----------------------------------------
awk中使用的屏蔽序列
本文来源:http://www.benet.wang/shell%E7%BC%96%E7%A8%8B/61.html