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,...

要点:
()逗号分隔符;
()输出的个item可以是字符串,也可以是数字;当前记录的字段、变量或awk的表达式
()如省略item,相当于print $ 练习模板:
cat > passwd<<EOF
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin
EOF

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

[root@xiaoming ~]# 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
//添加制表符
[root@xiaoming ~]# 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

[root@xiaoming ~]# awk -F":" '{print "用户是:" $1 "\t 用户uid:" $3 "\t 用户gid:" $4}' passwd
用户是:root 用户uid: 用户gid:
用户是:bin 用户uid: 用户gid:
用户是:daemon 用户uid: 用户gid:
用户是:adm 用户uid: 用户gid:
用户是:lp 用户uid: 用户gid:
用户是:sync 用户uid: 用户gid:
用户是:shutdown 用户uid: 用户gid:
用户是:halt 用户uid: 用户gid:
用户是:mail 用户uid: 用户gid:
用户是:operator 用户uid: 用户gid:

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: 数组,保存的是命令行所给定的各参数 自定义变量:
)-v var=value
)在program中直接定义

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

[root@xiaoming ~]# awk -F":" '{print $1,$7}' passwd
[root@xiaoming ~]# 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定义输出分隔符

[root@xiaoming ~]# 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:打印文件行号

[root@xiaoming ~]# awk '{print NR,$0}' passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin

案例4:自定义变量

[root@xiaoming ~]# awk -v name=xiaoming '{print name,$0}' passwd
xiaoming root:x:::root:/root:/bin/bash
xiaoming bin:x:::bin:/bin:/sbin/nologin
xiaoming daemon:x:::daemon:/sbin:/sbin/nologin
xiaoming adm:x:::adm:/var/adm:/sbin/nologin
xiaoming lp:x:::lp:/var/spool/lpd:/sbin/nologin
xiaoming sync:x:::sync:/sbin:/bin/sync
xiaoming shutdown:x:::shutdown:/sbin:/sbin/shutdown
xiaoming halt:x:::halt:/sbin:/sbin/halt
xiaoming mail:x:::mail:/var/spool/mail:/sbin/nologin
xiaoming operator:x:::operator:/root:/sbin/nologin

3、printf

格式化输出:printf FORMAT,item1,item2
print item1,item2
print $,$
printf "%s,%s",$,$ )FORMAT必须要
)不会自动换行,需要给出换行控制符,\n
)FORMAT中需要分别为后面的每个item指定一个格式化符号 格式符:
%c:显示字符的ASCII码
%d,%i:显示十进制整数
%e,%E:显示科学计数法数值
%f:显示浮点数
%g,%G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身 修饰符
m[.n]:m控制显示的宽度,n表示小数点后的精度
%3.1f
-:左对齐
+:显示数值的符号

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

[root@xiaoming ~]# awk -F':' '{printf "uid:%10-s\tgid:%s\n",$1,$3}' passwd
uid:root gid:
uid:bin gid:
uid:daemon gid:
uid:adm gid:
uid:lp gid:
uid:sync gid:
uid:shutdown gid:
uid:halt gid:
uid:mail gid:
uid:operator gid: [root@xiaoming ~]# 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#' [root@xiaoming ~]# echo '1 2 3 4 5 6' | awk '{print $6$5$4$3$2$1}'

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:四则运算

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

案例2:比较运算符

//打印出系统用户的信息
[root@xiaoming ~]# awk -F':' '$3<1000' passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin [root@xiaoming ~]# awk -F':' '$3>=1000{print $1}' passwd
oldboy
oldgirl

案例3:逻辑运算符

//打印非root用户的系统用户信息
[root@xiaoming ~]# awk -F':' '$1!="root" && $3<1000' passwd
[root@xiaoming ~]# awk -F':' '$1!~"root" && $3<1000' passwd
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
sync:x:::sync:/sbin:/bin/sync
shutdown:x:::shutdown:/sbin:/sbin/shutdown
halt:x:::halt:/sbin:/sbin/halt
mail:x:::mail:/var/spool/mail:/sbin/nologin //打印管理员和非系统用户信息
[root@xiaoming ~]# awk -F':' '$1~"root" || $3>=1000' passwd
root:x:::root:/root:/bin/bash
oldboy:x:::root:/root:/bin/bash
oldgirl:x:::root:/root:/bin/bash #打印根分区已使用超过2G,打印根分区已占用空间
[root@xiaoming ~]# df | awk '/\/$/ && $3>2000000 {print $4} '

案例4:模式匹配

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

案例5:条件表达式

