Chinaunix首页 | 论坛 | 博客
  • 博客访问: 186158
  • 博文数量: 36
  • 博客积分: 1952
  • 博客等级: 上尉
  • 技术积分: 485
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-08 22:30
文章存档

2011年(1)

2010年(35)

分类: LINUX

2010-07-19 18:02:32

一、awk内置的字符串函数:
1、gsub(r,s)        在整个$0中用$代替r
gsub(r,s,t)      在整个t中用s替代r
使用正则表达式,/目标模式/,替换模式/
e.g:改变学生序号4842到4899:
#awk 'gsub(/4842/,4899) {print $0}'  grade.txt
-------------------------------------------------
2、index(s,t)       返回s中字符串t的第一位置(必须用双引号将字符括起来)
e.g:返回目标字符串Bunny中的ny出现的第一位置,即字符个数。
#awk 'BEGIN {print index{"Bunny","ny"}}'  grade.txt
4
--------------------------------------------------
3、length(s)        返回s长度
e.g:返回所需字符串长度,检验字符串J.Troll返回名字及长度,即人名构成的字符个数
#awk  ‘$1=="J.Troll" {print length($1)""$1}’ grade.txt
7   J.Troll或者
#awk 'BEGIN {print length("A FEW GOOD MEN")}'
14
--------------------------------------------------
4、match(s,r)       测试s是否包含匹配r的字符串
e.g:
#awk 'BEGIN {print match("ANCD",/d/)}'
0
#awk 'BEGIN {print match("ANCD",/c/)}'
3
#awk '$1=="J.Lulu" {print match($1,"u")}' grade.txt
4
-------------------------------------------------------
5、split(s,a,fs)     在fs上将s分成序列a
e.g:工作方式:如果有一个字符串,包含一指定分隔符-,例如:AD2-KP9-JU2-LP-1,将之划分成一个数组,使用split指定分隔符及数组名。
命令格式为("AD2-KP9-JU2-LP-1",partsarray,"-"0),split然后返回数组下标数,这
里结果为4
----------------------------------------------------------------------------
sprint(fmt,exp)   返回经f m t格式化后的e x p
6、sub(r,s)          用$ 0中最左边最长的子串代替s
e.g:使用s u b发现并替换模式的第一次出现位置。字符串S T R包含‘poped popo pill’,执行下列sub命令sub(/op/,"op",STR)。模式op第一次出现时,进行替换操作,返回结果如下:‘pO Ped pope pill’。
#awk '$1=="J.Troll" sub(/26/,"29",$0)'  grade.txt
-----------------------------------------------------------------------------
7、substr(s,p)       返回字符串s中从p开始的后缀部分
e.g:指定在域1的第一个字符开始,返回其前面5个字符。
#awk '$1=="L.Tansley" {print substr($1,1,5)}'  grade.txt
L.Tan
substr(s,p,n)     返回字符串s中从p开始长度为n的后缀部分(需要给出指定字符串及返回字符串的起始位置)
e.g:从文本文件中抽取姓氏,需操作域1,并从第三个字符开始:
#awk '{print substr($1,3)}'  grade.txt
e.g:在BEGIN部分定义字符串,在END部分返回从第t个字符开始抽取的子串
#awk  'BEGIN {STR="A FEW GOOD MEN"}END{print substr(STR,7)}' grade.txt
GOOD MEN
------------------------------------------------------------
8、从shell中向awk传入字符串
(1)使用管道,
返回其长度
#echo "Stand-by" | awk '{print length($0)}'
设置文件名为一变量,管道输出到awk,只返回其扩展名。
#STR="mydoc.txt"
#echo $STR | awk '{print substr($STR,1,5)}'
mydoc
-------------------------------------------------------------
9、awk输出函数printf
printf函数,拥有几种不同的格式化输出功能
e.g:按列输出,左对齐或右对齐方式。
每一种p r i n t f函数(格式控制字符)都以一个%符号开始,以一个决定转换的字符结束。转换包含三种修饰符。
p r i n t f函数基本语法是p r i n t 格式控制字符通常在引号里。
---------------------------------------------------------------
10、printf修饰符
-           左对齐
Width       域的步长,用0表示0步长
.prec        最大字符串长度,或小数点右边的位数
awk printf格式:
%c      A S C I I字符
%d      整数
%e     浮点数,科学记数法
%f     浮点数,例如(1 2 3 . 4 4)
%g     a w k决定使用哪种浮点数转换e或者f
%o     八进制数
%s     字符串
%x     十六进制数
(1)字符转换
#echo "65" | awk '{printf "%c\n",$0}'同样也可以
#awk 'BEGIN {printf "%c\n",65}'
下面浮点数转换后‘999’的输出结果,整数传入后被加了六个小数点
#awk 'BEGIN {printf "%f\n",999}'
(2)格式化输出
e.g:打印所有的学生名字和序列号,要求名字左对齐, 1 5个字符长度,后跟序列号。注意\n换行符放在最后一个指示符后面。输出将自动分成两列。
awk '{printf "%-15s %s\n",$1,$3}'  grade.txt
(3)向一行awk命令传值
e.g:在命令行中设置变量A G E等于1 0,然后传入a w k中,查询年龄10岁以下的所有学生
#awk '{if ($5 < AGE) print $0}' AGE=10 grade.txt
(4)使用awk脚本文件
然后
chmod u+x 脚本名字
(5)在awk中使用FS变量
如果使用非空格符做域分隔符( F S)浏览文件,例如# 或:,编写这样的一行命令很容易,因为使用F S选项可以在命令行中指定域分隔符
#awk -F:'awk {print $0}' input-file
使用awk脚本时,记住设置FS变量是在BEGIN部分。如果不这样做,awk将会发生混淆,不知道域分隔符是什么
(6)向awk脚本传值
格式:
awk  script_file  var-value  input-file
11、awk数组:
===============================================================
二、字符串屏蔽序列:
\b   退格键     \t     tab键
\f   走纸换页    \ddd   八进制值
\n    新行       \c  任意其他特殊字符,例如\\为
\r    火车键
e.g:打印May Day,中间夹tab键,后跟两个新行,再打印May Day,但这次使用八进制数104、141、171,分别代表D、a、y.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
阅读(1750) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~