Day3-字符串-数组-正则表达式

字符串截取

1、${变量名:N:M}

N    起始值——从0开始——0为第1个字母

M    结束值

[root@localhost ~]# echo $name

thisistest

[root@localhost ~]# echo ${name:0:4}

this

[root@localhost ~]# echo ${name:6:10}

test

 

2、expr ——可以做比较、运算、字符串

Expr substr    "$变量名"    N     M

注:该起始值从1    开始,不是0

测试字符串长度

Expr length    "$变量名"

[root@localhost ~]# echo $name

thisistest

[root@localhost ~]# expr substr "$name" 1 4

this

[root@localhost ~]# expr substr "$name" 5 2

is

 

3、cut

格式:命令    |    cut    -b    N-M

注:该起始值从1    开始,不是0

[root@localhost ~]# echo $name

thisistest

[root@localhost ~]# echo $name |cut -b 1-4

this

[root@localhost ~]# echo $name |cut -b 7-

test

[root@localhost ~]# echo $name |cut -b 5-6

is

 

简单使用awk——-F为列——:为冒号分格——$1为第1列

[root@localhost ~]# head -4 /etc/passwd|awk -F ":" '{print $1}'

root

bin

daemon

adm

 

 

[root@localhost ~]# ifconfig |head -2|tail -1|awk '{print $2}'|awk -F ":" '{print $2}'

192.168.100.100

 

[root@localhost ~]# df -h|head -2|tail -1|awk -F " " '{print $4}'

14G

 

 

${变量名    符号    表达式}

返回结果:删除与表达式匹配的数据后,剩下的数据是返回值

 

表达式的表示方式——普通字符——通配符        *

符号

从左向右匹配删除

#    最短匹配删除

##    最长匹配删除

 

[root@localhost ~]# echo ${MAIL#*/}

var/spool/mail/root

[root@localhost ~]# echo ${MAIL##*/}

root

 

从右向左匹配删除

%    最短匹配删除

%%    最长匹配删除

 

[root@localhost ~]# echo ${MAIL%/*}

/var/spool/mail

[root@localhost ~]# echo ${MAIL%%/*}

 

[root@localhost ~]# echo ${MAIL%%root}

/var/spool/mail/

————————————————————————————————————————————————————————

例——对当前目录下的文件修改

 1 #!/bin/bash
 2 
 3 i=1
 4 
 5 for file in `ls *.txt`
 6 
 7 do
 8 
 9 # echo $file
10 
11 # a=`echo ${file%.txt}`
12 
13 # b=`echo "$a-$i".txt`
14 
15 # mv $file $b
16 
17 mv $file `echo ${file%.txt}-$i.txt`
18 
19 let i++
20 
21 done
22 
23 echo "this is mv file ok..."

 

 

例——对httpd根目录下的新产生的*.html备份

 1 #!/bin/bash
 2 a=/bk
 3 cd /bk &> /dev/null || mkdir /bk &> /dev/null
 4 cd /var/www/html
 5 for file in `ls *.html`
 6 do
 7         if [ ! -e $a/$file ];then
 8          cp $file $a
 9         fi
10 done
11 echo "This is Bk Ok"

 

${变量名  符号  "值"}

echo  ${变量名  符号  "自定义字串"}——输出命令返回值

变量A=${变量名B  符号  "值"}——把命令的返回值赋值给变量

 

符号

:+  作检查变量是否定义——若变量没有定义,返回为空值。反之则返回自定义字串

    ——变量B有值时,被“值”所取代——若没有定义变量B,则返回为空

    检测变量是否为空——[ -z $a ] && echo "null"

 

:-  给变量赋初值——变量没定义时,返回自定义字串,反之返回变量的值

 

:=  作用给变量赋初值——若变量没定义时,返回自定义字串,同时把自定义字串赋值给没值的变量

 

:?  作用捕获因变量没定义所导致的错误——在脚本里使用时,返回错误信息并终止脚本的执行,若自定义字串没定义,返回系统默认设置信息。若变量有值则返回变量的值

 

shell数组

数组——存放一组数据,一个变量存储多个值,并且每个值都可以独立使用

数组类型——1维数组  2维数组  多维数组

[root@localhost shell]# declare --help
-bash: declare: --: invalid option
declare: usage: declare [-aAfFilrtux] [-p] [name[=value] ...]

定义  [root@localhost shell]# declare -a shuzu

赋值  [root@localhost shell]# shuzu=(a b c d)

使用数组元素 ${数组名[下标]} 

查看  

[root@localhost shell]# declare |grep shuzu
shuzu=([0]="a" [1]="b" [2]="c" [3]="d")

[root@localhost shell]# echo ${shuzu[2]}
c

 

输出数组所有元素 

[root@localhost shell]# echo ${shuzu[@]}
a b c d
[root@localhost shell]# echo ${shuzu[*]}
a b c d

#echo ${shuzu[@]:N}——N从数组的那一个下标开始显示元素值 默认下标值为0

下标为2开始显示

[root@localhost shell]# echo ${shuzu[@]:2}
c d

下标为1到2

[root@localhost shell]# echo ${shuzu[@]:1:2}
b c

 

获取数组元素个数  ${#数组名[@]}

获取某个数组元素值的长度  ${#数组名[数组下标]}

 

输出某个数组元素值的部分数据

echo ${sergrp[下标]:N:M}

    N——元素值的编号  第一个字符编号是0

    M——显示字符的个数

向已有数组里添加新元素

数组名[下标]=值

  下标没有被已有元素使用,就是向数组添加新元素

  若下标已经被已有元素使用,说法是修改已有下标元素的值

 

删除数组元素下标的值——数组名[下标]=

删除数组元素下标——unset 数组名[下标]

删除数组元素所有数据——数组名=()

删除定义的数组名——unset 数组名

 

例——用户输入多个ip保存到变量ipgroup里,并根据输入ip地址的个数,输出用户所输入的所有ip地址

 1 #!/bin/bash
 2 read -p "this is ? ip:  " a
 3 a=${a:-1}
 4 b=1
 5 for ((i=1;i<=$a;i++))
 6 do
 7         read -p "$b ip:  " ipgroup[$i]
 8         let b++
 9 done
10 for ((i=1;i<=`echo ${#ipgroup[@]}`;i++))
11 do
12         echo ${ipgroup[$i]}
13 done

 

 

正则表达式—— Regular  Express

使用  符号  描述  数据的特征

    符号——1个或多个——元字符

 

命令格式

grep  [选项]  ‘正则表达式’

命令  |  grep  [选项]  ‘正则表达式’

grep  ‘root’  /etc/passwd  /etc/shadow

ps  aux  |  grep  httpd

处理数据的方式

以行为处理单位,一次处理一行,逐行处理

默认输出与正则表达式匹配的行

 

选项

--color  匹配条件加上颜色显示

-n  匹配行号

-c  匹配行数

-q  去掉匹配输出

-v  取反

-i  忽略字母大小写——默认是有大小写

 

元字符

匹配开头  ^  行首

匹配结尾  $  行尾

任意单个字符  .  不包括换行符  \n——如何需要找  .  字符需要转义  \.

  普通符号要转义

  ^$为空 行

*  匹配前边正则表达式出现的次数——0次到多次

 

\(正则表达式\)  把正则表达式作为整体匹配

grep --color ‘g\(oo\)*d’  a.txt  goo——d

 

\|  或者

 

[]  范围内匹配——匹配范围内的任意一个

[a-z]  匹配所有小写字母

[A-Z]  匹配所有大写字母

[a-zA-Z]  [a-Z]  匹配所有大小写字母

[0-9]  匹配所有数字

[a-zA-Z0-9]  匹配所有数字和大小写字母

[^0-9a-Z]  范围取反

  ^[  ]以范围内开头

  ^[^  ]范围内取反的开头

 

\{  \}现在前边的表达式出现的次数

\{N\}前边的正则表达式必须出现N次

  \{g\(oo\){2}d\}   以g开头oo出现两次的d——g  oo  oo  d

\{N,\}前边的正则表达式至少出现N次

\{N,M\}前边的正则表达式至少出现N次,最好多出现M次——次数>=N并且<=M

\?  匹配前边的正则表达式出现0次到1次

\+  匹配前边的正则表达式出现1次到多次

 

\<  匹配单词开头

\>  匹配单词结尾

 

正确的MAC地址显示出来

六列,每列由任意2个十六进制数组成

[root@localhost shell]# ifconfig eth0|grep --color -E '([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}'

使用expect

 

posted @ 2016-08-28 22:27  Final233  阅读(470)  评论(0编辑  收藏  举报