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’[:#/]’ 定义三个分隔符