awk使用教程 - elijah5748的专栏 - CSDN博客

来源:百度文库 编辑:神马文学网 时间:2024/04/17 05:52:00
 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 userawk -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/fstabawk '{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/passwdawk -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/fstabawk '{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/passwdawk -F: 'BEGIN {printf"USER\t\tUID\n"} {printf "%-15s %s\n",$1,$3}' /etc/passwd
3.向一行awk命令传值
CODE:awk '{if ($3awk也允许传入环境变量
CODE:who | awk '{if ($1==user) printf $1 "you are conneted to "$2"\n"}' user=$LOGNAME
4.awk脚本文件 (在文件名字后面加后缀.awk方便区分)
例子:
CODE:#!/bin/awk -fBEGIN{         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 -fBEGIN{         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 -fBEGIN{         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