(4)三剑客之awk
(1)awk工作原理
#awk -F: '{print $1,$3}' /etc/passwd
1)awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,已换行符结束
2)然后行被:分割成字段,每个字段存储在已编号的变量中,从$1开始,最多达100个字段
3)awk如何知道用空格来分隔字段的呢,因为有一个内部变量FS来确定字段分割符。初始时FS被赋予空格
4)awk打印字段时,将以设置的方法使用print函数打印,awk在打印字段间加上空格,因为$1,$3之间有个逗号,逗号比较特殊,它映射为另一个内部变量,称为输出字段分割符OFS,OFS默认为空格
5)awk输出之后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分割成字段并进行处理,该过程将持续到所有行处理完毕
(2)awk语法格式
1)语法格式:awk [options] 'command' filename
2)options
-F :定义输入字段分割符,默认的分隔符是空格或制表符(tab键)
3)command
BEGIN{}通常用于定义一些变量,例如BEGIN{FS=":";OFS="----"}
BEGIN{} {} END{}
行处理前 行处理 行处理后
# awk 'BEGIN{print 1/2}{print "ok"}END{print "-------"}' /etc/hosts
0.5
ok
ok
-------
4)命令格式:
awk 'pattern' filename 示例: awk -F:'/root/' /etc/passwd
awk '{action}' filename 示例:awk -F: '/root/{$1,$3}' /etc/passwd
awk 'pattern {action}' 示例:awk -F: '/root/{print $1,$3}' /etc/passwd
awk 'BEGIN{FS=":"}/root/{print $1,$3}' /etc/passwd
command | awk 'pattern{action}' 示例:df -P | grep "/" | awk '$4 > 25000 {print $0}'
(3)内部变量
$0:整行记录 示例:awk -F: '{print $0}' passwd
NR:行尾加个序号 示例:awk -F: '{print $0,NR}' passwd
FNR:行首加个序号 示例:awk -F: '{print FNR,$0}' passwd
NF:统计每行的字段数量 示例:awk -F: '{print $0,NF}' passwd
$NF:行最后一个字段 示例:awk -F: '{print $NF }' passwd awk -F: '{print $(NF-1)}' passwd
FS:输入字段分割符 示例:awk 'BEGIN{FS=":"}{print $1,$3}' /etc/passwd
awk -F'[ :\t]' '/root/{print $1,$3}' /etc/passwd
awk -F: '/root/{print $1,$3}' /etc/passwd
OFS:输出字段分隔符 示例:awk -F: '{print $1,$2,$3,$4}' /etc/passwd \\默认逗号就是空格
awk 'BEGIN{FS=":";OFS="+++"}{print $1,$2,$3,$4}' /etc/passwd
ORS :输出行分隔符 示例:awk 'BEGIN{ORS=" "}{print $0}' passwd \\将文件合并成一行,ORS默认输出一条记录应该是回车,这里改成输出一条使用空格而不是换行符
RS:输入行分隔符 示例: # cat /etc/passwd | head -1 >passwd1
awk 'BEGIN{RS=":"}{print $0}' passwd1 \\把一行内容根据分隔符输出成多行
总结:
字段分割符:FS OFS 默认空格或tab
行分隔符:RS ORS 默认换行符
(4)格式化输出
1)print函数
date | awk '{print "Mount:"$2 "\nYear:" $NF}'
awk -F: '{print "Username:" $1 "\tUid:" $3}' /etc/passwd
awk -F: '{print "Username,Uid:" $1,$3"!"}' /etc/passwd
2)printf函数
awk -F: '{printf "%-15s %-10s %-14s\n",$1,$2,$3}' /etc/passwd
%s:字符类型
%d:数值类型
%f:浮点类型
15:表示占用15个字符
- :表示左对齐,默认为右对齐
printf默认不会再行尾自动换行,加\n
(5)awk模式和动作
任何awk语句都由模式和动作组成,模式部分决定动作语句何时触发,模式可以是正则表达式,条件语句,复合语句
1)正则表达式
匹配整行:
#awk '/^root/' /etc/passwd
# awk '!/^root/' /etc/passwd
匹配字段:操作符(~ 或 ~!)
# awk -F: '$NF !~ /^bash/' /etc/passwd
# awk -F: '$1 ~ /^root/' /etc/passwd
2)关系运算符:< <= == != >= > 字符串比较需要双引号
awk -F: '$3 == 0' /etc/passwd
awk -F: '$3 < 10' /etc/passwd
awk -F: '$7 == "/bin/bash"' /etc/passwd
awk -F: '$1 ~ /root/' /etc/passwd
awk -F: '$1 !~ /root/' /etc/passwd
df -P | awk '$4 > 25000'
3)条件表达式:
awk -F: '$3>300{print $0}' /etc/passwd
awk -F: '{if($3>300)print $0}' /etc/passwd
awk -F: '{if ($3>300){print $0}}' /etc/passwd
awk -F: '{if($3>300){print $3}else{print$1}}' /etc/passwd
4)算术运算:+ - * / % ^
awk -F: '{if($3*10 > 140 ){print $0}}' /etc/passwd
5)逻辑运算符:&&与 ||或 !
awk '$1~/root/ && $3<15' /etc/passwd
awk '!($1~/root/ && $3<15)' /etc/passwd
(6)awk脚本编程之条件判断
1)if语句 语法格式:{if(表达式){语句;语句;...}}
awk -F":" '{if($3 == 0){print $1,"is administrator!"}}' /etc/passwd
awk -F":" '{if($3>0 && $3<1000){count++;}} END{print count}' /etc/passwd \\统计系统用户数
2)if..else语句
语法格式:{if(表达式){语句;} else{语句;}}
awk -F":" '{if($3 == 0){count++;}else{i++;}} END{print "管理员个数:"count;print "系统用户数:"i}' /etc/passwd
3)if..else if..else语句 {if(表达式){语句} else if(表达式){语句} else{语句}}
awk -F":" '{if($3 == 0){count++;} else if($3>0 && $3<1000){i++;} else{j++}} END{print "管理员个数:"count;print "系统用户数:"i;print "普通用户数:"j}' /etc/passwd
(7)awk脚本编程之while循环
1)语法:{初始值;while(条件){语句;语句}}
awk 'BEGIN{i=1;while(i<=10){print i;i++}}' \\打印1到10
awk -F":" '{i=1;while(i<=7){print $i;i++}}' /etc/passwd
awk '{i=1;while(i<=NF){print $i;i++}}' /etc/hosts \\打印每行的字段
(8)awk脚本编程之for循环
1)语法:{for(条件){语句}}
awk 'BEGIN{for(i=1;i<=10;i++){print i}}'
awk '{for(i=1;i<=NF;i++){print $i}}' /etc/hosts 等同于awk '{i=1;while(i<=NF){print $i;i++}}' /etc/hosts
(9)awk脚本编程之数组:把需要遍历的对象作为数组的索引
awk '{数组名[遍历对象]++} END{for(i in 数组名){print i,数组名[i]}}'
统计shell种类: awk -F":" '{shells[$NF]++} END{for(i in shells){print i,shells[i]}}' /etc/passwd
统计网站状态:netstat -ant | grep '\b192.168.1.253:80\b' | awk '{status[$NF]++} END{for(i in status){print i,status[i]}}'
ss -an | grep "\b192.168.1.2:80\b" | awk '{status[$1]++} END{for(i in status){print i,status[i]}}'
统计当前访问的每个ip数量:
netstat -ant| grep "\b192.168.1.2:80\b" | awk -F '[ :]+' '{ip_count[$6]++} END{for(i in ip_count){print i,ip_count[i]}}'| sort -k2 -rn
(10)awk函数:
统计用户名是4个字符
#awk -F: '$1 ~ /^....$/{count++;print $1} END{print "count is:"count}' /etc/passwd
#awk -F: 'length($1)==4{count++;print $1} END{print "count is:"count}' /etc/passwd
(11)awk引用外部变量
打印挂载分区使用容量超过10%的分区 ,这里int($5)取整数
df -h | awk -v i=10 '{if(int($5) > i){print $6":"$5}}'
(4)三剑客之awk的更多相关文章
- Linux实战教学笔记18:linux三剑客之awk精讲
Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...
- (转)不看绝对后悔的Linux三剑客之awk实战精讲
原文:http://blog.51cto.com/hujiangtao/1923930 一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中 ...
- shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计
shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...
- shell编程系列20--文本处理三剑客之awk常用选项
shell编程系列20--文本处理三剑客之awk常用选项 awk选项总结 选项 解释 -v 参数传递 -f 指定脚本文件 -F 指定分隔符 -V 查看awk的版本号 [root@localhost s ...
- shell编程系列19--文本处理三剑客之awk中的字符串函数
shell编程系列19--文本处理三剑客之awk中的字符串函数 字符串函数对照表(上) 函数名 解释 函数返回值 length(str) 计算字符串长度 整数长度值 index(str1,str2) ...
- shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句
shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句条件语句 if(条件表达式) 动作1 else if(条件表达式) 动作2 else 动 ...
- shell编程系列17--文本处理三剑客之awk动作中的表达式用法
shell编程系列17--文本处理三剑客之awk动作中的表达式用法 awk动作表达式中的算数运算符 awk动作中的表达式用法总结: 运算符 含义 + 加 - 减 * 乘 / 除 % 模 ^或** 乘方 ...
- shell编程系列16--文本处理三剑客之awk模式匹配的两种方法
shell编程系列16--文本处理三剑客之awk模式匹配的两种方法 awk的工作模式 第一种模式匹配:RegExp 第二种模式匹配:关系运算匹配 用法格式对照表 语法格式 含义 RegExp 按正则表 ...
- shell编程系列15--文本处理三剑客之awk格式化输出printf
shell编程系列15--文本处理三剑客之awk格式化输出printf printf的格式说明符 格式符 含义 %s 打印字符串 %d 打印十进制数 %f 打印一个浮点数 %x 打印十六进制数 %o ...
- shell编程系列14--文本处理三剑客之awk的概述及常用方法总结
shell编程系列14--文本处理三剑客之awk的概述及常用方法总结 awk是一个文本处理工具,通常用于处理数据并生成结果报告 awk的命名是它的创始人 Alfred Aho.Peter Weinbe ...
随机推荐
- 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有 多少总跳法?
首先我们考虑最简单的情况:如果只有1 级台阶,那显然只有一种跳法,如果有2 级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1 级:另外一种就是一次跳2 级.现在我们再来讨论一般情况:我们把n 级 ...
- [洛谷P1231] 教辅的组成
题目大意:有n1本书,n2本练习册和n3个答案,然后又一些条件,说明某本答案可能和某本书对应,某本练习册可能和某本书对应,求最多有多少本完整的书(有书,练习册,答案) 题解:网络流,对应就连边,然后考 ...
- 洛谷P4591 [TJOI2018]碱基序列 【KMP + dp】
题目链接 洛谷P4591 题解 设\(f[i][j]\)表示前\(i\)个串匹配到位置\(j\)的方案数,匹配一下第\(i\)个串进行转移即可 本来写了\(hash\),发现没过,又写了一个\(KMP ...
- 从零开始学习MXnet(一)
最近工作要开始用到MXnet,然而MXnet的文档写的实在是.....所以在这记录点东西,方便自己,也方便大家. 我觉得搞清楚一个框架怎么使用,第一步就是用它来训练自己的数据,这是个很关键的一步. 一 ...
- oracle的group by问题
ORA-00979 不是 GROUP BY 表达式”这个错误,和我前面介绍的另外一个错误ORA-00937一样使很多初学oracle的人爱犯的. 我在介绍使用聚合函数中用group by来分组数据时特 ...
- Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...
- BootStrap弹出框插件popover简单实例
1.网上实例地址 http://www.runoob.com/bootstrap/bootstrap-popover-plugin.html 2.具体demo $("#pieId&q ...
- Lucene4.6 把时间信息写入倒排索引的Offset偏移量中,并实现按时间位置查询
有个新的技术需求,需要对Lucene4.x的源码进行扩展,把如下的有时间位置的文本写入倒排索引,为此,我扩展了一个TimeTokenizer分词器,在这个分词器里将时间信息写入 偏移量Offset中. ...
- 【BZOJ2460】【BJOI2011】元素 [线性基]
元素 Time Limit: 20 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 相传,在远古时期,位于西方大陆的 Ma ...
- React module methods with passing props to child or invoking callback to parent.
Some code samples for this pupose: import React from "react"; import MyDemo from "./m ...