//打印用户名,并显示uid大于等于1000的普通用户,小于1000的是系统用户
[root@xiaoming ~]# 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

)empty:空模式
)/regular expression/:仅处理能够被匹配的行
)关系表达式:结果为真才会被处理
真:结果非0
)行范围
/pat1/,/pat2/
不支持直接给出数字的格式
)BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次 {} END{}:仅在文本处理之后执行一次
行处理前 行处理 行处理后
[root@xiaoming ~]# awk -F':' '/^r/,/^o/{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator [root@xiaoming ~]# awk -F':' 'NR>=2&&NR<=10{print $1}' passwd
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
[root@xiaoming ~]# 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 root /root /bin/bash
bin bin /bin /sbin/nologin
daemon daemon /sbin /sbin/nologin
adm adm /var/adm /sbin/nologin
lp lp /var/spool/lpd /sbin/nologin
sync sync /sbin /bin/sync
shutdown shutdown /sbin /sbin/shutdown
halt halt /sbin /sbin/halt
mail mail /var/spool/mail /sbin/nologin
operator operator /root /sbin/nologin
oldboy root /root /bin/bash
oldgirl root /root /bin/bash
--------------------

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

  1. (转) awk学习

     awk学习  原文:http://blog.chinaunix.net/uid-23302288-id-3785105.html http://www.zsythink.net/archives/t ...

  2. 【转】awk学习笔记

    Awk学习笔记 整理:Jims of 肥肥世家 <jims.yang@gmail.com> Copyright © 2004 本文遵从GPL协议,欢迎转载.修改.散布. 第一次发布时间:2 ...

  3. Django基础学习三_路由系统

    今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为静态路由.动态路由.二级路由 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配 ...

  4. ElasticSearch7.3学习(三十二)----logstash三大插件(input、filter、output)及其综合示例

    1. Logstash输入插件 1.1 input介绍 logstash支持很多数据源,比如说file,http,jdbc,s3等等 图片上面只是一少部分.详情见网址:https://www.elas ...

  5. HTTP学习三:HTTPS

    HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...

  6. TweenMax动画库学习(三)

    目录               TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)           ...

  7. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  8. 调用awk的三种方式

    调用awk的三种方式 调用awk有三种方式,一种为Shell命令行方式,另外两种是将awk程序写入脚本文件,然后执行该脚本文件.三种方式的命令格式归纳如下: 一.在Shell命令行输入命令调用awk, ...

  9. 4.机器学习——统计学习三要素与最大似然估计、最大后验概率估计及L1、L2正则化

    1.前言 之前我一直对于“最大似然估计”犯迷糊,今天在看了陶轻松.忆臻.nebulaf91等人的博客以及李航老师的<统计学习方法>后,豁然开朗,于是在此记下一些心得体会. “最大似然估计” ...

随机推荐

  1. Mac 用终端(命令行)打开vscode编辑器

    1.打开控制面板(⇧⌘P) 2.输入 shell command 在提示里看到 Shell Command: Install ‘code’ command in PATH, 就可以了. 3.使用: c ...

  2. scala通过尾递归解析提取字段信息

    一.背景 获取数据中以“|”作为字段间的分隔符,但个别字段中数据也是以“|”作为分隔符.因此,在字段提取时需要保护数据完整性. 二.实现 1.数据以“|”分隔,可以采用递归方式迭代解析.通过尾递归方式 ...

  3. ROS的Target Platforms

    问题 今天编译VIORB遇到了以下错误: 查到的资料 ubuntu18安装的二进制ros包需要特定版本的库函数 ros官方文档 文档pdf 参考回答 参考回答pdf

  4. .NET CORE 获取微信支付回调

    1.获取微信支付的回调的数据 Stream stream = HttpContext.Request.Body; byte[] buffer = new byte[HttpContext.Reques ...

  5. count(1),count(*)和count(列)的比较

    转自:https://www.cnblogs.com/Caucasian/p/7041061.html 1.关于count(1),count(*),和count(列名)的区别 相信大家总是在工作中,或 ...

  6. h5-过度

    1.过度的基本介绍及写法 .div{ width: 200px; height: 200px; background-color: red; position: absolute; left: 100 ...

  7. 复杂分布式架构下的计算治理之路:计算中间件 Linkis

    前言 在当前的复杂分布式架构环境下,服务治理已经大行其道.但目光往下一层,从上层 APP.Service,到底层计算引擎这一层面,却还是各个引擎各自为政,Client-Server 模式紧耦合满天飞的 ...

  8. 吴裕雄--天生自然ShellX学习笔记:Shell 输入/输出重定向

    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令通常将其输出写入到标准输出,默 ...

  9. 吴裕雄--天生自然 PHP开发学习:MySQL 读取数据

    <?php $servername = "localhost"; $username = "root"; $password = "admin& ...

  10. PAT Basic 反转链表 (25) [链表]

    题目 给定⼀个常数K以及⼀个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4:如果K为4,则输出应该为4→3→2→1→5→6, ...