Awk: awk 语法: awk 模式 { 操作} 模式: 正则,关系表达式,模式,BEGIN,END, 操作: 由 命令、函数、表达式组成了。

文本源文件 scores.txt

执行awk的方式: 1.命令行下执行

2.执行awk脚本 awk -f 脚本名 文件名 3.可执行awk脚本

AWK的模式匹配: 1.使用正则模式打印出T开头的行,只取第一列

2.区间模式,即模式一和模式二中间的行会被匹配到 3.BEGIN 模式,在读取文件行之前操作的 (可以把一些文件描述,变量等写在此模式) 4.END 模式,在结束时操作的,跟BEGIN相反
写一个关于BEGIN和END的脚本: 注意一个细节问题: 在脚本中,模式不用加引号,而操作还是需要{ },并且{需要和模式在一行 一个模式中有多个操作,那就换行写 在命令行下面 ,一个引号里边有模式,和操作 。两个模式用分号;隔开

awk中系统内置变量 (记录大多时候=行) $0 当前正在处理的记录 $n 第几个字段 NF 当前记录的字段数 NR 已经读了几条记录 FILENAM 文件名 FS 字段分隔符 RS 记录分隔符 默认:换行符

例子:源文件 articles.txt 重新设置分隔符:

AWK中也可以支持运算符和表达式 如 BEGIN { x=5/2 print x }

条件表达式: 语法:expression?value1:value2 关系运算符

,<,==, ~,!~,等等 8==8 {print} 即 如果8=8为真,就执行print操作 例子 :~ 是匹配的意思 下面是指: 匹配第一个字段(列)以K开头的记录 打印出来

2018年10月15日更新: 遇到一个案例,需要修改文本最后一列 源文件: 199.0.10.11 root qqq 199.0.10.12 root www 199.0.2.23 root BC 199.0.2.230 root BC 199.0.2.231 root BC 199.0.2.232 root BC

需求:将199.0.2.23*的行的root密码 替换为BCli@1088 第一步:

但是这样做发现了没有,原来字段是以“\t”制表符分开的,现在只是空格了 那是因为默认的OFS :输出字段分隔符, 默认是空格。 所以为了还是原来的制表符显示,就修改一下: #cat test |awk 'BEGIN{FS=OFS="\t"} {if ($1~"199.0.2.23") $3="BCli@1088"} {print}'

完成!

下面补充一下 awk的一些变量: $0     表示整个当前行 $1     每行第一个字段 NF     字段数量变量 NR     每行的记录号,多文件记录递增 FNR     与NR类似,不过多文件记录不递增,每个文件都从1开始 \t     制表符 \n     换行符 FS     BEGIN时定义分隔符 RS     输入的记录分隔符, 默认为换行符(即文本是按一行一行输入) ~     匹配,与==相比不是精确比较 !~     不匹配,不精确比较 ==     等于,必须全部相等,精确比较 !=     不等于,精确比较 &&     逻辑与 ||     逻辑或

  •     匹配时表示1个或1个以上 /[0-9][0-9]+/     两个或两个以上数字 /[0-9][0-9]*/     一个或一个以上数字 OFS     输出字段分隔符, 默认也是空格,可以改为制表符等 ORS     输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕 -F’[:#/]’     定义三个分隔符