shell正则表达 二部分

wKioL1leDzXBaH26AAALp7C_tTc424.png-wh_50

一、printf命令:

1. 格式化输出。(print  format)

2. 命令格式:

printf'打印格式'实际内容

wKiom1leD0mhI1XsAACwSrnAtC0150.png-wh_50

1. 打印格式:

1) \a(警告声音输出)

wKiom1leD2qC-ye-AAAITmz84qA780.png-wh_50

1) \b(退格键)

wKiom1leD4SQrm9TAAAGYpRgcGs927.png-wh_50

1) \n(输出新的一行)


wKiom1leD8OwIoCvAAAGW7B8OUE621.png-wh_50

1) \r(帧处于行的开始,即enter键)

wKioL1leD9GSiH3tAAAGtp5Jd-k106.png-wh_50

\t(水平的table键)

wKioL1leD-nA4oYtAAAGR4DZUaY864.png-wh_50

1) \v(垂直的table键)

wKiom1leD_3SIJxxAAAGU19SSCI107.png-wh_50

1) \xNN(x为ASCII码十六进制表示;NN为俩位数数字;可转换数字成为字符)

wKioL1leEKTiJM9eAAATwTJdqpM026.png-wh_50

1) %ns(n为数字;s代表string,即多少个字符)

wKioL1leEOvT1_nEAAAHSHeIeDw807.png-wh_50

1) %ni(n为数字;i代表integer,即多少整数字符)

wKiom1leEPvxbsmsAAAHR3Ee-js888.png-wh_50

1) %N.nf(n、N为数字;f代表floating浮点,小数字数即小数点)

wKioL1leEQ7CsI2QAAAO7R_RmIM109.png-wh_50

1. 例子:

1) 以整数形式输出23并换行,以字符串形式输出hello并换行

wKiom1leESOi9XiuAAAPrMwUt_o093.png-wh_50

2位整数形式输出23并换行,以7位字符串形式输出hello

wKioL1leETywP0MDAAAPtWT2gQw421.png-wh_50

案例文本

wKiom1leEVjgybo6AAAUqZgNu7c069.png-wh_50

输出结果没有对齐

wKioL1leEWWR6B_fAAAU7BSPWMQ738.png-wh_50

如上,可设置字段格式使之对齐(字符串长度、整数及小数点长度)


二、awk命令:

三、awk 则比较倾向于一行当中分成数个字段来处理。

.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。

1) 命令行方式

awk   [-F  field-separator]  'commands'  input-files

[-F  field-separator],域分隔符,默认为空格或tab;

commands为awk命令;input-files为待处理文件。

Linux系统使用环境变量IFS存储分隔符;

wKioL1leEZ-yCyRxAAAF5xcBoaI968.png-wh_50

查看默认分隔符


wKiom1leEauBMotcAAAYW26CyB0054.png-wh_50

oldIFS=$IFS(把环境变量IFS存到oldIFS)


IFS=","(定义分隔符为,)


wKioL1leEbeiTfpVAAAHyP6dU9o597.png-wh_50

之后把环境变量返回原值(空格/tab)。

1) shell脚本方式

wKiom1leEc3Dv-GfAAAK77CUnXM277.png-wh_50

1) awk命令插入一个单独文件,然后调用

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/)

wKioL1leEeDTolhAAAAvfdg4lY4885.png-wh_50

passwd中小写字母a到d开头的。

a) 布尔表达式

变量(如字段变量$1  $2)和/regexp/;

关系操作

wKioL1leEe_AnXETAAAL8601ZBQ112.png-wh_50

: < > <= >= == !=

提取test.txt中chinese大于75为优秀。
匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,则返回真
value !~ /regexp/ 如果value不匹配/regexp/,则返回真;

wKioL1leEgSxfo8sAAAPsG9wF1Y666.png-wh_50

提取passwd中匹配d开头的显示ok。

a) &&(与)、||(或)

 wKiom1leEhbhTkqxAAAb_7ftCDM776.png-wh_50

模式包括两个特殊字段 BEGINEND。使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文本开始执行。END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。

1) 动作:

实际动作在大括号{ }内指明。动作大多数用来打印。

1. awk的运行过程:

如果BEGIN 区块存在,awk执行它指定的actions

awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取)

awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。

把当前输入记录依次与每一个awk_cmdawk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd

当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤,这个过程一直持续,直到awk读取到文件尾。

 awk读完所有wKiom1leLYiCQbIxAAAY9NKjXz4463.png-wh_50的输入行后,如果存在END,就执行相应的actions

1) /etc/passwd文件 显示文件中用户名和登录shelwKiom1leK0Oh9eGAAAAvfdg4lY4407.png-wh_50

显示文件中用户名和登录shell,中间以逗号分隔

wKioL1leLfXwfi7YAAATjCLusN8201.png-wh_50

显示文件中UID大于500的所有用户的用户名和登录shell

wKiom1leLgzi8UFDAAAY9NKjXz4888.png-wh_50


显示/etc/passwd文件中的UID大于500的用户名和登录shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"

wKiom1leLh-TdmWCAAAQZnuJNt4224.png-wh_50

函数及脚本的综合应用

 

1shell函数:shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数。

 函数由两部分组成:函数标题、函数体。标题是函数名。函数体是函数内的命令集合。标题名应该唯一;如果不是,将会混淆结果,因为脚本在查看调用脚本前将首先搜索函数调用相应的shell

wKioL1leLj6xARAIAABQfH1kTfQ031.png-wh_50



wKioL1leLp_gRtLiAAAUtyIk7-A138.png-wh_50