awk基础应用

一、awk基本应用

grep:文本过滤的, egrep

sed:流编辑器,实现编辑的

awk:文本报告生成器,实现格式化文本输出

1、概念

AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk命名:Alfred Aho Peter\ Weinberger和brian kernighan三个人的姓的缩写。

awk----> gawk  GUN AWK

在Linux上常用的是gawk,awk是gawk的链接文件

man gawk----》pattern scanning and processing language  模式扫描和处理语言

任何awk语句都是由模式和动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。

patter{action} 比如: awk ‘/root/’mima 或 awk ‘$3 < 100’mima 或 awk ‘{print $2}’mima

上面模式和动作是可选的:

(1)如果没有模式,则action匹配的是mima文件中所有的记录

(2)如果没有动作,则patter匹配输出全部记录

模式:

l 正则表达式: /root/ 匹配含有root的行  /*.root/  

l 关系表达式: <  <=  >   >=  &&  ||   +   *

l 匹配表达式: ~(匹配)  !~(不匹配)

l BEGIN和END

        动作:

变量 -->可以自定义变量,变量名的引用不需要加$符号;它也有自己内置的变量

命令 -->ls   date

内置函数---> 数学函数、时间函数、字符串函数、

流控制语句---> if   while  for

它的语法结构如下:

awk [options] 'BEGIN{ print "start" } ‘pattern{ commands }’ END{ print "end" }' file

其中:BEGIN  END是AWK的关键字部,因此必须大写;这两个部分开始块和结束块是可选的

        BEGIN模块:在动作执行之前进行,通过我们可以用来设置全局变量,设置标题

        END模块:在动作执行之后进行

通过上面我们可以知道;AWK它工作通过三个步骤

(1)读:从文件、管道或标准输入中读入一行然后把它存放到内存中

(2)执行:对每一行数据,根据AWK命令按顺序执行。默认情况是处理每一行数据,也可以指定模式

(3)重复:一直重复上述两个过程直到文件结束

2  、awk的环境变量

awk内置变量(预定义变量)

ü $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段,字段之间由FS分隔

ü $0 这个变量包含执行过程中当前行的文本内容

ü FILENAME 当前输入文件的名

ü FS 字段分隔符(默认是任何空格)

ü NF 表示字段数,在执行过程中对应于当前的字段数

ü FNR  各文件分别计数的行号

ü NR 表示记录数,在执行过程中对应于当前的行号

ü OFS 输出字段分隔符(默认值是一个空格)

ü ORS 输出记录分隔符(默认值是一个换行符)

ü RS 记录分隔符(默认是一个换行符)

说明:

        记录==》 awk会把每一个以换行符作为结束的行称为一个记录

        记录分隔符==》默认的输出和输入分隔符都是回车

        变量NR:你可以把它当前一个计数器

        域:在记录中每个字段,称它为“域” 比如$1  $2

3 、实例演示

常用的命令选项:

        -F  fs指定分隔符

        -v 赋值一个用户自定义变量

        -f 指定脚本文件,从脚本中读取awk命令

范例1:分隔符的使用

用法:-F fs 其中fs是指定输入分隔符,fs可以是字符串或正则表达式;分隔符默认是空格

常见的写法: -F:  -F,  -F[aA]

范例2:指定多个分隔符

范例3:提取网卡的IP地址

范例4:关系运算符的使用

范例4-1:打印passwd文件中用户UID小于10的用户名和它登录使用的shell

[root@xuegod1603 days6]# awk -F: '$3<10{print $1"<=====>"$NF}' /etc/passwd

[root@xuegod1603 days6]# awk -F: '$3<10{print $1"\t"$NF}' /etc/passwd

[root@xuegod1603 days6]# awk -F: '$3<10{print $1,$NF}' /etc/passwd

范例4-2:打印系统中能够正常登录的普通用户

[root@xuegod1603 days6]# awk -F: '$3>=1000 && $NF=="/bin/bash"{print $1,$NF}' /etc/passwd

hr /bin/bash

范例5:添加开始和结束模块

[root@xuegod1603 days6]# cat test.awk

BEGIN{

        print "UserId\t\t\tShell"

        print "---------------------------------"

        FS=":"

        }

$3>=900 && $NF == "/sbin/nologin"{

        printf "%-20s %-20s\n",$1,$NF       

                }

END{

        print "-----------end-------------------"

        }

[root@xuegod1603 days6]# awk -f test.awk /etc/passwd

UserId                        Shell

---------------------------------

polkitd              /sbin/nologin      

libstoragemgmt       /sbin/nologin      

colord               /sbin/nologin      

saslauth             /sbin/nologin      

chrony               /sbin/nologin      

geoclue              /sbin/nologin      

nfsnobody            /sbin/nologin      

setroubleshoot       /sbin/nologin      

gnome-initial-setup  /sbin/nologin      

-----------end-------------------

范例6:统计当前内存的使用率

24.3  awk高级应用

命令格式:

awk [-F | -f | -v ] ‘BEGIN {} / / {command1;command2} END {}’file

        -F                指定分隔符

        -f                调用脚本

        -v                定义变量

        ‘{}’        引用代码块

   {…}                命令代码块,包含一条或多条命令

        BEGIN        初始化代码块

        / str /                匹配代码块,可以是字符串或正则表达式

        {print A;print B}                多条命令使用分号分隔

        END                结尾代码块

==================================================

内置变量的特殊用法:

ü $0       表示整个当前行

ü NF     字段数量

ü NR      每行的记录号,多文件记录递增

ü \t        制表符

ü \n      换行符

ü ~        匹配,与==相比不是精确比较

ü !~      不匹配,不精确比较

ü -F'[:#/]+' 定义三个分隔符

范例1:提取IP地址

说明:

[  :]+表示以空格和分号为分隔符,但是因为有可能有多个空格或冒号,所以用一个+表示重复前的。NR==2表示行号

范例2:NR与FNR的区别

对于NR来说,在读取不同的文件时,NR是一直加的

对于FNR来说,在读取不同的文件时,它读取下一个文件时,FNR会从1开始重新计算的

范例3:去首行

范例4:匹配

范例5:条件表达式

select?if-ture:if-false 问号前面的select是条件,如果条件成立执行if-true,反之执行if-false

范例6:if语句

if(条件){命令1;命令2}elif(条件){命令}else{命令}  条件用小括号扩起来

范例7:变量(变量的引用,前面不加$符号)

1) 用-v指定  var=value 变量名区分大小写的

[root@xuegod1603 days6]# awk -v test="HELLO AWK" 'BEGIN{print test}'

HELLO AWK

2)在程序中直接定义

[root@xuegod1603 days6]# awk 'BEGIN{test=100;total=0;while(i<=test){total+=i;i++}print total}'

5050

范例8:格式化输出

printf命令:格式化输出  printf “FORMAT”,item1,item2.......

format的使用

注意:

1、其与print命令的最大不同是,printf需要指定format

2、format用于指定后面的每个item的输出格式

3、printf语句不会自动打印换行符;\n

format格式的指示符都以%开头,后跟一个字符;如下:

%c: 显示字符的ASCII码

%d:十进制整数

%e:科学计数法显示数值

%f : 显示浮点数

%g : 以科学计数法的格式或浮点数的格式显示数值;

%s : 显示字符串

%u : 无符号整数

%%: 显示%自身

例如:

[root@xuegod1603 days6]# awk -F: '{printf "%s",$1}' mima

rootbindaemonadmlpsyncshutdownhaltmailoperator[root@xuegod1603 days6]#

[root@xuegod1603 days6]# awk -F: '{printf "%s\n",$1}' mima

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

operator

[root@xuegod1603 days6]# awk -F: '{printf "UserName: %s\n",$1}' mima

UserName: root

UserName: bin

UserName: daemon

UserName: adm

UserName: lp

UserName: sync

UserName: shutdown

UserName: halt

UserName: mail

UserName: operator

[root@xuegod1603 days6]# awk -F: '{printf "UserName: %s %s\n",$1,$NF}' mima

UserName: root /bin/bash

UserName: bin /sbin/nologin

UserName: daemon /sbin/nologin

UserName: adm /sbin/nologin

UserName: lp /sbin/nologin

UserName: sync /bin/sync

UserName: shutdown /sbin/shutdown

UserName: halt /sbin/halt

UserName: mail /sbin/nologin

UserName: operator /sbin/nologin

修饰符:

%[+-n.n]s  ====> %15s  %-15s   %-.6f

N: 显示宽度

-: 左对齐

+:显示数值符号

例子1:

例子2:

[root@xuegod1603 days6]# awk 'BEGIN{miao=0;zhang=0;print "name  yuwen  shuxue";print "===================="}{miao+=$2;zhang+=$3;printf "%-8s %-8d %-8d\n",$1,$2,$3}END{print "======================";printf "TOTAL:%5d %8d\n",miao,zhang;printf "AVGER:%5.2f %8.2f\n",miao/NR,zhang/NR}' b.txt

name  yuwen  shuxue

====================

lisi     40       60      

wangwu   23       24      

xiaoliu  65       30      

======================

TOTAL:  128      114

AVGER:42.67    38.00


在学习过程中有遇到问题的同学,希望有一个可以答疑解惑的地方,可以点击加入我们,一起学习吧!






上一篇:从0开始学习shell--文本处理工具cut


下一篇:EM算法 (第十五周周报12.6-12.12)