每天一个 Linux 命令(4):awk
发布日期:2021-07-01 03:52:27
浏览次数:2
分类:技术文章
本文共 3292 字,大约阅读时间需要 10 分钟。
点击上方“民工哥技术之路”,选择“设为星标”
回复“1024”获取独家整理的学习资料!
推荐:
命令简介
Awk pattern scanning and processing language,对文本和数据进行处理。
awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输(stdin)、一个或多个文件,或其它命令的输出。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
语法格式
awk [options] 'scripts' var=value filename
常用参数
-F 指定分隔符(可以是字符串或正则表达式)-f 从脚本文件中读取awk命令-v var=value 赋值变量,将外部变量传递给awk
脚本基本结构
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' filename
一个awk脚本通常由BEGIN语句+模式匹配+END语句三部分组成,这三部分都是可选项.
工作原理:
第一步执行BEGIN 语句
第二步从文件或标准输入读取一行,然后再执行pattern语句,逐行扫描文件到文件全部被读取
第三步执行END语句
实例展示:
echo "hello " | awk 'BEGIN{ print "welcome" } END{ print "2017-08-08" }'welcome2017-08-08echo -e "hello" | awk 'BEGIN{ print "welcome" } {print} END{ print "2017-08-08" }'welcomehello2017-08-08#不加print参数时默认只打印当前的行echo|awk '{ a="hello"; b="nihao"; c="mingongge"; print a,b,c; }'hello nihao mingongge#使用print以逗号分隔时,打印则是以空格分界echo|awk '{ a="mgg"; b="mingg"; c="mingongge"; print a" is "b" or "c; }'mgg is mingg or mingongge#awk的print语句中双引号其实就是个拼接作用
Awk的变量
内置变量
$0 #当前记录$1~$n #当前记录的第N个字段FS #输入字段分隔符(-F相同作用)默认空格RS #输入记录分割符,默认换行符NF #字段个数就是列 NR #记录数,就是行号,默认从1开始OFS #输出字段分隔符,默认空格ORS #输出记录分割符,默认换行符
外部变量
[mingongge@ ~]#a=100[mingongge@ ~]#b=100[mingongge@ ~]#echo |awk '{print v1*v2 }' v1=$a v2=$b10000
Awk运算与判断
算术运算符
+ - 加减* / & 乘 除 求余^ * 求幂++ -- 增加或减少,作为前缀或后缀
[mingongge@ ~]#awk 'BEGIN{a="b";print a,a++,a--,++a;}'b 0 1 1[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,a--,++a;}'0 0 1 1[mingongge@ ~]#awk 'BEGIN{a="0";print a,a++,--a,++a;}'0 0 0 1#和其它编程语言一样,所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0
赋值运算符
= += -= *= /= %= ^= **=
正则运算符
~ !~ 匹配正则表达式/不匹配正则表达式
逻辑运算符
|| && 逻辑或 逻辑与
关系运算符
< <= > >= != =
其它运算符
$ 字段引用 空格 字符串链接符?: 三目运算符ln 数组中是否存在某键值
Awk正则
^ 行首定位符$ 行尾定位符. 匹配任意单个字符* 匹配0个或多个前导字符(包括回车)+ 匹配1个或多个前导字符? 匹配0个或1个前导字符 [] 匹配指定字符组内的任意一个字符/^[ab][^] 匹配不在指定字符组内的任意一个字符() 子表达式| 或者\ 转义符~,!~ 匹配或不匹配的条件语句x{m} x字符重复m次x{m,} x字符至少重复m次X{m,n} x字符至少重复m次但不起过n次(需指定参数-posix或--re-interval)
Awk实例介绍
awk –F : ‘{print $2}’ datafile#以:分隔打印第二列awk –F : ‘/^Dan/{print $2}’ datafile#以:分隔打印以Dan开头行的第二列内容awk –F : ‘/^[CE]/{print $1}’ datafile #打印以C或E开头行的第一列awk –F : ‘{if(length($1) == 4) print $1}’ datafile #打印以:分隔且长度为4字符的第一列内容awk –F : ‘/[916]/{print $1}’ datafile#匹配916的行以:分隔打印第一列awk -F : '/^Vinh/{print "a"$5}' 2.txt#显示以Dan开头行并在第五列前加上aawk –F : ‘{print $2”,”$1}’ datafile#打印第二列第一列并以,分隔awk -F : '($5 == 68900) {print $1}' 2.txt#以:分隔打印第五列是68900的行第一列 awk -F : '{if(length($1) == 11) print $1}' 2.txt#打印以:分隔且长度为4字符的第一列内容awk -F : '$1~/Tommy Savage/ {print $5}' 2.txtawk -F : '($1 == "Tommy Savage") {print $5}' 2.txt#打印以:分隔且第一列为Tommy Savage的第五列内容ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'#统计目录个的文件所有的字节数awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}' #以M为单位显示目录下的所有字节数awk 'BEGIN{a=10;a+=10;print a}'20 #a+10等价于 a=a+10echo|awk 'BEGIN{a="100testaaa"}a~/test/{print "ok"}' #正则匹配a 是否有test字符,成立打印okawk 'BEGIN{a="b";print a=="b"?"ok":"err"}'okawk 'BEGIN{a="b";print a=="c"?"ok":"err"}'err#三目运算符?:awk '/root/{print $0}' passwd #匹配所有包含root的行awk -F: '$5~/root/{print $0}' passwd # 以分号作为分隔符,匹配第5个字段是root的行ifconfig eth0|awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $4}'#打印IP地址awk '{print toupper($0)}' test.txt#toupper是awk内置函数,将所小写字母转换成大写
推荐阅读 点击标题可跳转
转载地址:https://mingongge.blog.csdn.net/article/details/111658986 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年05月02日 14时31分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
GDB命令大全
2019-05-02
IT行业培训必读:优秀程序员的十个习惯
2019-05-02
实例属性和类属性
2019-05-02
StringIO和BytesIO
2019-05-02
财务分析与决策:同型分析
2019-05-02
今日整理PDF电子书资料
2019-05-02
【语言-c#】C# 超级整数计算
2019-05-02
【软件-Doxgen】工具:程序代码生成xml文档(doxgen)
2019-05-02
【框架-MFC】CMFCMenuBar 菜单按钮的图标添加
2019-05-02
【语言-c#】C# 注释详细介绍说明
2019-05-02
MySQL 内存模型
2019-05-02
express 解析post方式下的json参数
2019-05-02
node.js 实现一个简单的登录拦截器
2019-05-02
c++抽象类、纯虚函数以及巧用纯虚析构函数实现接口类【转】
2019-05-02
Caffe 安装错误记录及解决办法【转】
2019-05-02
Android用类继承Application的全局变量使用注意
2019-05-02