免费注册 查看新帖 |

Chinaunix

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

awk应用小结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-16 15:01 |只看该作者 |倒序浏览

                awk
调用:
1.调用awk:
第一种方式:命令行方式
[color="Blue"]awk [-F field-separator] 'commands' input-file(s)
[-F域分隔符]是可选的,因为awk使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,如果要浏览诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明-F选项,如:
[color="Blue"]awk -F: 'commands' input-file
第二种方式是将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的awk命令插入一个单独文件,然后调用:
[color="Blue"]awk -f awk-scrīpt-file input-files(s)
-f选项指明在文件awk_scrīpt_file中的awk脚本,input_file(s)是使用awk进行浏览的文件名。
模式和动作
任何awk语句都由模式和动作组成。在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式
部分,动作将时刻保持执行状态。模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段
BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文本开始执行。END语
句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。
域和记录
使用$1,$3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有5个域的记录的所有域,可使用$0,意即所有域。
为打印一个域或所有域,使用print命令。这是一个awk动作
模式和动作
模式:两个特殊断 BEGIN和END
动作:实际动作大多在{}内指明
输出
1.抽取域
awk -F: '{print $1}' /etc/passwd
2.保存输出
awk -F: '{print $1}' /etc/passwd | tee user 使用tee命令,在输出文件的同时,输出到屏幕
使用标准输出
awk -F: '{print $1}' /etc/passwd >user3
4.打印所有记录
awk -F: '{print $0}' /etc/passwd
5.打印单独记录
awk -F: '{print $1,$4}' /etc/passwd
6.打印报告头
awk -F: 'BEGIN {print "NAME\n"} {print $1}' /etc/passwd
7.打印结尾
awk -F: '{print $1} END {print "this is all users"}' /etc/passwd
条件操作符
1.匹配
awk -F: '{if($1~/root/) print }' /etc/passwd      //{if($1~/root/) print}表示如果field1包含root,打印它
2.精确匹配
使用等号 ==
awk -F: '{if($3=="0") print }' /etc/passwd  
3.不匹配
!~
awk -F: '{if($1!~/linuxtone/) print }' /etc/passwd
!=
精确不匹配
awk -F: '{if($1!="linuxtone") print }' /etc/passwd
4.小于

