美文网首页
笔记-awk

笔记-awk

作者: 口口帅日日 | 来源:发表于2019-11-13 16:45 被阅读0次

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 "个普通用户"
}

相关文章

网友评论

      本文标题:笔记-awk

      本文链接:https://www.haomeiwen.com/subject/fwqbbctx.html