Linux之awk初谈(一)

1.AWK应用场景

统计计算,过滤,统计日志

2. AWK 基本使用格式

awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
    [-F|-f|-v] :
          参数-F,指定分隔符,默认是以空格作为分列符的。
         参数-f调用脚本。
         参数-v定义变量 var=value  ;-v 设置变量:设置变量a,-va;设置变量b,-vb 
         ' ' 引用代码块 
        BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符 
        // 匹配代码块,可以是字符串或正则表达式:内容的查找范围→过滤的文件内容(按行取数)
        NR 记录符,取行,不是真正的行数,是awk处理过的行数(如NR==2/ / 取内容(如/^b/匹配首,/$/匹配尾)
        {} 命令代码块,包含一条或多条命令 ; 
        多条命令使用分号分隔 END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
 
awk –F ":" 'NR==2{print $1}'取第一列,第二行

    $ 表示取列的意思

    $NR 已经读出的记录数,就是行号,从1开始

    $0 表示取出所有列

awk变量参数举例:

[root@VM-4-13-centos awk]# awk -F "." -va=888 'BEGIN{print a}'  
888

3.AWK内置变量

变量    描述
$n    当前记录的第n个字段,字段间由FS分隔
$0    完整的输入记录
ARGC    命令行参数的数目
ARGIND    命令行中当前文件的位置(从0开始算)
ARGV    包含命令行参数的数组
CONVFMT    数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组
ERRNO    最后一个系统错误的描述
FIELDWIDTHS    字段宽度列表(用空格键分隔)
FILENAME    当前文件名
FNR    各文件分别计数的行号
FS    字段分隔符(默认是任何空格)
IGNORECASE    如果为真,则进行忽略大小写的匹配
NF    一条记录的字段的数目  NF和$NF的区别:NF获取到的是,每行列的个数;$NF获取到的是最后一列的值。
NR    已经读出的记录数,就是行号,从1开始
OFMT    数字的输出格式(默认值是%.6g)
OFS    输出字段分隔符,默认值与输入字段分隔符一致。
ORS    输出记录分隔符(默认值是一个换行符)
RLENGTH    由match函数所匹配的字符串的长度
RS    记录分隔符(默认是一个换行符)
RSTART    由match函数所匹配的字符串的第一个位置
SUBSEP    数组下标分隔符(默认值是/034)

4.awk的条件

条件的类型    条件    说明
awk保留字    BEGIN    在awk程序一开始时,尚未读取任何数据之前执行。BEGIN后的动作只在程序开始时执行一次
awk保留字    END    在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次
关系运算符    >    大于
关系运算符    <    小于
关系运算符    >=    大于等于
关系运算符    <=    小于等于
关系运算符    ==    等于。用于判断两个值是否相等,如果是给变量赋值,请使用“”号
关系运算符    !=    不等于
关系运算符    A~B    判断字符串A中是否包含能匹配B表达式的子字符串
关系运算符    A!~B    判断字符串A中是否不包含能匹配B表达式的子字符串
正则表达式    /正则/    如果在"//"中可以写入字符,也可以支持正则表达式

awk -F "分隔符"  '{BEGIN{读文件前执行这块BEGIN语句}pattern{语句块}END{读完文件后,执行这个END语句块}}'

BEGIN

BEGIN是awk的保留字,是一种特殊的条件类型。BEGIN的执行时机是“在 awk程序一开始时,尚未读取任何数据之前执行”。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据,BEGIN的条件就不再成立,所以BEGIN定义的动作只能被执行一次。

pattern{ commands }语句块

当扫描一行的时候,pattern语句块会执行一完遍。扫描下一行的时候,pattern会接着执行完一遍。一直循环下去,直到扫描到最后一行。

END

END也是awk保留字,不过刚好和BEGIN相反。END是在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次。

5.AWK实例

5.1 输出文本行列

cat  awk.txt

name age sex
jack 18  男
ben  28  男
hilun 38 女
wumen 48

5.1.1  利用awk输出全部内容

awk  '{print $0}'  awk.txt

name age sex
jack 18  男
ben  28  男
hilun 38 女
wumen 48

5.1.2 输出第四行

awk  'NR==4{print $0}'  awk.txt

[root@localhost home]# awk  'NR==4{print $0}'  awk.txt
hilun 38

5.1.3 输出第二行第二列

awk  'NR==2{print $2}'  awk.txt

[root@localhost home]# awk  'NR==2{print $2}'  awk.txt
18

 5.2 输出文本BEGIN,END,条件

 cat bwk.txt

[root@localhost home]# cat  bwk.txt 
name age sex
jack 18  男
ben  28  男
hilun 38 女
wumen 48 男
hen 55 男
jj  42 男
bo  23 男
wen 31 女
wuwu 22 女
hihi 25 女
[root@localhost home]# 

5.2.1  BEGIN,END

awk 'BEGIN{print "人员信息表"} {print $0} END{print "-- 到底啦 --"}' bwk.txt

[root@localhost home]# awk 'BEGIN{print "人员信息表"} {print $0} END{print "-- 到底啦 --"}' bwk.txt
人员信息表
name age sex
jack 18  男
ben  28  男
hilun 38 女
wumen 48 男
hen 55 男
jj  42 男
bo  23 男
wen 31 女
wuwu 22 女
hihi 25-- 到底啦 --

 5.2.2 查询大于30岁且是女性的信息

[root@localhost home]# awk 'BEGIN{print "人员信息表"} $2>30 && $3 == "女" {print $0} END{print "-- 到底啦 --"}' bwk.txt
人员信息表
hilun 38 女
wen 31 女
-- 到底啦 --

5.2.3 找出名字h开头(模糊查询)且年龄在20岁以上的

[root@localhost home]# awk 'BEGIN{print "人员信息表"} $1 ~ "^h" && $2 >20 {print $0} END {print "-- 到底啦 --"}' bwk.txt 
人员信息表
hilun 38 女
hen 55 男
hihi 25 女
-- 到底啦 --
[root@localhost home]# 

 #注意“~”匹配查询,后面关键字要用引号引起来一定要双引号,^匹配头,$匹配尾。

5.3  参数-v 实例

[root@VM-4-13-centos awk]# cat renyuan.txt 
me age sex
jack 18  男
ben  28  男
Cici 38 女
[root@VM-4-13-centos awk]# awk -va=2 '{print a,$a}' renyuan.txt #-va,设置变量a,初始值为2
2 age
2 18
2 28
2 38
[root@VM-4-13-centos awk]# awk -va=2 -vb=1 '{print a,$a,b,$b}' renyuan.txt #-va,-vb 设置变量a,b,初始值为2,1
2 age 1 me
2 18 1 jack
2 28 1 ben
2 38 1 Cici

 

posted @ 2022-08-22 10:56  家乐福的搬砖日常  阅读(132)  评论(0)    收藏  举报