AWK命令
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
语法:
awk [options] 'pattern{action}' file
awk [-F|-f|-v] ‘BEGIN{ commands } pattern{ commands } END{ commands }’ file
- [-F|-f|-v] 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value。
- BEGIN (可选)BEGIN语句块在awk读取输入流中读取行之前执行,如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。
- END 处理完所有的行后要执行的语句。
awk工作流程:
BEGIN→读取文件,遇到/n换行符时分割一条记录,将记录按分隔符划分域,填充域,执行指点的命令动作,依次读取行,执行动作到处理完所有记录→END
参数:
- -F:指定分隔符
awk -F: '{print $1}' log.txt #以":"为分隔符
- -f:调用脚本
awk -f cal.awk log.txt #调用脚本cal.awk处理log.txt文件
- -v:设置变量
awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt #定义变量a,b
运算符:
| 运算符 | 描述 |
|---|---|
| = += -= *= /= %= ^= **= | 赋值 |
| || | 逻辑或 |
| && | 逻辑与 |
| ~ | 匹配,与==相比不是精确比较 |
| ~! | 不匹配,不精确比较 |
| < <= > >= != == | 关系运算符 |
| ^ *** | 求幂 |
| ++ -- | 增加或减少,作为前缀或后缀 |
| $ | 字段引用 |
| in | 数组成员 |
内建变量:
| 变量 | 描述 |
|---|---|
| $n | 当前记录的第n个字段,字段间由FS分隔 |
| $0 | 表示整个当前行 |
| NF | 一条记录的字段的数目 |
| NR | 已经读出的记录数,就是行号,从1开始 |
| FNR | 各文件分别计数的行号 |
| OFS | 输出字段分隔符, 默认也是空格,可以改为制表符等 |
| ORS | 输出记录分隔符(默认值是换行符) |
| FILENAME | 当前文件名 |
| RS | 记录分隔符(默认是一个换行符) |
| FS | 字段分隔符(默认是任何空格) |
实例:
打印出/etc/passwd 第一个域,并且在第一个域所有的内容前面加上“用户帐号:”
awk -F: '{print "用户账号:"$1}' /etc/passwd
匹配/etc/passwd 第三域大于100的显示出完整信息
awk -F: '{if($3>100)print $0}' /etc/passwd
打印第一域,并且打印头部信息为:这个是系统用户,打印尾部信息为:"================"
awk -F: 'BEGIN{print "这个是系统用户"}{print $1}END{print "==========="}' /etc/passwd
打印行号小于15的,并且最后一域匹配bash的信息
awk -F: '{if(NR<15&&$NF~/bash/)print $0}' /etc/passwd
打印出第一域匹配daemon的信息
awk -F: '$1~/daemon/{print $0}' /etc/passwd
请打印出第三域数字之和
awk -F: '{sum+=$3} END{print sum}' /etc/passwd
请将/etc/passwd 中的root替换成gongda,临时替换
awk -F: 'gsub(/root/,"gongda"){print $0}' /etc/passwd
判断/etc/passwd 中用户的类型
awk -F: '{if($3==0)print "超级用户:"$1 ;else if($3>0&&$3<1000) print "系统用户:"$1;else print"自建用户:"$1}' /etc/passwd
官方手册:
http://www.gnu.org/software/gawk/manual/gawk.html
参考链接:
浙公网安备 33010602011771号