shell正则表达 二部分
一、printf命令:
1.格式化输出。(print format)
2.命令格式:
printf'打印格式'实际内容
@L_301_1@
打印格式:
1)\a(警告声音输出)
\b(退格键)
\n(输出新的一行)
\r(帧处于行的开始,即enter键)
\t(水平的table键)
\v(垂直的table键)
\xNN(x为ASCII码十六进制表示;NN为俩位数数字;可转换数字成为字符)
%ns(n为数字;s代表string,即多少个字符)
%ni(n为数字;i代表integer,即多少整数字符)
%N.nf(n、N为数字;f代表floating浮点,小数字数即小数点)
例子:
以2位整数形式输出23并换行,以7位字符串形式输出hello
案例文本
输出结果没有对齐
如上,可设置字段格式使之对齐(字符串长度、整数及小数点长度)
二、awk命令:
三、awk 则比较倾向于一行当中分成数个字段来处理。
.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。
命令行方式
awk [-F field-separator] 'commands' input-files
[-F field-separator],域分隔符,默认为空格或tab;
commands为awk命令;input-files为待处理文件。
Linux系统使用环境变量IFS存储分隔符;
查看默认分隔符
oldIFS=$IFS(把环境变量IFS存到oldIFS)
IFS=","(定义分隔符为,)
之后把环境变量返回原值(空格/tab)。
shell脚本方式
Awk-f awk-script-file input-files
其中,-f选项加载awk-script-file中的awk脚本,input-files跟上面的是一样的。
1) 正则表达式用作awk_pattern: /regexp/
例如:awk '/ ^[a-z]/' input_file
2) 布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行。
①表达式中可以使用变量(如字段变量$1,$2等)和/regexp/
② 布尔表达式中的操作符:
关系操作符: < > <= >= == !=
匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,则返回真
value !~ /regexp/ 如果value不匹配/regexp/,则返回真
例如: awk '$2 > 10 {print "ok"}' input_file
awk '$3 ~ /^d/ {print "ok"}' input_file
③ &&(与) 和 ||(或) 可以连接两个/regexp/或者布尔表达式,构成混合表达式。!(非) 可以用于布尔表达式或者/regexp/之前。
a)正则表达式(/regexp/)
取passwd中小写字母a到d开头的。
布尔表达式
变量(如字段变量$1 $2)和/regexp/;
关系操作
符:< > <= >= == !=
提取test.txt中chinese大于75为优秀。
匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,则返回真value !~ 不匹配,则返回真;
&&(与)、||(或)
模式包括两个特殊字段BEGIN和END。使用语句设置计数和打印头。语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文本开始执行。语句用来在完成文本浏览动作后打印输出文本总数和结尾状态标志。
动作:
实际动作在大括号{}内指明。动作大多数用来打印。
awk的运行过程:
BEGIN 区块存在,执行它指定的actions。
从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取)
将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。
把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的。如果不匹配,就跳过对应的,直到比较完所有的当一条输入记录比较了所有的后,读取输入的下一行,继续重复步骤③④,这个过程一直持续,直到读取到文件尾。
显示文件中UID大于500的所有用户的用户名和登录shell
显示/etc/passwd文件中的UID大于500的用户名和登录shell,而账户与之间以逗号分割而且在所有行添加列名name,shell,37);font-size:19px;">在最后一行添加"blue,/bin/nosh"。
函数及脚本的综合应用
1、shell函数:shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数。
函数由两部分组成:函数标题、函数体。标题是函数名。函数体是函数内的命令集合。标题名应该唯一;如果不是,将会混淆结果,因为脚本在查看调用脚本前将首先搜索函数调用相应的shell。