正则表达式awk学习(三)

awk:格式化文本输出

gawk - pattern scanning and processing language

awk:gawk的符号链接
基本用法:gawk [options] ‘program‘ FILE
    program:PATTERN {ACTION STATEMENTS}
        语句之间用分号分隔
            print,printf
    选项:
        -F: 指明输入时用到的字段分隔符;
            默认空格
        -v:var=value :自定义变量
            变量名必须以字母或_开头
            echo $变量名

1、print
print item1,item2,...

要点:
     (1)逗号分隔符;
     (2)输出的个item可以是字符串,也可以是数字;当前记录的字段、变量或awk的表达式
     (3)如省略item,相当于print $0

练习模板:
cat > passwd<<EOF
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
EOF

案例1:打印用户名和对应的shell

[[email protected] ~]# awk -F":" ‘{print $1,$7}‘ passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
//添加制表符
[[email protected] ~]# awk -F":" ‘{print $1 "\t" $7}‘ passwd
root    /bin/bash
bin        /sbin/nologin
daemon    /sbin/nologin
adm        /sbin/nologin
lp        /sbin/nologin
sync    /bin/sync
shutdown    /sbin/shutdown
halt    /sbin/halt
mail    /sbin/nologin
operator    /sbin/nologin

案例2:打印用户名及对应的uid和gid

[[email protected] ~]# awk -F":" ‘{print "用户是:" $1 "\t 用户uid:" $3 "\t 用户gid:" $4}‘ passwd
用户是:root     用户uid:0     用户gid:0
用户是:bin     用户uid:1     用户gid:1
用户是:daemon     用户uid:2     用户gid:2
用户是:adm     用户uid:3     用户gid:4
用户是:lp     用户uid:4     用户gid:7
用户是:sync     用户uid:5     用户gid:0
用户是:shutdown     用户uid:6     用户gid:0
用户是:halt     用户uid:7     用户gid:0
用户是:mail     用户uid:8     用户gid:12
用户是:operator     用户uid:11     用户gid:0

2、变量

内建变量:
FS:  input field seperator,默认为空白字符
         -F‘:‘  FS=‘:‘
OFS: output field seperator,默认为空白字符
RS:  input record seperator,输入时换行符
ORS: output record seperator,输出时换行符
NF:  number of field,字段设置:
     {print NF},{print $NF}
NR:  number of record: 行数
FNR:      各文件分别计数:行数;
FILENAME: 当前文件名
ARGC:     命令行参数的个数
ARGV:     数组,保存的是命令行所给定的各参数

自定义变量:
1)-v var=value
2)在program中直接定义

案例1:打印用户名和对应的shell

[[email protected] ~]# awk -F":" ‘{print $1,$7}‘ passwd
[[email protected] ~]# awk -v FS=":" ‘{print $1,$NF}‘ passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin

案例2:通过OFS定义输出分隔符

[[email protected] ~]# awk -F‘:‘ -v OFS="‘s shell is " ‘{print $1,$NF}‘ passwd
root‘s shell is /bin/bash
bin‘s shell is /sbin/nologin
daemon‘s shell is /sbin/nologin
adm‘s shell is /sbin/nologin
lp‘s shell is /sbin/nologin
sync‘s shell is /bin/sync
shutdown‘s shell is /sbin/shutdown
halt‘s shell is /sbin/halt
mail‘s shell is /sbin/nologin
operator‘s shell is /sbin/nologin

案例3:打印文件行号

[[email protected] ~]# awk ‘{print NR,$0}‘ passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin

案例4:自定义变量

[[email protected] ~]# awk -v name=xiaoming ‘{print name,$0}‘ passwd
xiaoming root:x:0:0:root:/root:/bin/bash
xiaoming bin:x:1:1:bin:/bin:/sbin/nologin
xiaoming daemon:x:2:2:daemon:/sbin:/sbin/nologin
xiaoming adm:x:3:4:adm:/var/adm:/sbin/nologin
xiaoming lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
xiaoming sync:x:5:0:sync:/sbin:/bin/sync
xiaoming shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
xiaoming halt:x:7:0:halt:/sbin:/sbin/halt
xiaoming mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
xiaoming operator:x:11:0:operator:/root:/sbin/nologin

