正则-awk
awk稍微复杂,awk比sed更适合在分段上
实例操作:
打印第一段
awk -F ':' '{print $1}' test.txt 分隔符为冒号,这里不更改文件
所有的段用$0
没有的-F的适合,默认用空格等作为符合
-F指定分隔符
打印多段内容awk -F ':' '{print $1,$2,$5}' 1.txt 打印1 2 5段
awk -F ':' '{print $1,$2,$5}' test.txt
替换成#号,注意#号要用双引号
匹配功能
awk '/oo/' test.txt 这个则匹配有oo的行
精确匹配有o的第一段
awk -F ':' '$1 ~ /oo/' test.txt
awk支持多个条件匹配
awk -F ':' '/oo/ {print $1,$4} /user1/ {print $1,$6}' test.txt
6)条件操作符
例如打印第三段=0的值,==是精确匹配 一个=号是赋值
awk -F ':' '$3==0' test.txt
awk -F ':' '$3>=500 {print $0}' test.txt 第三段大于等于500
稍微注意的是,如果匹配数字比较,需要把比较的数字用双引号括起来,awk才不会认为是数字,而会认为是字符
7)打印出某段不等于xx的行
awk -F ':' '$7!="/sbin/nologin" {print $0} ' test.txt
字符作为判断条件则是要使用双引号括起来的,!7=表示不等于 意义是第七个不是sbin/nologin
8)两个字段之间比较
awk -F ':' '$3<$4' test.txt 符合对应要求的行
awk -F ':' '$3==$4' test.txt //打印第3段与第4段相同的行
awk -F ':' '$3>"4" && $3<"8"' test.txt 匹配第三段第一个字符大于4 且小于8的字符
或者打印满足两个条件的
awk -F ':' '$3>500 || $7==/sbin/nologin' test.txt //匹配第三段大于500且第七段带有字符的
awk的内置变量
- OFS变量和-F选项有类似的功能,也是用来定义分隔符的,但是它是在输出的时候定义的
awk -F ':' '{OFS="@"} {print $1,$2,43}' test.txt
awk -F ':' '{OFS="@"} {if($3>500) {print $1,$2,43}}' test.txt 用if条件筛选
- 变量NR的用法 表示行号
相当于grep –n功能,显示左边的行号
awk -F ':' '{print NR ":" $0}' test.txt
3)变量NF表示用分隔符分隔后一共有多少段
awk -F ':' '{print NF ":" $0}' test.txt ,例如这里passwd一共有7段
使用NR打印前多少行
awk -F ':' 'NR<=4' test.txt //这里打印前面4行
4)打印2个条件同时满足的行
5)2个变量的应用 ,nf一直是7,因为一共7段 第八段没有东西了,相当于$1$7,$2$7
6) 赋值
head -n 3 /etc/passwd |awk -F ':' '$1="root"'
head -n 3 test.txt |awk -F ':' '{OFS=":"} $1="root"'加上ofs之后就有了:分隔符了
7) 求和
第三段数字的累加,第一行的0加第三段的数字
第二行为第一行的结果加上本行的数值
awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt