awk 总结
说明:本文源于“朱双印博客”,原文地址:http://www.zsythink.net/archives/tag/awk
awk 命令:
综合:
awk功能是对“文本”进行格式化输出,形成报表;awk一行一行的处理文本。
awk -- 功能:
awk功能,对文本进行格式化输出,形成报表;根据原始文档,使用awk命令,产生新的报表;
awk -- 命令格式:
awk [options] 'program' file1, file2, ...fileN
awk [options] 'Pattern {Action}' file1, file2, ...fileN
awk -- 命令说明:
1、Pattern 指 “条件”,相当于“输出的过滤条件”
2、action 指 “动作”,常用动作是“ print, printf ”;
3、当 action 中包含多条语句,使用逗号“;”分隔;
awk -- 说明:
1、双引号("")中的内容,按照原样输出;单引号('')中表示program。
2、内置变量 ( $0, $1, $2,... ,$NF ):
$0 -- 表示输出“整行”;
$NF -- 表示 当前行分割后的最后一列;
$1 , $2, ... -- 表示行的第“1”列;
3、 awk -- Pattern
BEGIN - 在处理文本之前,执行的操作;
END - 在处理文本以后,执行的操作;
4、awk -- 分隔符:
a、分隔符:输入分隔符
输入分隔符,field separator,简称 FS。
输入分隔符,awk以“空格”为默认的分隔符,用“空格”对每一列进行分隔;
输入分隔符,对文件输出时,用什么“符号”将“以整个字符串作为一行的文本”分割成若干列
举例1:选项形式,“-F”选项指定分隔符: "-F#",在"docs.txt"中,每行的“#”符号为列分隔符;
awk -F# '{print $1,$2,$3}' docs.txt
举例2:变量形式,“ -v FS='#' ”,指定分隔符:
awk -v FS='#' '{print $1,$2,$3}' docs.txt
b、分隔符:输出分隔符
输出分隔符,output field seperator,简称OFS。
输出分隔符:对文本进行输出时,用指定的“符号”分隔“原始文件的每一列”;
举例1:以变量形式,指定输出文本分隔符。
awk -v OFS='@@@' '{print $1,$2,$3}' docs.txt
c、总结:输入输出分隔符:
使用“输入分隔符”,将“以整个字符串为行的文本”分割成若干个“列”;
使用“输出分隔符”,将“指定的分隔符”替换“空格分隔符”,输出文本;
5、 下面两个命令的区别:有逗号,两列分开显示;无逗号,两列合成一列显示。
awk '{ print $1, $2}' docs.txt 两列分开显示;
awk '{ print $1 $2}' docs.txt 将两列合成一列以后,显示;
6、awk -- 变量:
变量:分为“内置变量”和“自定义变量”;
a、内置变量:
内置变量:
RS-将“指定的分隔符” 作为“行”的分隔符,分隔输入的文件;
ORS-将“指定的分隔符”替换“原始的‘行’分隔符”;
FS-将“指定的分隔符” 作为“列”的分隔符;分隔输入的文件;
OFS-将“指定的分隔符” 替换“原始的‘列’分隔符”;
NF:Number of Field,当前行的共有多少列(即当前行被分割成了几列);
NR:Number of Row,当前的行号,当前处理的文本的行号;
FNR:各个文件分别显示行号;
FILENAME:当前文件名;
ARGC:命令行参数的个数;
ARGV:数组,保存的 是命令行所给定的各个参数;
实例:
1、显示所指定的文件的“行数,每行有多少列”:
awk '{ print NR, NF}' file1, file2, ...
awk '{ print "abc", ARGC,ARGV[1], ARGV[2]}' file1, file2, ...
2、 RS-将“指定的分隔符” 作为“行”的分隔符,分隔输入的文件;
ORS-将“指定的分隔符”替换“原始的‘行’分隔符”;
FS-将“指定的分隔符” 作为“列”的分隔符;分隔输入的文件;
OFS-将“指定的分隔符” 替换“原始的‘列’分隔符”;
举例:
RS:awk -v RS='@@@' '{ print $1, $2}' file.txt
ORS:awk -v ORS='@@@' '{ print $1, $2}' file.txt
FS:awk -v FS='@@@' '{ print $1, $2}' file.txt
OFS:awk -v OFS='@@@' '{ print $1, $2}' file.txt
重点:awk -v FS='@' -v OFS='#' '{ print $1, $2}' file.txt
b、自定义变量:
自定义内置变量的方法:
方法一: -v varname=value 变量名区分大小写;
方法二: 在"program"中定义自变量,
(awk [option] ' program ' file)
(awk [option] 'Pattern {Action}' file);
实例:
举例1:自定义变量,方法一;
awk -v myvar1="hello world" '{ print myvar1}' docs.txt
awk -v myvar1="hello houdini" -v myvar2="hello world" '{ print myvar1,myvar2}' docs.txt
举例2:在“ program ” 中定义,自变量;定义多个自变量时,用“;”分隔;
awk '{ name="china"; print NR ,name}' docs.txt
awk '{ name="china";age="39"; print NR, name, age}' docs.txt
7、awk -- 格式化:
a、print 不支持格式化输出:
用法: print var1, var2, var3, ...
b、printf 支持格式化输出:
用法: printf "格式化字符串", var1, var2, var3, ...
实例: awk '{ printf " 1:%s 2:%s 3:%s \n", $1, $2, $3}' docs.txt
说明:awk中使用printf动作是注意3点。
a、printf动作输出的文本不会换行;想换行,必须使用格式化字符串"\n";
b、printf动作,“格式化字符串”与“字段($1, $2等)”之间,用逗号","分隔;
c、printf动作,“格式替换符”必须与“字段($1,$2,...)”之间“一一对应”;
8、awk -- Pattern
a、综述:
Pattern 译为 “ 模式 ”;只有与“模式”匹配的行,才会执行 “ 动作 ”。
Pattern 相当于每行的“过滤条件”;只有满足 “Pattern 条件”的行,才会执行 “Action”。
b、模式分类:
-- 空模式;
实例: awk ' { action }' docs.txt
-- 关系模式;
-- <, <=; >, >=; ==, !=;
-- ~(与正则表达式匹配,表达式为“真”), !~(与正则表达式不匹配,表达式为真)
-- BEGIN/END模式;
-- 正则模式;
-- 功能:对文本内容,与“正则表达式”匹配。
-- awk '/正则表达式/ { action }' file1,...
-- 正则表达式包含"/",用"\"进行转义处理;
-- awk '/ \/bin\/ / { print }' docs.txt
-- 说明:"/"转义处理;显示,文件docs.txt中包含字符串“/bin/”的行;
-- awk '/ \\zhao / {print }' docs.txt
-- 说明:"\"转义处理;显示,文件docs.txt中包含字符串“\zhao”的行
--注意事项:
-- awk 使用“扩展正则表达式”;
-- {x,y},需要使用"--posix"或"--re-interval"选项;
-- :awk --posix '/ [[:alpha:]]{1,3} / {print }' docs.txt;
-- 说明:显示,文件docs.txt中包含1~3个字母的字符串的行;
-- :awk --re-interval '/[[:alpha:]]{1,3} / {print }' docs.txt
-- 说明:显示,文件docs.txt中包含1~3个字母的字符串的行;
-- 行范围模式;
-- 语法格式:
-- awk '/正则表达式1/,/正则表达式2/ {action}' file1, ...
-- 功能:从第一次匹配“正则表达式1”的行开始,到第一次“正则表达式2”的行结束;
此区间的所有行,都会执行此语法的“动作”。
c、实例:
-- 空模式(无任何条件,每行都会执行“动作”):
--实例: awk ' { print $1, $2}' docs.txt
-- 关系模式:
--例子: awk 'NF ==3 { print $1, $2}' docs.txt
-- 说明:显示,文件docs.txt中当前行号等于3的行的第一列和第二列;
~: awk '$1~/[[:digit:]]+/ {print }' docs.txt
-- 说明:显示,文件docs.txt中“第一列包含至少一个数字”的行;
!~: awk '$1!~/[[:digit:]]+/ {print NR,$0}' docs.txt
-- 说明:显示,文件docs.txt中“第一列不含有数字”的行的行号和整行内容;
-- 正则模式:
--: awk '/[[:alpha:]]+/ { print }' docs.txt
-- 说明:显示,文件docs.txt中含有一个或多个字母的行;
--: awk '/ \/bin\/ / { print }' docs.txt 对"/"转义处理
-- 说明:显示,文件docs.txt中包含字符串“/bin/”的行;
--: awk '/ \\zhao / {print }' docs.txt 对"\"转义处理
-- 说明:显示,文件docs.txt中包含字符串“\zhao”的行;
-- 行范围模式:
--: awk '/88/,/li/ { print }' docs.txt
-- 说明:文件docs中从“包含88的行”到“包含li的行”之间,显示这个区间的所有的行;
9、awk -- Action
综合:
-- {} 包含多条语句时候,用分号";"分隔。
a、action的理解:
举例1: awk '{ print $0 }' docs.txt
-- 说明:
-- 上面的语句包含两个动作: “ { } ” 和 “ print $0 ”;
-- “ { } ” 为 “ 组合语句 ”类型的动作;
-- “ print $0 ” 为 “输出语句”类型的动作;
举例2:awk '{print $1} {print $2}' docs.txt
-- 说明:
-- 每行的第一列输出完毕后,然后输出每行的第二列;
-- 举例2语句 等于 awk '{ print $1; print $2 }' docs.txt
b、控制语句 之 条件(if、if...else... 、嵌套):
综合:
-- 说明:在“action('program' = ' Pattern {Action}')”内,
满足条件的行,则执行“动作”(与Pattern 很像,只是“条件”在“动作”之内)。
-- 复合条件:
-- and :
awk '{ if( condition1 && condition2 ){ print}}' docs.txt
-- 实例: awk '{ if( NR >= 2 && NR<=4){ print NR, $0}}' docs.txt
-- or :
awk '{ if( condition1 || condition2 ){ print}}' docs.txt
-- 实例: awk '{ if( NR==3 || NR==4){ print NR, $0}}' docs.txt
-- not :
awk '{ if( !(condition) ){ action } }' docs.txt
实例:
-- if: awk '{ if( NR == 3 ){ print $0;print $0} }' docs.txt
-- 说明: 显示,docs中“行号等于3”的整行内容,然后再显示“行号等于3”的整行内容;
-- if...else...:awk '{ if(NR==3){ print NR, $0}else{print NR,"-- empty --"} }' docs.txt
-- 说明:显示,文件docs.txt中 “行号等于3”,显示行号和整行内容;“行号不等于3”,显示行号和"--empyt --" ;
-- if...else if...else... 嵌套(相当于swich):
awk '{ if(NR==3){ print NR, $0}else if(NR==4){ print NR, $0}else{print NR,"NR != 3 and NR != 4 "} }' docs.txt
c、控制语句 之 循环 (for, while, do...while...)
语法:
-- for:
-- for(条件初始化; 循环条件; 循环){ action1; action2;... }
-- for( 变量 in 数组){ action1; action2;... }
-- while:
-- while(循环条件){ action1; action2;... }
-- do { action } while(循环条件)
实例:
-- for:
-- awk '{ for(i=1;i<=5;i++){ print NR, i} }' docs.txt
-- while:
-- ++i:awk -v i=1 '{ while(i<=5){ i++; print NR, i} }' docs.txt
-- i++:awk -v i=1 '{ while(i<=5){ print NR, i; i++} }' docs.txt
-- do...while():awk -v i=1 '{ do{ print NR,i; i++}while(i<=5)}' docs.txt
d、特殊"动作"(break/continue/exit/next/)
-- 循环控制“动作”:
-- break:结束循环语句;
-- 实例:awk 'BEGIN{for(i=1;i<5;i++){ print "i=", i; break} }' docs.txt
-- continue:结束‘本次’循环,执行‘下次’循环;
-- 实例:awk 'BEGIN{for(i=1;i<5;i++){ print "i=", i; continue} }' docs.txt
-- exit :退出当前执行的"program";执行“END模式的动作”;
如果没有“END模式”,直接退出awk命令。
-- 实例: awk '{ print $0; exit; print NR} END{ print "warning:EXIT"}' docs.txt
-- next :忽略对文件当前行的处理;直接处理文件的下一行
-- 实例: '$1 ~ /[[:digit:]]+/{ next} {print NR, $0}' docs.txt
10、awk -- 数组
综合:
-- 数组的定义:相当于同时声明多个带有下标的变量,变量间用分号";"分隔;
-- 实例:awk '{ name[1]="dog"; name[2]="cat"; name[3]="goose"} { idx=""; for(idx in name){print NR, name[idx]} }' docs.txt
-- index 是保留关键字,不能做自定义变量的名字;
-- awk 数组的默认下表,从1开始;
-- awk 数组元素值="",表示此元素值为“空”,隐藏“数组的此元素”;
-- awk 数组元素值="空格",表示此元素数值为“空格”,“空格”不为“空”;
-- 判断数组中是否存在对应的元素:"if( 数组下标 in 数组名)";执行“END模式的动作”;
-- awk 数组的“下标”可以是“数字”,也可以是“任意的字符串”;
-- awk 数组的本质是“关联数组”;awk默认会把“数字”下标转化为“字符串”,
所以,本质上“awk的数组” 还是一个使用字符串作为下标的关联数组;
-- delete
-- 删除数组元素:" delete 数组名[下标] ";
-- 删除数组:"delete 数组名";
-- 数组遍历:
-- 数组下标为数字:
-- for(变量初始化; 条件; 自增自减){ // 数组名[变量]}
-- 数组下标为字符串:
-- for(变量 in 数组名){ // 数组名[变量] }
特殊案例:
-- 字符串统计(这里是重点,超级难理解):
-- 原理 :
-- 核心思想:“字符串”可以进行数学加一运算(varname += 1),
即“相同变量名的字符串”可以累加,“字符串的值”是“此字符串出现的次数”;
-- awk 'BEGIN{ var1="china"; print var1; var1 += 1; print var1}' docs.txt
-- 在数学计算中,字符串变量当作数字“0”参与数值计算;
-- 方法:对于一个不存在的元素,进行自加运算后,这个元素的值变成了自家运算的次数。
-- 统计“所有字段出现的次数”:
-- awk '{ count[$1]++ } END{ for(i in count){ print count[i], i}}' docs.txt
11、awk -- 内置函数
综合:
-- 数学函数:rand()-随机函数, srand()-随机函数 / int()-截取整数部分;
-- 字符处理函数:
-- 替换函数:
gsub(源字符, 目标字符, 字段):范围内的所有'l'都替换为'm',
sub(源字符, 目标字符, 字段):替换范围内的第一个字符'l'替换为'm';
-- 举例1: gsub(l, m, $1);
-- 举例2: sub(l, m, $1);
-- length(字段):输出每行的所有列分别含有多少个字符;
-- 举例: awk '{ length($1) }' docs.txt ;
-- index(字段, 查询的字符串):获取“指定字符串” 在 “整行 ”的第几个字符开始;
-- 举例: awk '{ index($1, "lee")}'
-- 其他函数:
-- asort(原数组, 新数组):将“原数组”排序,排序后的结果放入“新数组”;
--举例: awk 'BEGIN{ t["z"]=66; t["a"]=3; t["q"]=88; asort(t, newarray); for(i in newarray){ print i, newarray[i]} }' docs.txt
12、awk -- 补充
-- 三元运算符:(exp1) ? exp2 : exp3 == if ( exp1){ exp2} else { exp3}
-- 奇数行打印/偶数行打印:
-- 奇数行打印:' i = !i'
-- awk 'i = !i{ print NR, $0}' docs.txt;
-- 偶数行打印:' !(i = !i)'
-- awk '!(i = !i){ print NR, $0}' ldocs.txt;
awk 总结的更多相关文章
- awk命令简介
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各 ...
- awk使用说明
原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...
- awk应用
h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...
- 3.awk数组详解及企业实战案例
awk数组详解及企业实战案例 3.打印数组: [root@nfs-server test]# awk 'BEGIN{array[1]="zhurui";array[2]=" ...
- shell——awk
awk -F"分隔符" "command" filename awk -F":" '{print $1}' /etc/passwd 字段引用 ...
- 【Linux】AWK入门
什么是AWK AWK是一种用于处理文本的编程语言工具,一个模式匹配程序.一个典型的示例是将数据转换成格式化的报告. 在命令行输入如下awk命令: awk -F":" '{ prin ...
- 基本shell编程【3】- 常用的工具awk\sed\sort\uniq\od
awk awk是个很好用的东西,大量使用在linux系统分析的结果展示处理上.并且可以使用管道, input | awk '' | output 1.首先要知道形式 awk 'command' fi ...
- sed awk grep三剑客常用
sed的常用用法: awk的常用用法: grep的常用用法: 除了列出符合行之外,并且列出后10行. grep -A 10 Exception kzfinance-front.log 除了列出符合行之 ...
- awk命令速查
awk与sed.grep一样都是为了加工数据流而做成的文本加工过滤器命令.awk会事先把输入的数据根据字段单位进行分割.在没有制定分割单位的情况下,以输入数据中的空格或Tab为分隔符.与sed相比,它 ...
- Sed、Awk单行脚本快速参考
文本间隔: # 在每一行后面增加一空行 sed G awk '{printf("%s\n\n",$0)}' # 将原来的所有空行删除并在每一行后面增加一空行. # 这样在输出的文本 ...
随机推荐
- CF 1198 A. MP3 模拟+滑动窗口
A. MP3 题意:给你n个数,一个大小为8*I的容量,保存一个数需要多少容量取决于给定n个数的种类k,用公式 log2 k 计算,如果给定的容量不能保存所有数,选择减少数的种类来降低保存一个 ...
- ffmpeg 学习: 003-关键函数介绍
背景 了解一些关键函数对于开发的帮助比较大. avformat_open_input FFMPEG 打开媒体的过程开始于 avformat_open_input,因此该函数的重要性不可忽视. 在该函数 ...
- docker中使用mongodb
连接mongodb容器,下拉alpine应用测试连接
- linux网络编程之shutdown() 与 close()函数详解
linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这 ...
- Thymeleaf(一)---引入js/css文件
th:href="@{/static/css/style.css}" th:src="@{/static/js/thymeleaf.js}" index.htm ...
- 009.Delphi插件之QPlugins,服务的热插拔
这个DEMO用来演示服务的替换,用起来总是怪怪的感觉,效果图如下 代码如下 unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, ...
- ②初识spring
一:基础搭建 需要:eclipse.spring插件(确认版本号并下载对应插件详见:https://blog.csdn.net/a1150499208/article/details/87988392 ...
- JAVA笔记01 变量的取名
第2章 有意义的命名2.1 介绍2.2 名副其实 变量名太随意,haha.list1.ok 这些都没啥意义2.3 避免误导 包含List等关键字.字母o与数字0等2.4 做有意义的区分 反面教材,变量 ...
- Adapter之ArrayAdapter以及监听器设置
前言: ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字~,我的学习就是通过这个最简单的适配器开始 正文: 完成这个ArrayAdapter需要三步:1.初始化数据 ...
- .nerCore-RabbitMQDemo消息队列
1.定义:MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.MQ是消费- ...