elijah5748的专栏
欢迎 jijo2005!退出我的博客配置写文章文章管理博客首页全站当前博客空间博客好友相册留言 awk使用教程收藏 1.awk | -F field-separator| `cmd` input file awk -F : `cmd` input file 2.将awk命令插入一个文件,并使awk程序可以执行,然后用awk命令解释器作为脚本首行。 3.将所有awk命令插入一个单独文件 awk -f awk-script-file inputfile 模式和动作
模式:两个特殊断 BEGIN和END 动作:实际动作大多在{}内指明 域和记录
浏览域表记为 $1,$2,......$n($1-$n称为域标识) 输出
1.抽取域 CODE: awk -F: '{print $1}' /etc/passwd
2.保存输出 CODE: awk -F: '{print $1}' /etc/passwd | tee user
awk -F: '{print $1}' /etc/passwd >user
3.使用标准输出 4.打印所有记录 CODE: awk -F: '{print $0}' /etc/passwd
5.打印单独记录 CODE: awk -F: '{print $1,$4}' /etc/passwd
6.打印报告头 CODE: awk -F: 'BEGIN {print "NAME\n"} {print $1}' /etc/passwd
7.打印结尾 CODE: awk -F: '{print $1} END {print "this is all users"}' /etc/passwd
条件操作符 1.匹配 CODE: awk '{if($1~/root/) print $0}' /etc/passwd //{if($1~/root/) print}表示如果field1包含root,打印它//
2.精确匹配 使用等号 == 3.不匹配 !~ 4.小于 if($6 < $7) 5.小于等于 6.大于 7.设置大小写 CODE: awk '/[Rr]oot/' /etc/passwd
8.任意字符 CODE: awk '$~/^...a/' /etc/passwd //^...a表示第四个字幕是a//
9.或关系匹配 '$0 ~/(root|ftp)/' 10.行首 CODE: awk '/^48/' input-file // ^48(行首包含48)
11.AND && CODE: '{if ($1=="P.bunny" && $4=="") print $0}'
12.OR || 内置变量:
ARCC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FNR 浏览文件的记录数 FS 置顶分隔符,等价于-F NF 浏览记录的域的个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符 设置输入域到变量名
CODE: awk -F '{name=$1; pach=$7; if(name~/root/) print name" pach is "pach}' /etc/passwd
域值比较操作 CODE: awk '{if($6<$7) print $0}' input-file
修改改数值域取值 CODE: awk ‘{if($1="NAME) $6=$6-1; print$1,$6,$7}' input-file
修改文本域 CODE: awk ’{if($1="J.Troll") ($1="J.L.Troll); print $1}' input-file
只显示修改改记录 CODE: awk ’{if($1="J.Troll") {$1="J.L.Troll; print $1}}' input-file
创建新的输入域 CODE: awk '{if($6>$7) {$8=$6-$7; print $1,$8}' input-file
增加列值 CODE: awk '(tot=$6) END {print"..................."tot}' input-file
文件长度相加 CODE: ls -l | awk '/^[^d]/ {print $9"\t $5} {tot+ =$5} END {print "tltal kb:"tot}'
内置的字符窜函数
gsub(r,s) 在整个$0中用s替代r gsub(r,s,t) 在整个t中用s替代r index(s,t) 返回s中字符串t的第一位置 length(s) 返回s长度 match(s,r) 测试s中是否包含匹配r的字符串 split(s,a,fs) 在fs上将s分成序列a sub(s, ) 用$0中最左边也是最长的字符串替代 subtr(s,p) 返回字符串s中从p开始的后缀部分 substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分 1.gsub
CODE: awk 'gsub(/4842/,4899) {print $0}' input-file #/4842/为目标模式 4899为替换模式
awk 'gsub(/0/,2) {print $0}' /etc/fstab
awk '{print gsub(/0/,2) $0}' /etc/fstab
2.index查询字符串s中t出现的第一位置 CODE: awk 'BEGIN {print index("root","o")}'
awk -F: '$1=="root" {print index($1,"o")" "$1}' /etc/passwd
awk -F: '{print index($1,"o") $1}' /etc/passwd
3.length CODE: awk -F: '{print length($1)} /etc/passwd'
awk 'BEGIN {$1="root" print length($1)'
4.match (在ANCD中查找C的位置) CODE: awk 'BEGIN {print match("ANCD" ,/C/)}'
5.split 返回字符串数组元素个数 CODE: awk 'BEGIN {print split("123#456#789", myarray, "#")}'
6.sub 只能替换指定域的第一个0 CODE: awk '{print sub(/0/,"2",$1)' /etc/fstab
awk '{print sub(/0/,"2",$6)' /etc/fstab
7.substr 按照起始位置及长度返回字符串的一部分 CODE: awk 'BEGIN {print substr("Pavel.Nedved",7,3)}'
awk 'BEGIN {print substr("Pavel.Nedved",7)}'
awk -F: '{print substr($1,3)" " $1)}' /etc/passwd
字符串屏蔽序列 \b 退格键 \f 走纸换页 \n 新行 \r 回车 \t tab \c 任意其他特殊字符 \ddd 八进制 很简单的例子 CODE: awk -F: '{print $1,"\b"$2,"\t"$3} /etc/passwd
输出函数printf(注意是printf不是print,两者效果不同的) printf函数拥有几种不同的格式化输出功能 printf修饰符
- 左对齐 Width 域的步长0表示0步长 .prec 最大字符串长度,或小数点右边的位数 awk printf格式 %c ASCII字符 %d 整数 %e 浮点数,科学计数法 %f 浮点数 %g awk决定使用哪种浮点数转换,e或者f %o 八进制数 %s 字符串 %x 十六进制数 1.字符串转换
CODE: echo "65" | awk '{printf"%c\n",$0}'
awk 'BEGIN {printf "%c\n",65}'
awk 'BEGIN {printf "%f\n",999}'
2.格式化输出 CODE: 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命令传值 CODE: awk '{if ($3<UID) print $0}' UID=10 /etc/passwd
awk也允许传入环境变量 CODE: who | awk '{if ($1==user) printf $1 "you are conneted to "$2"\n"}' user=$LOGNAME
4.awk脚本文件 (在文件名字后面加后缀.awk方便区分) 例子: CODE: #!/bin/awk -f
BEGIN{
FS=":"
print "User\t\tUID"
print"________________________"
}
{printf "%-15s %s\n", $1,$3}
END{
print"END"
}
5.在awk中使用FS变量。 上述例子指定了FS变量(分隔符)为":" awk数组
数组使用前,不必定义,也不必数组元素的个数,经常使用循环来访问数组。 循环类型基本结构 For (element in array) print array [element] 例: CODE: #!/bin/awk -f
BEGIN{
record="123#456#789"
split(record,myarray,"#")
}
END{
for (i in myarray)
{print myarray[i]}
}
数组和记录 例: 一个studentest.txt文件,内容如下: Yellow#Junior Orange#Senior Yellow#Junior Purple$Junior Brown-2#Junior White$Senior Orange#Senior Red#Junior Broew-2#Senior Red#Junior Blue$Senior Green$Senior Purple$Junior White#Junior 接下来是测试脚本belt.awk
CODE: #!/bin/awk -f
BEGIN{
FS="#"
belt["Yellow"]
belt["Oragne"]
belt["Red"]
student["Junior"]
student["Senior"]
}
{
for (colour in belt)
{
if ($1==colour)
belt[colour]++}
}
{
for (senior_or_junior in student)
{
if ($2==senior_or_junior)
student[senior_or_junior]++
}
}
END{
for (colour in belt)
print "The club has",betl[colour],colour,
"Belts"
for (senior_or_junior in student)
print "The club has",student[senior_or_junior],senior_or_junior, "student"
}
运行 CODE: belt.awk studentest.txt
此例用到2出循环,用于统计student数量和clolour数量。 PS::终于看完awk了,本来昨天就应该看完的,但是由于显示器出故障的原因,浪费了偶一天的时间,今天总算是看完了(虽然有些地方还是有一些疑问,有些地方还是没掌握,不过通过实践,会慢慢的熟悉起来的^_^),不过总算是对awk有了一个大致的了解,确实,使用awk能帮我们处理很多问题,是一个很有用的工具。
发表于 @ 2008年04月19日 10:47:00|评论(0) 新一篇: 经典进程同步问题 | 旧一篇: Linux启动添加内核参数简介姓 名:
校验码:重新获得验证码 用户操作 [即时聊天] [发私信] [加为好友] elijah5748 订阅我的博客 文章分类 收藏 存档 2008年07月(4) 2008年06月(1) 2008年05月(3) 2008年04月(15) 2008年03月(23) 软件项目交易 Csdn Blog version 3.1a Copyright © elijah5748 玩游戏,iPod Nano等您拿 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/elijah5748/archive/2008/04/19/2306530.aspx
|
|