3、printf

格式化输出:printf FORMAT,item1,item2
print item1,item2
print $1,$2
printf "%s,%s",$1,$2

1)FORMAT必须要
2)不会自动换行,需要给出换行控制符,\n
3)FORMAT中需要分别为后面的每个item指定一个格式化符号

格式符:
%c:显示字符的ASCII码
%d,%i:显示十进制整数
%e,%E:显示科学计数法数值
%f:显示浮点数
%g,%G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身

修饰符
m[.n]:m控制显示的宽度,n表示小数点后的精度
     %3.1f
-:左对齐
+:显示数值的符号

案例1:显示多次字符串并左对齐

[[email protected] ~]# awk -F‘:‘ ‘{printf "uid:%10-s\tgid:%s\n",$1,$3}‘ passwd
uid:root          gid:0
uid:bin           gid:1
uid:daemon        gid:2
uid:adm           gid:3
uid:lp            gid:4
uid:sync          gid:5
uid:shutdown      gid:6
uid:halt          gid:7
uid:mail          gid:8
uid:operator      gid:11

[[email protected] ~]# echo ‘123 456‘ | awk ‘{printf "%s%s\n",$1,$2}‘ | sed -r ‘s#(1)(2)(3)(4)(5)(6)#\6\5\4\3\2\1#‘
654321
[[email protected] ~]# echo ‘1 2 3 4 5 6‘ | awk ‘{print $6$5$4$3$2$1}‘
654321

4、操作符

算数操作符
x+y,x-y,x*y,x^y,x%y
-x
+x

字符串操作符:没有符号的操作符,字符串连接

赋值操作符:
=,+=,-=,*=,/+,%=,^=
++,--

比较操作符
>,>=,<,<=,!=,==

模式匹配符号:
~:匹配
!~:不匹配

逻辑操作符:
&&
||
!

函数调用:
function_name(argu1,argu2,...)

条件表达式
selector?if-true-expression:if-false-expression

案例1:四则运算

[[email protected] ~]# echo | awk ‘{printf "%.2f\n",2/3}‘
0.67
[[email protected] ~]# echo | awk ‘{printf "%.2f\n",2+3}‘
5.00
[[email protected] ~]# echo | awk ‘{printf "%.2f\n",3-2}‘
1.00
[[email protected] ~]# echo | awk ‘{printf "%.2f\n",3*2}‘
6.00
[[email protected] ~]# echo | awk ‘{printf "%.2f\n",3%2}‘
1.00
[[email protected] ~]# echo | awk ‘{printf "%.2f\n",3^2}‘
9.00

案例2:比较运算符

//打印出系统用户的信息
[[email protected] ~]# awk -F‘:‘ ‘$3<1000‘ 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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

[[email protected] ~]# awk -F‘:‘ ‘$3>=1000{print $1}‘ passwd
oldboy
oldgirl

案例3:逻辑运算符

//打印非root用户的系统用户信息
[[email protected] ~]# awk -F‘:‘ ‘$1!="root" && $3<1000‘ passwd
[[email protected] ~]# awk -F‘:‘ ‘$1!~"root" && $3<1000‘ passwd
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

//打印管理员和非系统用户信息
[[email protected] ~]# awk -F‘:‘ ‘$1~"root" || $3>=1000‘ passwd
root:x:0:0:root:/root:/bin/bash
oldboy:x:1002:0:root:/root:/bin/bash
oldgirl:x:1003:0:root:/root:/bin/bash

#打印根分区已使用超过2G,打印根分区已占用空间
[[email protected] ~]# df | awk ‘/\/$/ && $3>2000000 {print $4} ‘
15121276

案例4:模式匹配

//打印bash结尾的用户名和登录shell信息
解法一:
[[email protected] ~]# awk -F‘:‘ ‘/bash$/{print $1,$NF}‘ passwd
root /bin/bash
oldboy /bin/bash
oldgirl /bin/bash
解法二:
[[email protected] ~]# awk -F‘:‘ ‘$NF~/bash/{print $1,$NF}‘ passwd
root /bin/bash
oldboy /bin/bash
oldgirl /bin/bash
解法三:
[[email protected] ~]# awk -F‘:‘ ‘$NF=="/bin/bash" {print $1,$NF}‘ passwd
root /bin/bash
oldboy /bin/bash
oldgirl /bin/bash

案例5:条件表达式

//打印用户名,并显示uid大于等于1000的普通用户,小于1000的是系统用户
[[email protected] ~]# awk -F‘:‘ ‘{$3<1000?usertype="SysUser":usertype="ComUser";printf "%10-s\t%s\n",$1,usertype}‘ passwd
root          SysUser
bin           SysUser
daemon        SysUser
adm           SysUser
lp            SysUser
sync          SysUser
shutdown      SysUser
halt          SysUser
mail          SysUser
operator      SysUser
oldboy        ComUser
oldgirl       ComUser

5、PATTERN

1)empty:空模式
2)/regular expression/:仅处理能够被匹配的行
3)关系表达式:结果为真才会被处理
    真:结果非0
4)行范围
    /pat1/,/pat2/
    不支持直接给出数字的格式
5)BEGIN/END模式
    BEGIN{}:仅在开始处理文件中的文本之前执行一次  {}      END{}:仅在文本处理之后执行一次
    行处理前                                      行处理  行处理后
[[email protected] ~]# awk -F‘:‘ ‘/^r/,/^o/{print $1}‘ passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

[[email protected] ~]# awk -F‘:‘ ‘NR>=2&&NR<=10{print $1}‘ passwd
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[[email protected] ~]# awk -F‘:‘ ‘BEGIN{printf "username\tuid\tgid\tdesc\t\thome\t\tshell\n-------------------\n"}{printf "%10-s\t%4-s\t%s\t%10-s\t%15-s\t%s\n",$1,$3,$4,$5,$6,$7}END{print "--------------------"}‘ passwd
username    uid       gid  desc           home              shell
-------------------
root          0       0    root          /root              /bin/bash
bin           1       1    bin           /bin               /sbin/nologin
daemon        2       2    daemon        /sbin              /sbin/nologin
adm           3       4    adm           /var/adm           /sbin/nologin
lp            4       7    lp            /var/spool/lpd     /sbin/nologin
sync          5       0    sync          /sbin              /bin/sync
shutdown      6       0    shutdown      /sbin              /sbin/shutdown
halt          7       0    halt          /sbin              /sbin/halt
mail          8       12   mail          /var/spool/mail    /sbin/nologin
operator      11      0    operator      /root              /sbin/nologin
oldboy        1002    0    root          /root              /bin/bash
oldgirl       1003    0    root          /root              /bin/bash
--------------------

原文地址:https://www.cnblogs.com/xmtxh/p/12173248.html

时间: 2024-11-07 03:11:53

正则表达式awk学习(三)的相关文章

awk学习笔记【转】

Awk学习笔记 整理:Jims of 肥肥世家 <[email protected]> Copyright © 2004 本文遵从GPL协议,欢迎转载.修改.散布. 第一次发布时间:2004年8月6日 Table of Contents 1. awk简介 2. awk命令格式和选项 2.1. awk的语法有两种形式 2.2. 命令选项 3. 模式和操作 3.1. 模式 3.2. 操作 4. awk的环境变量 5. awk运算符 6. 记录和域 6.1. 记录 6.2. 域 6.3. 域分隔符

awk(三)函数

函数是一个独立计算的过程,它接收一些参数并返回一些值 awk有很多内置函数,分为:算术函数和字符串函数 算术函数 cos(x) 返回x的余弦(x为弧度) exp(x) 返回e的x次幂 int(x) 返回x的整数部分的值 log(x) 返回x的自然对数(以e为底) sin(x) 返回x的正弦(x为弧度) sqrt(x) 返回x atan2(y,x) 返回y/x的反正切,其值在-180度到180度之间 rand() 返回随机数r,其中0<=r<1 srand(x) 建立rand()的新的种子数,如

正则表达式入门学习

\b-元字符,代表单词的开头或结尾,也就是单词的分界处. \bHi\b     下列未进行说明的都是元字符. .  匹配除了换行符以外的任意字符. * 指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配.(不包含换行的字符) \bHi\b.*\bLucy\b \d 匹配一位数字(0或1或2......或9)  0\d\d-\d\d\d\d\d\d\d\d - 不是元字符 ,只匹配它本身. 避免重复 0\d{2}-\d{8}  {2}({8})指前面\d必须连续重复匹配2次(8次). \

正则表达式语法学习

正则表达式用到的地方很多很广,一般用于验证 此文讲解了正则表达式的语法,以下内容转自网友[丰衣足食]的帖子 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.该模式描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 后向引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 '\\' 匹配

awk学习随常记录

回顾:字符串处理 数组: 数组 : declare -a index: 0- 关联数组 : declare -A 编程:数据结构和算法 字符串处理: 切片.查找替换.查找删除.变量赋值 GUN awk: 文本处理三工具: grep ,sed ,awk grep:grep.egrep .fgrep:文本过滤工具:pattern sed:行编辑器 模式空间.保持空间 awk:报告生成器,格式化文本输出; AWK: aho,weinberger, kernigha 命名就用三个人名字的首字母 awk主

sed&&awk学习笔记(1)

sed和awk的基本使用 在sed和awk中,每个指令都包括两个部分:模式和过程.模式是由斜杠(/)分割的正则表达式.过程制定一个或多个将被执行的动作. 执行过程中,读取脚本中的第一个指令并检测当前行的模式,如果没有匹配,这个过程被忽略并读取下一个指令.读取所有的指令,而不是读取与输入行匹配的第一条指令. 所有指令被解释并应用于单个行后,sed输出该行并循环处理每个输入行.awk不自动输出行,脚本中的指令控制awk最终所做的事情. 使用sed 调用sed有两种方法:在命令行上指定编辑指令,或者将

MongoDB入门学习(三):MongoDB的增删查改

对于我们这种菜鸟来说,最重要的不是数据库的管理,也不是数据库的性能,更不是数据库的扩展,而是怎么用好这款数据库,也就是一个数据库提供的最核心的功能,增删查改. 因为MongoDB存储数据都是以文档的模式,所以在操作它的数据时,也是以文档为单位的.那么我们实现增删查改也是以文档为基础,不知道文档是什么的同学可以看看上篇介绍的基本概念. 1.插入文档 向MongoDB集合中插入文档的基本方法是insert: 单个插入 > document = {key : value} > db.collecti

[linux]awk 学习笔记

awk 学习笔记 最近添加了几个功能的日志,但是呢,这个日志就是输出,一般自己也发现不了问题,于是想写一些简单的监控脚本来看看日志的大致情况, 比如有没有error,每天有多少error报出来. 想到了以前运维的同时分享awk,于是想简单的学习下. 入门 最简单的输入某些列 使用$4 这种来表示 __$0__是输出整列 [root]/root/test$ps -ef|grep uwsgi|awk '{print $1,$5}' root Jul24 root Jul24 root Jul24 r

Dango基础学习三

今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为<静态路由>.<动态路由>.<二级路由> 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配到的urls转发到对应app的views的函数中 2.在对应的app的views中配置相应的函数 3.这个时候我们通过浏览器访问这个url,就可以得到如下的结果 ok.至此,静态路由我们就学习完了,下面我们开始学习动态路由 二.动态路由的学习,动态路由的学习主要