字符串的切割,expect交互,正则表达式【shell第三天】

字符串的处理

子串截取

1.${变量名:起始位置(从0开始):长度}

[root@server0 ~]# phone=18676749523
[root@server0 ~]# echo $phone
18676749523
[root@server0 ~]# echo ${phone:0:5}
18676
[root@server0 ~]# echo ${phone:2:5}
67674
查看位数
[root@server0 ~]# echo ${#phone}
11


2.expr substr $变量名  起始位置  长度

[root@server0 ~]# expr substr $phone 1 5
18676
[root@server0 ~]# expr substr $phone 3 2
67


3.echo $变量名 | cut -b 起始位置-结束位置

杠号为2到4

[root@server0 ~]# echo $phone | cut -b 2-4
867

 逗号为取该位置

[root@server0 ~]# echo $phone | cut -b 2,5,8
869

字符串的截取的实例:
[利用随机数取其中一位数【脚本】]

例:
#!/bin/bash
i='abcdefghijklmnopqrstuvwxyz1234567890zxcvbnmasdfghjkl'
n=$[RANDOM%53+1]
echo $i | cut -b $n

n=$[RANDOM%53] 因从0开始,故不加1
echo ${i:$n:1}


在变量i的后面继续取值

例:
[root@server0 /]# i=1
[root@server0 /]# p=$p$i
[root@server0 /]# echo $p
1
[root@server0 /]# i=0
[root@server0 /]# p=$p$i
[root@server0 /]# echo $p
10


      替换
echo ${变量名/需替换的数字n/*} 替换第一个数字n为*
echo ${变量名//需替换的数字n/*} 替换所有的n为*

例:
[root@server0 /]# echo $phone
18676749525
[root@server0 /]# echo ${phone/8/}
1
676749525
[root@server0 /]# echo ${phone/5/}
18676749
25
[root@server0 /]# echo ${phone//5/}
18676749
2
[root@server0 /]# echo ${phone//495/
}
186767*25
[root@server0 /]# echo ${phone//495/}
186767
25


       匹配删除
 1.
echo ${变量名#*:}从开头一直删除到第一个:
echo ${变量名##*:}从开头删除到最后的:

例:
[root@server0 /]# n=head -1 /etc/passwd
[root@server0 /]# echo $n
root:x:0:0:root:/root:/bin/bash
[root@server0 /]# echo ${n#:}
x:0:0:root:/root:/bin/bash
[root@server0 /]# echo ${n##
:}
/bin/bash

  2.
echo ${变量名%:*}从后开始删除到:
echo ${变量名%%:*}从后开始删除所有到:

例:
[root@server0 /]# echo ${n%:}
root:x:0:0:root:/root
[root@server0 /]# echo ${n%%:
}
root


利用匹配删除批量修改文件名:

#!/bin/bash
for i in ls *.jpg 【查看以jpg结尾的文件】
do
mv $i ./${i%.*}.doc 【更改为以doc结尾】
done


    判断变量并赋值   

echo ${变量1:-变量2} 若存在变量1则显示,若无则显示变量2

例:
[root@server0 /]# echo ${who:-dc}
dc
[root@server0 /]# who=000
[root@server0 /]# echo ${who:-dc}
000

    利用判断是否输入,无输入则执行100

#!/bin/bash
num=0
read -p "shu ru :" o
o=${o:-100}
for i in seq $o
do
let num+=i
done
echo $num


                        EXPECT自动交互 

模拟人物操作

发邮件(非交互)

mail -s 标题 root << EOF(结束)
hehe
hehe
EOF

利用expect自动交互远程创建目录

#!/bin/bash
expect << EOF
spawn ssh 192.168.4.10
expect "password" {send "123456\n"}
expect "#" {send "mkdir /xxx.x\n"}
expect "#" {send "exit\n"}
EOF

步骤
1)安装expect软件
2)编写配置文件

#!/bin/bash
expect << EOF
1>spawn ssh 192.168.4.10 【命令行】
2>expect "password" {send "123456\n"} 【命令行】
3>expect "#" {send "mkdir /xxx.x\n"} 【命令行】
4>expect "#" {send "exit\n"} 【最后一行不执行】
EOF

1>远程到ip192.168.4.10的机器上
2>当看到"passsword"的字样时,输入123456
3>当看到"#"时,创建目录
4>不执行,防止设置最后的命令不执行

无法运行原因:
1.有没有安装expect
2.指定一个需要交互的程序
3.有没有提示其他信息(未写在配置文件的判断上)
4.expect最后一条命令不执行

ssh 远程无需确认
ssh -o StrictHostKeyChecking=no


                                               正则表达式

^ 开始
$ 结尾
[] 集合,取集合中的任意一个字符 :grep [a-z] a.txt 取a到z任意字母
[^] 对集合取反 :[^abc]除了abc的其他
. 任意单个字符

  • 前一个字符出现了任意次 【不允许单独使用】
    . 任意所有==(
    {n,m} 前一个字符出现了n次到m次
    {n,} 前一个字符出现了n次及以上
    {n} 前一个字符出现了n次

                           扩展正则表达式
    • 最少匹配一次
      ? 最多匹配一次
      {n,m} 匹配n到m次
      () 组合为整体,保留
      | 或者
      \b 单词边界

      查找包含init单词的行
      egrep '\binit\b' /etc/rc.local

猜你喜欢

转载自blog.51cto.com/13713381/2109160