19027008.doc Confidentiality level 密级
c_path=$0
c_path=‘${0%/*}‘
注:如果没有路径,则c_path得到为文件名,即$0。所以,判断是否在当前路
径执行可以使用条件 ―-$c_path‖ = ―-$0‖
23.grep,sed获取文件的扩展名
例如从../../home/file.c得到c
方法一: file=$1
#得到最后一级文件名 ,如file.c
file=`basename $file`
#如果文件名中不含有.,则表示没有后缀
if [ 1 -gt `echo $file | grep -c '\\.'` ]; then echo \else
#过滤掉最后一个.以及之前的所有字符,得到扩展名 echo `echo $file | sed \fi
方法二:(参数扩展在基本sh下不支持) file=$1
#得到最后一级文件名 ,如file.c
file=`basename $file`
#从file的尾部开始删除匹配.*(一个.后跟若干字符)的最小部分并返回剩余部
分 echo \
24.sed获取第n个匹配的行的行号
get_match_line_no()
{
n=$1 #第n个匹配的行 file=$2 #要搜索的文件
str=$3 #要匹配的字符串
sed -n \} 注:
若仅仅想匹配第一个,可以用一个sed完成 sed -n '/include/ { = q
}' print.cpp
其中: =表示打印行号, q标识匹配第一个就退出。
四.awk命令
All rights reserved 版权所有,侵权必究
Page 31 , Total 83 第31页,共83页
19027008.doc Confidentiality level 密级
1.awk字段分隔符:
2.awk匹配模式
分为三类:
a) awk的关系表达式:
用来说明字段是否与要求符合。例如:$1==‖char‖ 、$2>20等等。 b) awk的正则表达式:
用//括住。规则与sed相同。 例如:
/^.$/ 匹配只有一个字符的行。
BEGIN模式意味着在读取第1行之前的匹配模式。它常用于初始化,例如设置分隔符、打印标题以及变量赋初值等。END模式是在处理完所有记录行以后的匹配模式。它常常用于输出结果。
3.awk“模式匹配-动作”
a)在每一行中匹配‘foo‘,若匹配则打印该行
awk ?/foo/ {print $0}‘ filename
b)在每一行中匹配第一个字段是否为‘foo‘, 若匹配则打印该行 awk ?$1~/foo/ {print $0}‘ filename c) awk的BEGIN和END模式:
-F选项指定了字段分隔符为冒号
awk -F: ?{print $1,$3}‘ file
4.awk内部变量 (部分变量需要验证) 变量 ARGC ARGV FILENAME FNR FS NF NR OFMT OFS ORS RS RSTART RLENGTH SUBSEP CONVFMT 含义 命令行实参个数 命令行实参数组 当前输入文件名 当前文件中的记录数 输入字段分隔符 当前记录中的字段数 至今读取的记录数 数的输出格式 输出字段分隔符 输出记录分隔符 输入记录分隔符 由match()匹配的第一个字符索引 由match()匹配的串的长度 下标分隔符 数值的内部转换格式 - ―\\34‖ %.6g 只读 只读 可读可写 默认值 - - - - 空白及制表符 - - %.6g 空白 换行符 换行符 - 属性 只读 可读可写 只读 只读 可读可写 只读 只读 可读可写 可读可写 可读可写 可读可写 只读 All rights reserved 版权所有,侵权必究
Page 32 , Total 83 第32页,共83页
19027008.doc Confidentiality level 密级
5.awk用户定义变量
用户自定义变量用以存放数据以及进行运算。
6.awk算术运算
算术运算在内部以浮点形式完成,也包含一般的加、减、乘、除、余和乘幂,运算符分别为‖+‖、‖-―、‖*‖、‖/‖、‖%‖和‖^‖。
a) awk ?$1==‖Feb‖ {sum=$2+$3} END{print sum}‘ filename
b) awk ?$1==‖ATOM‖ {a=a+$2;i=i+1}‘ filename c) 7.awk高级算符
8.awk内部算术函数 函数名 cos(x) exp(x) int(x) log() rand() 返回值 x的余弦值,x是弧度 x的幂函数 x的整数部分 x的自然对数 得出一个随机数,此随机数平均分布在0 和1 之间。这个值不会是0,也不会是1。 每次执行awk, rand 产生相同的随机数序列。 sin(x) sqrt(x) srand(x) x的正弦值,x是弧度 x的平方根 x是针对rand()的新的种子。设定产生随机数的开始点或seed 随机数种子为x。如果在第二次你设定相同的seed 值,你将再度得到相同序列的随机数如果省略参数x,则现在的日期时间会被当成seed。这个方法可使得随机数是真正不可预测的srand 的。 返回值(return value)是前次所设定的seed 值
9.awk内置函数
awk的字符串使用引号括起。通过连接常量、变量、数组元素、函数和其它表达式可以创建串表达式。
例如:打印第几号记录和一个冒号,然后打印文本行。
{print NR‖:‖$0} 函数名 gsub(r,x) gsub(r,s,t) index(s,t) length(s) 返回值 在当前记录中,用s替换r,返回替换数 在串t中,用s替换r,返回替换数 返回s串中t的位置,不出现时为0 返回s的长度 Page 33 , Total 83 第33页,共83页
++或者+=等等。
awk ?$1==‖ATOM‖ {a+=$2;i++}‘ filename
All rights reserved 版权所有,侵权必究
19027008.doc Confidentiality level 密级
match(s,r) split(s,a) split(s,a,r) sub(r,s) sub(r,s,t) substr(s,p) substr(s,p,n) 返回r在s中出现的位置,不出现时为0 针对FS把s分成数组a,返回字段数 针对r把s分成数组a,返回字段数 在当前记录中把第一个r替换成s,返回替换数 在t中把第一个r替换成s,返回替换数 返回从位置p开始的s的后缀 返回从位置p开始长度为n的s子串 注: p最小为1,当p为0时,p被置为1; n个字符包括p所在字符。 sprintf(fmt,expr_list) 根据格式串fmt返回经过格式编排的expr_list system(cmd) toupper(s) tolower(s) close( expr ) 执行命令并返回出口状态 将输入参数s中的字符全部转换为大写字符并返回转换后的字符串 将输入参数s中的字符全部转换为小写字符并返回转换后的字符串 关闭由expr表示的文件或管道,文件或管道可能被print、printf语句或调用内建函数getline打开。如果成功,函数返回0,否则返回非0值 getline 这个内建函数将$0设置为当前输入文件的下一个输入记录,getline < file将用从file中获得下一条记录修改$0的值,getline x用下一行的内容替换变量x,而$0仍然是当前行的内容。但下一次返回的将是下下一行的内容。cmd | getline将从管道中获得cmd命令的输出。如果成功,getline返回1,遇到文件结尾,getline返回0,出错返回-1。
10.awk的自定义函数
格式:
function func_name(arg_list) { } 例如:
将下列代码保存在awk_pro文件中,调用echo 5 | awk –f awk_pro,将得到输
出:5!is120。
function fact(n)
{
if(n<=1)
return 1
Page 34 , Total 83 第34页,共83页
else
return n*fact(n-1)
All rights reserved 版权所有,侵权必究
19027008.doc Confidentiality level 密级
}
{print $1‖!is‖ fact($1)}
数组实参可以通过应用传递,所以针对该函数有可能改变数组元素或创建一个新元素。标量实参将用值传递,形式参数是局部变量,但其它变量都是全局量。 11.awk的“下一”语句:
next 语句 、next file 语句 、 exit 语句
next语句强迫awk立刻停止处理目前的记录而继而处理下一个记录。
next file类似next,它强迫awk立刻停止处理目前的数据文件而继而处理下一个文件。
exit语句会使得awk程序停止执行而跳出。如果END出现,它会去执行END的动作。
12.awk中的字符串相加:
str3为str + str2 + str str=\ str2=\ str3=str str2 str
13.awk的逻辑运算符 表达式 含义 x等于y时为真 x大于y时为真 x大于或等于y时为真 x小于y时为真 x小于或等于y时为真 x不等于y时为真 x包含y时为真 x不包含y时为真 x==y x>y x>=y x 14.awk的逻辑与||、逻辑或&& awk '$2==\ awk '/2400/ && /foo/' BBS-list awk '/2400/ || /foo/' BBS-list awk '!/foo/' BBS-list 15.awk的FS、OFS和ORS使用: 以‘|‘为分隔符输出各个域 awk ?BEGIN{OFS=‖|‖}{print $1,$2,$3,$4}‘ filename awk 'BEGIN {OFS=\awk 'BEGIN {FS=\ Page 35 , Total 83 第35页,共83页 例如: awk '$2~\ All rights reserved 版权所有,侵权必究