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