1.Awk基础介绍
awk不仅仅是一个文本处理工具,通常用于处理数据并生成结果报告,当然awk也是一门编程语言,是linux上功能最强大的数据处理工具之一。
2.awk语法格式
第一种形式:awk 'BEGIN{} pattern {commands} END {}' file_name
第二种形式:standard output | awk BEGIN{} pattern {commands} END {}
第三种形式:awk [options] -f awk-script-file filenames
2.Awk工作原理
# awk -F: '{print $1,$3}' /etc/passwd
1.awk将文件中的每一行作为输入, 并将每一行赋给内部变量$0, 以换行符结束
2.awk开始进行字段分解,每个字段存储在已编号的变量中,从$1开始[默认空格分割]
3.awk默认字段分隔符是由内部FS变量来确定, 可以使用-F修订
4.awk行处理时使用了print函数打印分割后的字段
5.awk在打印后的字段加上空格,因为$1,$3 之间有一个逗号。逗号被映射至OFS内部变量中,称为输出字段分隔符, OFS默认为空格.
6.awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕.
3.Awk内部变量
$0 #将读入进来的一行数据存储至$0中,读入进来默认按行为分割由RS变量控制
$1 #经过FS变量字段分割后,将一行内容拆分成几段,分别赋值给$1 $2 $3.....
NF #统计每一行由FS分割之后多少列,多少个字段
NR #给每一行载入进来的内容,都添加一个编号
FS #指定字段分隔符,默认空格为分割
RS #指定读入进来的内容分隔符,默认按照 \n 换行符
OFS #输出字段分割符,默认是空格为分割
ORS #输出行分割符,默认是换行
print #打印
4.Awk格式输出
printf
格式符 含义
%s 打印字符串
%d 打印十进制数
%f 打印一个浮点数
%x 打印十六进制数
%o 打印八进制数
修饰符 含义
- 左对齐
+ 右对齐
[root@manager awk]# awk '
BEGIN {
printf "%-20s%-20s%-20s%-20s\n",
"Name","shuxue","yuwen","yinx"
}
{
printf "%-20s%-20s%-20s%-20s\n", $1,$2,$3,$4
}' file3.txt
Name shuxue yuwen yinx
Oldxu 20 30 40
oldqiang 10 5 2
oldguo 1 1 1
oldgao 1 2 3
oldboy 10 2 0
5.Awk模式匹配
1.正则匹配
2.运算符 < > +-/*
3.与或非
符号 含义
< 小于
> 大于
<= 小于等于
>= 大于等于
== 等于
!= 不等于
~ 匹配正则表达式
!~ 不匹配正则表达式
布尔运算符匹配示例
符号 含义
|| 或
&& 与
! 非
awk的 + - * / % 支持小数
运算符 含义
+ 加
- 减
* 乘
/ 除
% 余
6.Awk条件判断
if语句格式: { if(表达式){语句;语句;... } }
1.以:为分隔符,打印当前管理员用户名称
awk 'BEGIN{FS=":"} { if($3==0) { print $1,"是管理员"} }' /etc/passwd
2.以:为分隔符,统计系统用户数量
awk 'BEGIN{FS=":"} { if($3<1000) { i++ }} END { print i,"系统用户" }' /etc/passwd
3.以:为分隔符,统计普通用户数量
awk 'BEGIN{FS=":"} { if ($3>=1000) { i++ } } END { print i,"个普通用 户"} /etc/passwd
4.以:为分隔符,只打印/etc/passwd中第3个字段的数值在50-100范围内的行信息
awk 'BEGIN{FS=":"} $3>=50 && $3<100 {print $0}' /etc/passwd
if...else 语句格式: {if(表达式){语句;语句;... }else{语句;语句;...}}
统计当前的超级管理员有几个 统计当前的普通用户有多少 统计当前的系统用户有多少个
[root@oldxu ~]# awk 'BEGIN {FS=":"} {if($3==0){print $1} else {print $7}}' /etc/passwd
[root@oldxu ~]# awk 'BEGIN {FS=":"} {if($3==0) {count++} else{i++} }' /etc/passwd
[root@oldxu ~]# awk 'BEGIN {FS=":"} {if($3==0){count++} else{i++}} END{print " 管理员个数: "count ; print " 系统用户数: "i}' /etc/passwd
if...else if...else 语句格式: { if(表达式 1){语句;语句;... }else if(表达式 2){语句;语句;. .. }else{语句;语句;... }}
1.使用awk if打印出当前/etc/passwd文件管理员有多少个,系统用户有多少个,普通用户有多少个
[root@manager awk]# cat user_total.awk
BEGIN{
FS=":";OFS="\n"
}
{
if ($3==0)
{ i++ }
else if ($3>=1 && $3<=999)
{ j++ }
else
{ k++ }
}
END {
print i "个超级管理员",
j "个系统用户" ,
k "个普通用户"
}
网友评论