linux shell和Expect逝去的事情简介

1.1  shell一些小总结

    1, 零宽断言
    2, 打印菜单 
    3, getopts选项简介
    4, 脚本查询ip地理位置

1.1.1  grep  Zero-Width Assertions (零宽断言)

意思就是取出得到你想要的东西,去掉你不关心的东西

    -o: 表示精确匹配
    -P: 表示使用pcre的正则表达式进行匹配

    1.先行断言: 表示匹配表达式前面的位置

[[email protected] ~]# echo "cooking sing" | grep -oP ‘[a-z]*(?=ing)‘   
cook
s

上面例子:  (?=ing) 这个就是断言,意思当这个断言存在的时候,进行判断匹配,匹配到的

对象是它前面的字符串.当然前面的字符串你也需要用正则表达式匹配,例如:([a-z])*,由于

正则是贪婪的,所以断言会一直从右面匹配到不能匹配的时候结束.

    2.后发断言: 表示匹配表达式后面的位置

[[email protected] ~]# echo "abcdefg  abca" | grep -oP ‘(?<=abc).*‘    
defg  abca

上面的例子: (?<=abc)为断言,跟上面的相反,它是从最左端开始匹配

小小实战

(1)取ip地址

[[email protected] learn]# ifconfig 
eth0      Link encap:Ethernet  HWaddr 06:66:91:E7:9A:74  
          inet addr:10.10.11.15  Bcast:10.10.11.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1234086 errors:0 dropped:0 overruns:0 frame:0
          TX packets:829131 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1182619038 (1.1 GiB)  TX bytes:88948632 (84.8 MiB)
          Interrupt:246 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:62861848 errors:0 dropped:0 overruns:0 frame:0
          TX packets:62861848 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:10133085846 (9.4 GiB)  TX bytes:10133085846 (9.4 GiB)

取出em1的ip地址

[[email protected] ~]# ifconfig | grep -E ‘(eth0|em1)‘ -A 1|grep -oP ‘(?<=addr:)[\d.]+‘
10.10.10.180

(2)取日志的时间

假如nginx备份日志的格式文件是access_20150408_nginx.log

[[email protected] ~]# echo "access_20150408_nginx.log" | grep -oP ‘(?<=access_).*(?=_nginx)‘
20150408

1.1.2 打印菜单

echo命令

 -n: 不自动换行
  -e: 打开反斜杠ESC转义。若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出
            \a 发出警告声;
           \b 删除前一个字符;
           \c 最后不加上换行符号;
           \f 换行但光标仍旧停留在原来的位置;
           \n 换行且光标移至行首;
           \r 光标移至行首,但不换行;
           \t 插入tab;
           \v 与\f相同;
           \\ 插入\字符;
           \nnn 插入nnn(八进制)所代表的ASCII字符

read命令

     -p: 交互式显示提示符信息
    -t: 超时时间
    -n: 设定字符个数
    -s: 不会显(输入密码的时候有用)               
     -d: 定界符

实现一个简单菜单

#!/bin/bash
MYDATE=`date +%d/%m/%Y`
THIS_HOST=`hostname`
USER=`whoami`
while true;do  
#clear
cat <<EOF
        ____________________________________________________
                User: $USER Host: $THIS_HOST DATE: $MYDATE 
        ____________________________________________________
                1: list files 
                2: See memory total 
                3: See who is on the systeme 
                4: Help screen 
                Q: Exit Menu 
        ____________________________________________________
EOF
echo -e  -n "\t You Choice[1,2,3,4,Q]> "
read CHOICE
echo $CHOICE
case $CHOICE  in 
1) ls ;; 
2) free -m ;;  
3) who ;; 
4) echo "This is help screen , nothing here yet to help you !" ;;
Q|q) exit 0 ;;
*) 
echo -e "\t \007 unknown user reponse" 
;;
esac 
#echo -e -n "\t Hit the return key to continue " 
read -p "  Hit the return key to continue " go
done

1.1.3 getopts简介

根据参数进行不同的提示或者不同的执行

先来看一个列子

#!/bin/bash 
while getopts "h:n:a" arg
do
        case $arg in 
                h)
                        echo "Welcome to Beijing arg:$OPTARG";;
                n) 
                        echo "Your name is $OPTARG";;
                a)
                        echo "Your age is $OPTARG" ;;
                :) 
                        echo "The -h arg must have one args";;
                ?) 
                        echo "Please input your select args" ;;
        esac 
done

执行结果

[[email protected] learn]# sh get.sh -h "hello world" -n budongshu -a 18 
Welcome to Beijing arg:hello world
Your name is budongshu
Your age is

getopts的脚本使用方法

脚本.sh  option_string  variable

第一个参数使用-h 这样的选项 第二参数是-h 后面跟的hello world 字符串

解析上面的示例 

定义选项:

可以看到while getopts "h:n:a" arg 这句,所以定义的选项"h:n:a"在这里定义.

冒号含义

1,字母后面跟上冒号代表这个选项必须有参数也就是-h和-n 后面必须提供一个参数,

参数的值存储在变量$OPTARG

2,字母后面没有冒号代表这个选项可以不用跟上参数 ,跟上也不进行赋值. 可以看到-a 没有值

3, 在字母的最前面加上冒号代表忽略这个命令自己提供的错误信息提示. 下面演示一下

脚本

#!/bin/bash 
while getopts "h:n:a" arg
do
        case $arg in 
                h)
                        echo "Welcome to Beijing arg:$OPTARG";;
                n) 
                        echo "Your name is $OPTARG";;
                a)
                        echo "Your age is $OPTARG" ;;
     
                ?) 
                        echo "Please input your select args" ;;
        esac 
done

执行结果: 命令内部自己提供的报错中间那个

[[email protected] learn]# sh get.sh -h hello -n  
Welcome to Beijing arg:hello
get.sh: option requires an argument -- n
Please input your select args

加上冒号以后再看

脚本

#!/bin/bash 
while getopts ":h:n:a" arg
do
        case $arg in 
                h)
                        echo "Welcome to Beijing arg:$OPTARG";;
                n) 
                        echo "Your name is $OPTARG";;
                a)
                        echo "Your age is $OPTARG" ;;
     
                ?) 
                        echo "Please input your select args" ;;
        esac 
done

执行结果: 可以看到少了一条报错.

[[email protected] learn]# sh get.sh -h hello -n  
Welcome to Beijing arg:hello
Please input your select args

报错信息提示

脚本

#!/bin/bash 
while getopts ":h:n:a" arg
do
        case $arg in
                h)
                        echo "Welcome to Beijing arg:$OPTARG";;
                n)
                        echo "Your name is $OPTARG";;
                a)
                        echo "Your age is $OPTARG" ;;
                :) 
                        echo "The -h arg must have one args";;
                ?)
                        echo "Please input your select args" ;;
        esac
done

:  case中冒号,当你忽略系统命令报错的时候(就是在前面加上:号),还有参数-h后面有冒号的,代表必须跟上一个选项参数, 如果没有跟选项参数时候, 它会提示对应你自定义的错误信息,-a不是必须提供参数选项(因为字母后面没有加冒号),所以执行脚本的时候 -a 后面不跟参数(或者不跟-a 选项时候),也不会报错的

?  case中问号,当跟上的参数比如说-e 不存在的时候报错

以上所有的报错$OPTARG变量都是不可用的

1.1.4 脚本查询ip地理位置


脚本

#!/bin/bash
Getip=$(curl -s ip.cn?ip=$1)
IParea=$(echo $Getip|awk -F ":" ‘{print $3}‘|awk ‘{print $1}‘)
IPisp=$(echo $Getip|awk -F ":" ‘{print $3}‘|awk ‘{print $2}‘)
if [ ! $1 ];then
IP=$(echo $Getip|awk -F ":" ‘{print $2}‘|awk ‘{print $1}‘)
echo $IP $IParea $IPisp
else
echo $1 $IParea $IPisp
fi

执行结果

[[email protected] script]# ./getip.sh (当前的外网ip地址)   
117......... 北京市 ....
[[email protected] script]# ./getip.sh 8.8.8.8
8.8.8.8 美国 Google
[[email protected] script]# ./getip.sh 114.114.114.114
114.114.114.114 江苏省南京市 信风网络

2.0 Expect 简介

安装

yum install expect -y


脚本

#!/usr/bin/expect -f 
set ip [lindex $argv 0]   
set password "111111"
spawn ssh [email protected]$ip
set timeout 20 
expect  { 
        "yes/no" { send "yes\r";exp_continue } 
        "password:" { send "$password\r" }
}
expect "]#"
send "free -m\r" 
interact
#expect eof 
#exit

执行结果

[[email protected] learn]# hostname 
bj-idc-15
[[email protected] learn]# ./test1.exp 10.10.10.14 
spawn ssh [email protected]
[email protected]‘s password: 
Last login: Mon Apr 11 16:24:49 2016 from 10.10.11.15
[[email protected] ~]# free -m
             total       used       free     shared    buffers     cached
Mem:          7870       2782       5088          0        341       2219
-/+ buffers/cache:        220       7650
Swap:         3999         57       3942
[[email protected] ~]# hostname 
BS01
时间: 2024-08-09 19:49:56

linux shell和Expect逝去的事情简介的相关文章

Linux Shell 简介

什么是linux Shell Shell 是一个用户程序,或是一个为用户与系统交互提供的环境. 它是一个执行从标准输入设备读入的命令的语言解释程序,它拥有自己内建的Shell命令集,Shell也能被系统中其他应用程序所调用. 当你登录或打开控制台时Shell就会运行. Shell不是系统内核的一部分,但是它使用系统内核执行程序.创建文件等. 2.访问Shell的方式 终端.安全ssh连接.使用控制台. 3.在Shell下,你可以使用如下按键组合来编辑和回调命令. ctrl+W:删除光标位置前的单

Linux Shell之一 Shell简介

玩Linux不知道Shell,那就是不懂Linux.这句话足以见证shell在Linux运维中的地位.一直想好好写下shell,但总是不知道如何写起,不是因为Shell太难,而是因为她太庞大,也可能是因为自己shell能力上的不足,怕不能体系化地了解Shell,但是要开始的终究还是要开始,Come On!什么是Shell     Shell是操作系统的最外层,Shell可以合并编程语言以控制进程和文件,以及启动和控制其它程序.shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

Linux shell 的一个fork炸弹

.(){ .|.& };.  或者  :(){ :|:& };: 这13个字符由Jaromil ,在 2002 年设计了最为精简的一个 fork炸弹的实现. .()  说明下面要定义一个函数,函数名为小数点,没有可选参数:{    表示函数体的开始:.|.& 表示函数体真正要做的事情,首先它递归使用本函数,然后李永贵管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行.}    表示函数体的结束:;    并不会执行什么操作,在命令行中用来分隔两个命令用.从总体

linux shell中的比较符号与特殊符号介绍

shell字符串比较.判断是否为数字  二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.  整数比较  -eq 等于,如:if [ "$a" -eq "$b" ]  -ne  不等于,如:if [ "$a" -ne "$b" ]  -gt 大于,如:if [ "$a" -gt "$b" ]  -ge 大于等于,如:if [  "$a" -ge "

linux shell数据重定向

linux shell下常用输入输出操作符是: 1.  标准输入   (stdin) :代码为 0 ,使用 < 或 << : /dev/stdin -> /proc/self/fd/0   0代表:/dev/stdin 2.  标准输出   (stdout):代码为 1 ,使用 > 或 >> : /dev/stdout -> /proc/self/fd/1  1代表:/dev/stdout3.  标准错误输出(stderr):代码为 2 ,使用 2>

LINUX SHELL脚本攻略笔记[速查]

Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述符和重定向 cat 数组和关联数组 alias date 调试脚本 函数和参数 管道 读取命令输出 read 字段分隔符和迭代器 循环 比较和测试 find xargs tr md5sum sha1sum 对目录进行校验 sort uniq tempfile split bash变量匹配切分 exp

Linux Shell学习之基础篇

在学习Linux和OpenStack过程中,感觉不管是大规模部署部署还是运维,Shell脚本都已经是标配,所以学好脚本很有必要. 以下仅为Linux Shell的一些基础笔记,这里作为笔记记下. ===============linux shell简介====================== 1.命令补全:连续按两次Tab   文件或者文件夹补全:一次Tab   命令帮助:--help 2.chmod u=rwx,g+w,o+r filename   chown root.root file

高级Linux SA需要会做的事情

高级Linux SA需要会做的事情:linux---------系统安装(光盘或自动化安装)linux---------系统常用工具安装(sudo,ntp,yum,rsync,lrzsz sysstat curl wget nmap tree iptraf screen,sysstat net-snmp)linux---------系统优化(内核优化,时间优化,字体优化,vim优化,硬盘优化,fail2ban防暴力工具,增加文件描述符限制优化,默认进程开启优化)linux---------sud