linux脚本Shell之awk详解(二)
三.printf的使用
print format 生成报表
%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 显示字符的ASCII码
%p 指针的值
%e 科学技术法显示数值
%x %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g %G 以科学计数法或浮点数的格式显示数值
%% 显示其自身
修饰符:
-: 左对齐
+: 显示数值符号
N: 显示
-F 指定段的分隔符
例:(1)生成报表
例:(2)小数问题
对小数取保留位的时候,四舍五入
对小数取整,不进行四舍五入
[root@tx3 ~]# cat awk.1 23.3456 11.234 45.67 [root@tx3 ~]# awk '{printf "%.2f\t%.2f\t%.2f\n",$1,$2,$3}' awk.1 23.3511.2345.67
四.awk的使用
(1)正则表达式
\(\) \{\} 不支持
. * ^ $ ? + [] | \< \> () 可以直接使用
[root@tx3 ~]# awk '/^$/{print "this is an empty line"}' /etc/inittab this is an empty line this is an empty line this is an empty line this is an empty line this is an empty line this is an empty line this is an empty line this is an empty line this is an empty line
[root@tx3 ~]# awk -F: '/^root/{print $1,$NF}' /etc/passwd root /bin/bash
[root@tx3 ~]# awk -F: '!/^root/{print $1,$NF}' /etc/passwd|head -3 bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin
(2)关系运算符
> < == != >= <=
~(匹配) !~(不匹配)
例:
[root@tx3 ~]# cp /etc/passwd p1 [root@tx3 ~]# awk -F: '$3 == 0 {print $1}' p1 Root
例:
[root@tx3 ~]# awk -F: '$3 != 0{ print $1}' p1 | head -2 bin Daemon
例:
[root@tx3 ~]# awk -F: '$3 < 2 {print $1}' p1 root bin
(3)逻辑运算符
&& || !
与 或 非
例:
[root@tx3 ~]# awk -F: '$3 > 0 && $3 < 10 {print $1, $3}' p1 |head -2 bin 1 daemon 2
例:
[root@tx3 ~]# awk -F: '$3 > 10 || $3 < 5 {print $1,$3}' p1 |head -6 root 0 bin 1 daemon 2 adm 3 lp 4 operator 11
(4)算数运算符
+ - * / %(取模(余数)) ^(幂运算)
例:输出名字,总成绩,平均成绩
[root@tx3 ~]# cat cj tx 90 86 86 tx1 89 78 85 tx2 79 80 85
[root@tx3 ~]# awk '{print $1,$2+$3+$4,($2+$3+$4)/3}' cj tx 262 87.3333 tx1 252 84 tx2 244 81.3333
[root@tx3 ~]# awk '{printf"%-5s %3d %.2f\n",$1,$2+$3+$4,($2+$3+$4)/3}' cj tx 262 87.33 tx1 252 84.00 tx2 244 81.33
(5)BEGIN END
BEGIN{ 动作;动作;... } 在处理文件之前,要执行的动作;只执行一次
END{ 动作;动作;... } 在处理完文件之后,要执行的动作;只执行一次
BEGIN :可以给文件添加标题、定义变量、定义文件的分隔符
END:汇总的操作
getline可以从管道和标准输入读取输入,然后传递给变量。
例:
[root@tx3 ~]# awk 'BEGIN{"date"| getline a}{print}END{print a}' cj tx 90 86 86 tx1 89 78 85 tx2 79 80 85 Thu Feb 7 12:39:25 CST 2013
五.awk里的流控制和循环
(1)简单的条件判断
语法:(表达式 ? 值1 : 值2) 如果表达式成立,输出值1;否则输出值2
[root@tx3 ~]# cat num 2 8 9 8 4 6 3 5 7 [root@tx3 ~]# awk '{print ( $1 > $2 ? $1 : $2)}' num 8 8 5
(2)if判断
语法:
{ if (表达式
{
动作1;动作2;...
}
}
如果表达式成立,那么执行动作。
[root@tx3 ~]# awk '{if ($2>=80 && $2 <=100) {print $1,"great"} else {print $1, "good"}}' cj tx great tx1 great tx2 good
(2)多支判断
{
if (表达式)
{ 动作1;动作2;...}
else if (表达式)
{ 动作1;动作2;...}
else if (表达式)
{ 动作1;动作2;...}
......
else
{ 动作1;动作2;...}
}
[root@tx3 ~]# cat cj tx 90 86 86 tx1 89 78 85 tx2 79 80 85 tx3 80 70 60 tx4 75 85 65 tx5 78 62 80
判断的标准:
90-100 A
80-89 B
70-79 C
60-69 D
0-59 E
[root@tx3 ~]# awk '{ if ($2 >= 90 && $2 <= 100) {print $1,"A"} else if ($2 >= 80 && $2 < 90) {print $1,"B"} else if ($2 >= 70 && $2 < 80) {print $1,"C"} else if ($2 >= 60 && $2 < 70) {print $1,"D"} else {print $1,"E"} }' cj tx A tx1 B tx2 C tx3 B tx4 C tx5 C
(3)循环while
语法:'var=初值;while (表达式){动作1;...更新变量的动作;}'
例:
[root@tx3 ~]# awk -F: '{i=1; while (i<=NF) {print $i;i++}}' p1 | head -7 root x 0 0 root /root /bin/bash
例. 方法一
[root@tx3 ~]# awk -F: '{i=NF; while (i>=2) {printf $i ":";i--};print $1}' p1 /bin/bash:/root:root:0:0:x:root /sbin/nologin:/bin:bin:1:1:x:bin /sbin/nologin:/sbin:daemon:2:2:x:daemon /sbin/nologin:/var/adm:adm:4:3:x:adm
例. 方法二
[root@tx3 ~]# awk 'BEGIN { FS=":" } { i=NF; while (i>=2) {printf $i ":";i--};print $1}' p1 /bin/bash:/root:root:0:0:x:root /sbin/nologin:/bin:bin:1:1:x:bin /sbin/nologin:/sbin:daemon:2:2:x:daemon
(4)for循环
语法:
{
for(表达式)
{动作1;...}
}
表达式:分为3部分:
(1)初始化表达式 i=1
(2)测试表达式 i<10
(3)更新测试表达式 i++
语句:
next 处理输入行的下一个输入行
exit 退出
continue 结束本次循环
break 跳出循环
例:
[root@tx3 ~]# awk 'BEGIN {FS=":"} {for(i=NF;i>=2;i--) {printf $i ";"};print $1}' p1 /bin/bash;/root;root;0;0;x;root /sbin/nologin;/bin;bin;1;1;x;bin /sbin/nologin;/sbin;daemon;2;2;x;daemon /sbin/nologin;/var/adm;adm;4;3;x;adm
例
[root@tx3 ~]# cat num 2 8 9 8 4 6 3 5 7 [root@tx3 ~]# awk '{ max=0; i=1; while (i<=NF) { if (max<$i) {max=$i} i++} print max}' num 9 8 7
(5)awk数组
例
例 使用变量作为数组下标
另外一种读取方式(这种是无序的,j是变量,a是数组)
数组有序
(6)函数
@1split 切割字符串
split("等待被切割的字符串",数组名,"切割用的分隔符")
[root@tx3 ~]# awk 'BEGIN{split("2012/08/23",da,"/");print da[2],da[3],da[1]}'
8 23 2012
@2toupper() 小写转大写
tolower() 大写转小写
[root@tx3 ~]# awk '{print toupper($0)}' p1 |head -3 ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
@3sub() 局部替换
gsub() 全局替换
sub(/要替换的内容/,"替换成什么内容")
gsub(/要替换的内容/,"替换成什么内容")
gsub(/要替换的内容/,"替换成什么内容",指定字段如$7)
例:
[root@tx3 ~]# awk -F: '{sub(/root/,"r00t");print}' p1 r00t:x:0:0:root:/root:/bin/bash
例:
[root@tx3 ~]# awk -F: '{gsub(/root/,"r00t");print}' p1 r00t:x:0:0:r00t:/r00t:/bin/bash operator:x:11:0:operator:/r00t:/sbin/nologin
例:
[root@tx3 ~]# awk -F[:/] '{gsub(/root/,"r00t",$7);print}' p1 root x 0 0 root r00t bin bash operator x 11 0 operator r00t sbin nologin
@4.length() 计算字符串的长度
[root@tx3 ~]# awk -F: '{print length($1),$1}' p1 4 root 3 bin 6 daemon 3 adm
@5. 数学计算
[root@tx3 ~]# awk 'BEGIN{print sin(30)}' -0.988032 [root@tx3 ~]# awk 'BEGIN{print cos(60)}' -0.952413 [root@tx3 ~]# awk 'BEGIN{print int(22/6)}' 3 [root@tx3 ~]# awk 'BEGIN{print sqrt(3)}' 1.73205
linux脚本Shell之awk详解(二)的更多相关文章
- linux脚本Shell之awk详解
一.基本介绍1.awk: awk是一个强大的文本分析工具,在对文本文件的处理以及生成报表,awk是无可替代的.awk认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一个 ...
- Linux操作系统shell与函数详解
shell和函数的定义 1. linux shell 函数 将一组命令集或语句形成一个可用的块, 这些语句块称为函数. 2. shell 函数的组成 函数名:函数名字,注意一个脚本中函数名要唯一, ...
- Linux Shell系列教程之(八)Shell printf命令详解
本文是Linux Shell系列教程的第(八)篇,更多shell教程请看:Linux Shell系列教程 在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对Shell p ...
- 【linux】linux命令grep + awk 详解
linux命令grep + awk 详解 grep:https://www.cnblogs.com/flyor/p/6411140.html awk:https://www.cnblogs.com ...
- Linux shell tr 命令详解
该随笔摘自 https://www.jb51.net/article/103892.htm Linux shell tr 命令详解 1. 用途 tr,translate的简写,主要用于压缩重复字符,删 ...
- Linux dts 设备树详解(二) 动手编写设备树dts
Linux dts 设备树详解(一) 基础知识 Linux dts 设备树详解(二) 动手编写设备树dts 文章目录 前言 硬件结构 设备树dts文件 前言 在简单了解概念之后,我们可以开始尝试写一个 ...
- Linux进程上下文切换过程context_switch详解--Linux进程的管理与调度(二十一)
1 前景回顾 1.1 Linux的调度器组成 2个调度器 可以用两种方法来激活调度 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU 另一种是通过周期性的机制, 以固定的频率运行, 不时的检测 ...
- Linux CAT与ECHO命令详解 <<EOF EOF
Linux CAT与ECHO命令详解 cat命令是Linux下的一个文本输出命令,通常是用于观看某个文件的内容的: cat主要有三大功能: .一次显示整个文件. $ cat filename .从键盘 ...
- Linux文件系统的目录结构详解
Linux文件系统的目录结构详解 一.前 言 文章对Linux下所有目录一一说明,对比较重要的目录加以重点解说,以帮助初学者熟练掌握Linux的目录结构. 二.目 录 1.什么是文件系统 2.文件 ...
随机推荐
- JPA 系列教程20-JPA2.0-@CollectionTable
@CollectionTable 指定集合表的详细信息,如果是JPA1.0必须再写一个Pojo类 ddl语句 CREATE TABLE `t_employee` ( `id` bigint(20) N ...
- 小demo--横向+展开菜单,支持m站
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- try{}catch{}finally{}的手记
try{ System.out.println("执行try"); int = 6 / 0; return 1; }catch(Exception e){ System.out.p ...
- 淘淘商城_day07_课堂笔记
今日大纲 讲解订单系统 基于订单系统完成下单功能的开发 使用Solr完成商品的搜索功能 订单系统 说明:订单系统只是做讲解,不做开发. 导入taotao-order 表结构 订单表: 订单商品表: 疑 ...
- Django 过滤器
过滤器 描述 示例 upper 以大写方式输出 {{ user.name | upper }} add 给value加上一个数值 {{ user.age | add:"5" }} ...
- alibaba远程调用框架dubbo原理
alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产 ...
- 为什么PHP(CLI)同一个错误信息会打印两次?
第一个信息是display_errors输出的,在fpm环境下输出到浏览器那里,而在CLI环境下会打印到屏幕上. display_errors = On 第二个信息是log_errors输出的. lo ...
- EconomicIndoor集成测试
加密时序列号相同引发的呼叫功能异常 现象描述: 配置完房间号一次性呼叫问题 问题描述: 两台室内机升级后配置到同一门口机, 各种配置正确. 作为主叫呼不出去, 作为被叫可以接听, 每修改一次房间号, ...
- CSS3秘笈复习:第一章&第二章&第三章
第一章: 1.<cite>标签不仅可以将网页设置为斜体,还能给标题做上标记,使它便于被搜索引擎搜索到. 第二章: 1.import指令链接样式表: CSS本身有一种添加外部样式的方法:@i ...
- 一行一行分析JQ源码学习笔记-02
1.防止冲突 设置新变量保存