免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1092 | 回复: 2
打印 上一主题 下一主题

[学习分享] AWK基础知识 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-05-14 22:20 |只看该作者 |倒序浏览
本帖最后由 dream_my_dream 于 2015-05-14 22:21 编辑

1、字段分割
awk '{print "first:" $1  "last:"  $4} ' forawk
awk -F ":" '{print "user:"  $1 "\tshell:" $7}' forawk
-F参数设置的是awk的初始变量FS,FS变量控制着awk的字段分隔符,默认情况下是空白字符。


2、AWK代码结构
将awk的运行看成3部分组成:处理输入前的初始化,处理输入过程,处理完所有输入后的扫尾工作。BEGIN和END分别映射到第一部分和第三部分。
(1)BEGIN代码快
awk脚本包含一个BEGIN代码快,格式是BEGIN标签加上{}。当脚本很简单时,使用-F参数能减少输入的字符数,但是,当脚本很复杂时,使用FS参数清晰的显示了awk的逻辑。
awk 'BEGIN{FS=":"}{print  "user:" $1  "\tshell" $7}' forsed
(2)END代码快
[root@forshell shell]# cat end
BEGIN{print "how many people with nologin?"}   
写在BEGIN代码块中的代码只在初始化时被运行一次
/nologin/{++adder}                               
与正则表达式匹配,成功,执行++adder
END{print "'nologin' appears "adder" times"}
[root@forshell shell]# awk -f end /etc/passwd
how many people with nologin?
'nologin' appears 25 times
[root@forshell shell]# grep -c nologin /etc/passwd
25
(3) 模式匹配
/正则表达式/ {匹配后执行的操作}
[root@forshell shell]# awk -F ":" '/bin\/bash/ {print "hello," $1}' /etc/passwd
hello,root                                           #匹配/bin/bash
hello,pop
hello,ling
awk 'BEGIN{FS=":"} /bin\/bash/ {print "hello," $1}' /etc/passwd


3、变量
变量使用无需先声明,变量只存储字符串,当需要时在转换为其他类型
大小写敏感。局部变量小写,全局变量带一个字母大写,内建变量全部大写。
常用的内建变量:
FS:字段分割符,默认为空格      RS:输出记录分割字符
OFS:输出字段分割字符                        ORS:输出记录分割字符,默认为“\n”
NR:在工作中的记录数                                 FNR:当前输入文件的记录数
NF:当前记录的字段数

4、格式化输出
Print:打印整行,输出到stdout
Printf :将格式化字符串打印到stdout
Sprintf :返回可以赋值给变量的格式化字符串


5、字符串函数

(1)子字符串查找
index(str,substr) :返回子串在整个串中第一次出现的位置。
函数字符串开始位置为1,没有找到子串返回0.
(2)子字符串提取
substr(str,position,[length]):返回str中从position开始的length个字符
[root@forshell shell]# cat info.txt
029-587-49079:Lily
029-587-49081:Kathy
[root@forshell shell]# awk '{print substr($1,5,9)}' info.txt
587-49079
587-49081
(3)字符串匹配
match(str,/reg/):如果在串str中找到正则/reg/匹配的串,则返回出现的位置,未找到则返回0。
与index()的区别:index()函数是查找固定字符串的位置,match()支持正则表达式查询。
(4)子字符串替换
sub(/reg/,replacement,target):只替换第一个匹配字符串。与正则表达式/reg/进行匹配,将target中左边最长的匹配部分替换成replacement。如果没有给定target,则默认使用整条记录。
gsub(/reg/,replacement,target):替换所有匹配的字符串。
# echo "testthisistest test"|awk '{gsub(/test/,"mytest");print}'
mytestthisismytest mytest
#echo "testthisistest test"|awk '{sub(/test/,"mytest");print}'
mytestthisistest test
(5)大小写转换
toupper(str):对字符串进行大小写转换
tolower(str):对字符串进行大小写转换



论坛徽章:
6
2015亚冠之广州恒大
日期:2015-05-25 15:01:512015亚冠之大阪钢巴
日期:2015-11-09 21:04:562015亚冠之山东鲁能
日期:2015-11-11 14:30:3215-16赛季CBA联赛之山西
日期:2016-03-11 11:11:5215-16赛季CBA联赛之江苏
日期:2016-04-06 10:48:4915-16赛季CBA联赛之北控
日期:2016-11-09 10:23:22
2 [报告]
发表于 2015-05-15 14:43 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
18
处女座
日期:2014-11-13 15:52:322015亚冠之胡齐斯坦钢铁
日期:2015-08-14 16:09:082015亚冠之北京国安
日期:2015-06-02 18:41:152015亚冠之广州恒大
日期:2015-06-02 18:41:15NBA常规赛纪念章
日期:2015-05-04 22:32:032015年亚洲杯之中国
日期:2015-04-01 16:38:392015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之阿联酋
日期:2015-03-06 09:33:432015年辞旧岁徽章
日期:2015-03-04 13:32:472015年迎新春徽章
日期:2015-03-04 10:01:44拜羊年徽章
日期:2015-03-03 16:15:43洛杉矶快船
日期:2015-03-02 16:05:34
3 [报告]
发表于 2015-05-17 09:17 |只看该作者
学习下,还是很容易理解的。感谢分享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP