AWK的基础用法

第一节:awk简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。擅长去列,计算,数组,统计,判断,循环。

第二节:awk的常用内置变量

FS                 设置输入列分隔符,等价于命令行 -F选项
OFS                输出列分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符
NF                 浏览记录的列的个数
NR                 已读的记录数(行号)
FNR                读取两个文件分别显示行号
$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
$NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数

实例:

[root@lb03 ~]$ cat file.txt
/etc/sysconfig/network
[root@lb03 ~]$ awk  'BEGIN{RS="/"}{print $0}'  file.txt  -->将/替换成了换行符

etc
sysconfig
network

[root@lb03 ~]$ awk  'BEGIN{ORS="/"}{print $0}'  file.txt  -->将换行符替换为/
/etc/sysconfig/network/[root@lb03 ~]$

第三节:awk的处理方式

1.BEGIN{}{}END{}

[root@lb03 ~]# awk  'BEGIN{print 1 + 1}{print $0}END{print "文件内容显示结束"}'   /etc/hosts
2
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
文件内容显示结束

2.内置变量的使用

awk引用内部变量    -v 定义一个变量
[root@lb03 ~]$ awk  -va=10 -vb=20 'BEGIN{print a + b}'
30     

3.变量的传递使用

[root@m01 /scripts]$ IP=10.0.0.1       ———>定义外部变量IP
[root@m01 /scripts]$ awk -v I=$IP 'BEGIN{print I}'  ———>将外部变量IP传递给内置变量I
10.0.0.1

第四节:awk结合正则用法

匹配第四列中含有98的行
[root@lb03 ~]$ awk -F:  '$4 ~/98/'  passwd        
polkitd:x:999:998:User for polkitd:/:/sbin/nologin

匹配第四列中没有98的行(取反)
[root@lb03 ~]$ awk -F:  '$4 !~/98/'  passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

Awk示例1:解释其下列命令的含义
$ awk '/west/' datafile          
$ awk '/^north/' datafile
$ awk '$3 ~ /^north/' datafile
$ awk '/^(no|so)/' datafile
$ awk '{print $3,$2}' datafile
$ awk '{print $3 $2}' datafile
$ awk '{print $0}' datafile
$ awk '{print "Number of fields: "NF}' datafile
$ awk '/northeast/{print $3,$2}' datafile
$ awk '/^[ns]/{print $1}' datafile
Awk示例2
[root@qls ~]$ cat b.txt
QF xiaoming:is a:good boy!
[root@qls ~]$ awk '{print NF}' b.txt
4
[root@qls ~]$ awk -F ':' '{print NF}' b.txt
3
[root@qls ~]$ awk -F"[ :]" '{print NF}' b.txt
6

第五节:awk的比较表达式

1.比较表达式

>       大于  
<       小于
>=      大于等于
<=      小于等于
==      等于
!=      不等于

2 实例

双条件判断是否管理员用户
[root@lb03 ~]$ awk  -F:  '$1 == "root"  &&  $3 == 0 '  passwd 
root:x:0:0:root:/root:/bin/bash

统计系统用户有多少个
[root@lb03 ~]$ awk -F:  '$3 > 0 && $3 < 1000 {print $1}'  passwd |wc -l
21
[root@lb03 ~]$ awk -F:  '$3 > 0 && $3 < 1000 {i++}END{print i}'  passwd
21

统计普通用户数量
[root@lb03 ~]$ awk -F:  '$3 >= 1000  {i++}END{print i}'  passwd
10

把用户的uid的值乘于10小于100的显示出来
[root@lb03 ~]$ awk -F:  '$3 * 10 < 100{print $1}'  passwd 
root
bin
daemon
adm

第六节:awk结合语句用法

1.if else 判断语句

打印系统管理员用户的数量
[root@lb03 ~]$ awk  -F:  '{if($3==0){i++}}END{print "管理员用户的数量为:"i}'  passwd
管理员用户的数量为:2

打印系统管理员的数量和其他用户的数量
[root@lb03 ~]$ awk  -F:  '{if($3==0){i++}else {j++}}END{print "当前系统管理员用户数量为:"i;print "其他用户数量为:"j}'  passwd 
当前系统管理员用户数量为:2
其他用户数量为:29

打印系统管理员的数量和系统用户的数量及普通用户的数量
[root@lb03 ~]$ awk  -F:  '{if($3==0){i++} else {if($3>0 && $3<1000){j++} else {o++}}}END{print "管理员用户的数量为:"i "  系统用户的数量为:"j" 普通用户的数量为:",o}'  passwd 
管理员用户的数量为:2  系统用户的数量为:19 普通用户的数量为: 10

2.for循环语句

创建10个用户
[root@lb03 ~]$ awk  'BEGIN{for(i=1;i<=10;i++){print "useradd  old"i}}'   |bash
修改日期同时并创建一个文件
[root@lb03 ~]$ awk  'BEGIN{for(i=1;i<15;i++){print "date -s 2019/11/"i" && touch  file-"i".txt"}}' |bash

3.while 循环语句用法

创建10个用户
[root@lb03 ~]$ awk  'BEGIN{i=1;while(i<10){print "useradd  new"i;i++}}' |bash

第七节:awk文本替换

awk的sub/gsub函数用来替换字符串,其语法格式是:

sub(/regexp/, replacement, target)

注意第三个参数target,如果忽略则使用$0作为参数,即整行文本。

●例子1:替换单个串
只把每行的第一个AAAA替换为BBBB

awk '{ sub(/AAAA/,"BBBB"); print $0 }' t.txt

●例子2:替换所有的串
把每一行的所有AAAA替换为BBBB

awk '{ gsub(/AAAA/,"BBBB"); print $0 }' t.txt

●例子3:替换满足条件的行的串
只在出现字符串CCCC的前提下,将行中所有AAAA替换为BBBB

awk '/CCCC/ { gsub(/AAAA/,"BBBB"); print $0; next }
            { print $0 }
    ' t.txt

*next:实现跳过功能,否则会打印该行两次
●例子4:替换多个可选串
不管是AAAA,还是CCCC,全部替换为BBBB

awk '{ gsub(/AAAA|CCCC/,"BBBB"); print $0 }' t.txt

●例子5:全字匹配替换
全字匹配AAAA;即不匹配AAA,以及AAAAA,也就是说完整的四个字符串AAAA。

awk '{ sub(/\<AAAA\>/,"BBBB"); print $0 }' t.txt

●例子6:规则表达式匹配
把所有以A开头,不管后面连续包含几个A的串替换成一个字符B。

awk '{ gsub(/^A*/,"B"); print $0 }' t.txt
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 制定家庭/个人理财计划禁忌有哪些?理财本是为确保资产保值升值,为未来生活提供保障,让我们能更好地生活,但现实生活中...
    执笔笑颜阅读 210评论 0 0
  • “妈,给你说两件对比鲜明而又奇葩的事呗?” 晚自习放学后,刚接到女儿,她就叽叽喳喳给我说起学校的见闻。难得女儿今天...
    雨典阅读 261评论 0 1
  • 我是个傻瓜 偏不说正常的话 宫里那么复杂 需要一个机灵的小脑瓜 我是个傻瓜 原本有一个幸福的家 只因心中那不解的牵...
    追忆者阅读 473评论 12 8