shell函数的使用
C语言中函数
int add()
{
。。。。函数内容
}
shell函数
add()圆括号里面不需要写形参,也没有返回值
{
函数
$1
$2
}
echo $1
echo $2
name="zhangsan"
name1="lisi"
pri $1 $2 函数调用 函数名 实参
打印的结果 :
shell中的函数如果你要传递参数,那么函数体中是通过$n表示第n个参数
============================================计算字符串的个数
echo "$"
shell编程中关于字符串的处理
shell脚本有很多代码都是关于处理字符串的操作
小结:目前知道的处理方法,贪婪(非贪婪)
注意:两个%%表示贪婪匹配,具体含义是:使用通配符[a-zA-Z]*从右向左“尽可能多地”
匹配字符(贪婪原则)。如果只写一个%,则无贪婪原则,那么[a-zA-Z]*将按照最少原则
匹配,即匹配 0 个字符(因为方括号星号*的含义是0 个或多个字符)。这个道理对于删除
左边字符的井号#也是适用的:双井号##代表从左到右的贪婪匹配
===============================================================
正则表达式
awk使用
测试文档:(grade.txt)
M.Tansley 05/2013 48311 Green 8 90
J.Lulu 04/2012 48317 green 12 88
P.bunny 02/2013 48 Yellow 9 70
J.Troll 09/2013 4842 Brown-3 11 95
L.Tansley 05/2013 4712 Brown-2 10 85
Vincent 07/2012 4712 Brown 13 87
1,打印指定列(例如名字和年龄)
awk '{print $1,$5}' grade.txt
注意:其中单引号中的被大括号括着的就是awk的语句,只能被单引号包含。
其中的$1..$n表示第几例。$0表示整个行。
注意:awk的工作次序是:首先读取grade.txt文件一个记录(即一行),然后根据单引号内部的指令工作,完了之后继续读下一行,以此类推。每读一行都会将单引号里面的语句从头到尾地应用到那一行中去。
2,格式化输出(和C语言一样一样的)
awk '{printf"%-10s:%-d\n", $1,$5}' grade.txt
3,过滤
awk '$5==11 && $6>=90 {print $0}' grade.txt
意思是==>打印出年龄等于11岁且分数大于90分的孩子的信息
4,打印表头,引入内建变量NR
awk 'NR==1 || $6>=90 {print}' grade.txt
注意:NR是一个所谓的内建变量,表示已经读出的记录数(即行号)
其它有用的内建变量是:
$0 当前记录(这个变量中存放着整个行的内容)
$1~$n 当前记录的第n个字段,字段间由FS分隔
FS 输入字段分隔符 默认是空格或Tab
NF 当前记录中的字段个数,就是有多少列
NR 行号,从1开始,如果有多个文件这个值将不断累加。
FNR 当前记录数,与NR不同的是,这个值会是各个文件自己的行号
RS 输入的记录分隔符, 默认为换行符
OFS 输出字段分隔符, 默认也是空格
ORS 输出的记录分隔符,默认为换行符
FILENAME 当前输入文件的名字
5,指定分隔符
awk ‘BEGIN{FS=”:”} {print $1}’ /etc/passwd
注意:BEGIN意味着紧跟在它后面的语句{FS=”:”}会在awk读取第一行之前处理。
上面的语句等价于
awk -F: ‘{print $1}’ /etc/passwd
如果有多个分隔符,则可以写成
awk -F’[\t;:]’ ‘{print $1}’ /etc/passwd
6,使用正则表达式匹配字符串
awk '$0~/Brown.*/ {print}' grade.txt 意思是==>将所有包含Brown的行打印出来
注意:波浪号~后面紧跟着一对正斜杠,表示所指定的域(这里是$0)要匹配的规则
7,使用模式取反的例子
awk '$0!~/Brown.*/ {print}' grade.txt 意思是==>将所有不包含Brown的行打印出来
8