.........
7.设置大小写
awk '/[Rr]oot/' /etc/passwd
8.任意字符
awk -F: '{if($1~/^...t/) print}' /etc/passwd      //^...t表示第四个字幕是t
9.或关系匹配
awk -F: '{if ($1~/(squid|nagios)/) print}' /etc/passwd
10.行首
awk '/^root/' /etc/passwd       // ^root(行首包含root)
11.AND &&
awk -F: '{if($1=="root" && $3=="0") print}' /etc/passwd
12.OR ||
内置变量:
[color="Blue"]ARCC                                      命令行参数个数
[color="Blue"]ARGV                                      命令行参数排列
[color="Blue"]ENVIRON                                   支持队列中系统环境变量的使用
[color="Blue"]FNR                                       浏览文件的记录数
[color="Blue"]FS                                        置顶分隔符,等价于-F
[color="Blue"]NF                                        浏览记录的域的个数
[color="Blue"]NR                                        已读的记录数
[color="Blue"]OFS                                       输出域分隔符
[color="Blue"]ORS                                       输出记录分隔符
[color="Blue"]RS                                        控制记录分隔符
打印有多少行记录
awk 'END {print NR}' /etc/passwd
设置输入域到变量名
awk -F: '{name=$1; path=$7; if(name~/root/) print name  "\tpath is:" path}' /etc/passwd
域值比较操作
awk '{if($6<$7) print $0}' input-file
修改文本域只显示修改改记录
awk -F: '{if($1=="nagios") {$1="nagios server" ; print }}' /etc/passwd
文件长度相加
ls -l|awk '/^[^d]/ {print $9"\t" $5} {tot+=$5} END {print "total kb:"tot}'
内置的字符窜函数
[color="Blue"]gsub(r,s)                                                      在整个$0中用s替代r
[color="Blue"]gsub(r,s,t)                                                    在整个t中用s替代r
[color="Blue"]index(s,t)                                                     返回s中字符串t的第一位置
[color="Blue"]length(s)                                                      返回s长度
[color="Blue"]match(s,r)                                                     测试s中是否包含匹配r的字符串
[color="Blue"]split(s,a,fs)                                                  在fs上将s分成序列a
[color="Blue"]sub(s, )                                                       用$0中最左边也是最长的字符串替代
[color="Blue"]subtr(s,p)                                                     返回字符串s中从p开始的后缀部分
[color="Blue"]substr(s,p,n)                                                  返回字符串s中从p开始长度为n的后缀部分
1.gsub
awk 'gsub(/^root/,"netseek") {print}' /etc/passwd             将与root开头的root替换为netseek
awk 'gsub(/0/,2) {print}' /etc/fstab
awk '{print gsub(/0/,2) $0}' /etc/fstab                       
2.index
awk 'BEGIN {print index("root","o")}'  查询字符串root中o出现的第一位置
awk -F: '$1=="root" {print index($1,"o")" "$1}' /etc/passwd
awk -F: '{print index($1,"o") $1}' /etc/passwd
3.length
awk -F: '{print length($1)'} /etc/passwd
awk -F: '$1=="root" {print length($1)}' /etc/passwd
4.match (在ANCD中查找C的位置)
awk 'BEGIN {print match("ANCD",/C/)}'
5.split
返回字符串数组元素个数
awk 'BEGIN {print split("123#456#789", myarray, "#")}'
6.sub   只能替换指定域的第一个0
awk 'sub(/0/,2) {print }' /etc/fstab
7.substr
按照起始位置及长度返回字符串的一部分
awk 'BEGIN {print substr("www.linuxtone.org",5,9)}'  //第5个字符开始,取9个字符。
awk 'BEGIN {print substr("www.linuxtone.org",5)}'  //第5个位置开始,取后面的所有.
字符串屏蔽序列
[color="Blue"]\b                  退格键
[color="Blue"]\f                  走纸换页
[color="Blue"]\n                  新行
[color="Blue"]\r                  回车
[color="Blue"]\t                  tab
[color="Blue"]\c                  任意其他特殊字符
[color="Blue"]\ddd                八进制
很简单的例子
awk -F: '{print $1,"\b"$2,"\t"$3}' /etc/passwd 输出函数printf(注意是printf不是print,两者效果不同的)
printf函数拥有几种不同的格式化输出功能
printf修饰符
[color="Blue"]-                               左对齐
[color="Blue"]Width                        域的步长0表示0步长
[color="Blue"].prec                          最大字符串长度,或小数点右边的位数
awk printf格式
[color="Blue"]%c                              ASCII字符
[color="Blue"]%d                              整数
[color="Blue"]%e                              浮点数,科学计数法
[color="Blue"]%f                               浮点数
[color="Blue"]%g                              awk决定使用哪种浮点数转换,e或者f
[color="Blue"]%o                              八进制数
[color="Blue"]%s                              字符串
[color="Blue"]%x                              十六进制数
1.字符串转换
echo "65" | awk '{printf"%c\n",$0}'
awk 'BEGIN {printf "%c\n",65}'
awk 'BEGIN {printf "%f\n",999}'
2.格式化输出
awk -F: '{printf "%-15s %s\n",$1,$3}' /etc/passwd
awk -F: 'BEGIN {printf"USER\t\tUID\n"} {printf "%-15s %s\n",$1,$3}' /etc/passwd
3.向一行awk命令传值
who | awk '{if ($1 == user) print $1 " you are connected to:" $2}' user=$LOGNAME
4.awk脚本文件 (在文件名字后面加后缀.awk方便区分)
#!/bin/awk -f
BEGIN{
    FS=":"
        print "User\t\tUID"
        print"____________________________"
}
{printf "%-15s %s\n",$1,$3}
END{
       print "END"
}
本文转自:
http://www.linuxtone.org/html/77/t-2777.html


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93182/showart_1965985.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP