http://blog.chinaunix.net/u/5591/showart.php?id=481458
)
awk处理文本总结 - Alex.Wang 2008-2-19 15:55(
作为技术支持工程我们最最经常的工作就是经常碰到要处理文本文档,不管是什么数据库最后都能够导成文本,我们就能够对他进行处理了,这样即使您不是对任何数据库操作都很熟悉也能够对他的数据进行处理了。
我们必须的工具备两个一个是shell一个是awk,awk对于处理文本文档是最最适合的掌控了awk我们就能够很方便的处理文本文档再借助一些shell命令我们能够很方便得到自己想要的结果。现在从简单的例子来总结一下我觉得会经常碰到的问题。
awk入门篇
awk入门,文本内容example1.txt.
user1 password1 username1 unit1 10
user2 password2 username2 unit2 20
user3 password3 username3 unit3 30
在unix环境中我们能够使用一下命令来打印出第一列
[root@mail awk]# awk '{print $1}' example1.txt
得到的结果是如下,解释一下"'{" 单引号大括号包含awk语句是为了和shell 命令区别,$1的意思就是文本文档的第一列,正常的awk命令跟随-F参数指定间隔符号,假如是空格或tab键就能够省略了。
user1
user2
user3
[root@mail awk]# awk '{if($5>20) {print $1}}' example1.txt
这行命令和上一行比较增加了“if($5>20)”,得到的结果是
user3
这个if语句就没有必要更周详的解释了吧!就是第5列大于20的显示出满足条件的第一列
[root@mail awk]# awk '{if($5>20 || $5==10) {print $1}}' example1.txt
user1
user3
在来一个初级的又增加了一个“if($5>20 || $5==10)” 做逻辑判断逻辑判断的三个“|| && !” 或、和、非三个能够任意加到里面,这个语句的意思是假如第5列大于20或等于10的都显示处理,在我们的工作中可能有用户会需要找出任何空间大于多少的或是空间等于多少的账户然后再做批量修改。
if是awk循环中的一个更有其他很多,man awk能够看到,
Control Statements
The control statements are as follows:
if (condition) statement [ else statement ]
while (condition) statement
do statement while (condition)
for (expr1; expr2; expr3) statement
for (var in array) statement
break
continue
delete array[index]
delete array
exit [ expression ]
{ statements }
学习awk能够经常使用一下man awk 能够看到任何的函数和使用方法。
了解每个符号的意义我们才能更好的使用awk,最开始先记住几个命令知道他可实现的结果我们慢慢的再去理解。
================================================================================
awk中级篇
这里顺便介绍一下vi的一个替换命令,现在我们要把example1.txt文本里的空格都替换为“:”冒号这里在vi里使用的命令就是:
%s/ /:/g
这个命令对于使用vi的人来说是用得最多的。我们现在做了一个新的文档example2.txt。
user1:password1:username1:unit1:10
user2:password2:username2:unit2:20
user3:password3:username3:unit3:30
现在我们来做一个awk脚本,之前都是在命令行操作,实际上任何的操作在命令行上是能够都实现的,已我们最经常使用的批量添加用户来开始!script1.awk
#!/bin/awk -f # 当文档有可执行权限的时候您能够直接执行
# ./script1.awk example2.txt
# 假如没有以上这行可能会出现错误,或
# awk -f script1.awk example2.txt 参数f指脚本文档
BEGIN { # “BEGIN{”是awk脚本开始的地方
FS=":"; # FS 是在awk里指分割符的意思
}
{ # 接下来的“{” 是内容部分
print "add {"; # 一下都是使用了一个awk函数print
print "uid=" $1;
print "userPassword=" $2;
print "domain=eyou.com" ;
print "bookmark=1";
print "voicemail=1";
print "securemail=1"
print "storage=" $5;
print "}";
print ".";
} # “}” 内容部分结束
END { # “END{” 结束部分
print "exit";
}
执行结果
[root@mail awk]# awk -f script1.awk example2.txt
add {
uid=user1
userPassword=password1
domain=eyou.com
bookmark=1
voicemail=1
securemail=1
storage=10
}
.
.
.
.
.
.
exit
文本操作就是更方便一些。
下面给两个返回效果相同的例子
[root@mail awk]# awk -F: '{print $1"@"$2}' example2.txt
[root@mail awk]# awk -F: '{printf "
[email=%s@%s\n",$1,$2}']%s@%s\n",$1,$2}'[/email]
example2.txt
[email=user1@password1]user1@password1[/email]
这里的区别是使用print 和printf的区别,printf格式更自由一些,我们能够更加自由的指定要输出的数据,print会自动在行尾给出空格,而printf是需要给定"\n"的,假如感兴趣您能够把“\n”去掉看一下结果。%s代表字符串%d 代表数字,基本上%s都能够处理了因为在文本里一切都能够看成是字符串,不像C语言等其他语言还要区分数字、字符、字符串等。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




