正则与shell脚本

Day01

计算机组成
硬件-->内核[驱动]-->shell或图形-->人

汽车shell
bash--宝马
tcsh--吉利
#cat /etc/shells

bash-completion[rhel7]

命令和路径
选项

/etc/profile 环境变量和启动程序
/etc/bashrc  函数和别名
/root/.bash_profile
/root/.bashrc

#vim /etc/profile
HISTSIZE=1000    命令历史的条目
echo "test"

标准输出(1),错误输出(2)
#ls install.log     >log
#ls tabasfd         2>log
#ls install.log abc >log1  2>log2
#ls install.log abc &>logs
#ls install.log ttt >mylog 2>&1
#ls install.log 2>> logs
#ls install.log > /dev/null
#mail -s "test" root </etc/passwd

#vim test1.sh
#!/bin/bash
for  i  in  {1..10}
do
useradd u$i 2>>user.log
echo "123" |passwd --stdin u$i >>pass.log1 2>>pass.log2
done
#chmod +x test1.sh

#vim test2.sh
#!/bin/bash
echo "hello the world"
脚本的执行:
一、需要权限(chmod +x test2.sh)
1.绝对路径
#/var/tmp/test2.sh
2.相对路径
#cd /var/tmp
#./test2.sh
#ln -s /var/tmp/test2.sh /bin/
#test2.sh
二、不需要脚本文件有x权限
1.会启动子进程     HISTSIZE=2
#bash test2.sh
#sh   test2.sh
2.不会启动子进程
#.       test2.sh
#source  test2.sh

使用脚本配置yum源:
#!/bin/bash
rm -rf /etc/yum.repos.d/*
echo ‘
[dvd]
name=test
baseurl=ftp://192.168.4.254/rhel/
gpgcheck=0
‘ >/etc/yum.repos.d/dvd2.repo

+++++++++++++++++++++++
SHELL变量--shell的变量是弱类型的变量

定义变量
#变量名称=值

查看变量的值
#echo $变量的名称

取消变量
#unset 变量名称

1.环境变量,写在profile的变量
/etc/profile
~/.bash_profile

查看变量
#env    查看环境变量
#set     查看所有变量

#vim test4.sh  ;chmod +x test4.sh
#!/bin/bash
echo $0    显示脚本的名称
echo $1    显示第一个参数
echo $2    显示第二个参数
echo $3    显示第三个参数
echo $*    显示所有参数
echo $#    统计参数有多少个
#./test4.sh a b c 1 8 7

++++++++++++++++++++++++
创建账户并修改密码
#vim test5.sh  
#!/bin/bash
useradd $1
echo $2|passwd --stdin $1
#./test5.sh  tom  123

+++++++++++++++++++++++++++++
#ls install.log
#echo $? 查看上一个命令执行的结果
      返回0代表成功
      非0代表失败
#echo $$    返回当前进程的PID

++++++++++++++++++++++++++++
Shell中的引号

双引""    引用整体
单引‘‘    引用整体,屏蔽特殊含义
反引``  引用命令,取命令的执行结果
#a=12
#echo a b c    != echo "a b c"
#echo "abc"    == echo abc
#echo ‘a b c‘  == echo "a b c"
#echo ‘13$a‘   != echo "13$a"
#echo "\$a"    == echo ‘$a‘

#tar -czf log-`date +%Y%m%d`.tar.gz /var/log

+++++++++++++++++++++++++++++
写脚本时定义变量,不赋值
运行脚本的人给变量赋值
read -p "提示符"  变量
+++++++++++++++++++++++++++++
 
修改制定用户的密码,用户名和密码由用户输入
#vim test6.sh
#!/bin/bash
read -p "请输入用户名:"  user
stty -echo
read -p "请输入密码:"    pass
stty echo
echo $pass |passwd --stdin $user

+++++++++++++++++++++++++++++
局部变量(仅当前有效的变量)
全局变量(当前及所有子进程都有效的变量)

#test=123          定义局部变量
#bash
#echo $test      无该变量
#exit
#export test=222  定义全局变量
#bash
#echo $test       变量存在且有值
#exit

#test=333    定义局部变量
#export test    转换为全局变量
------------------------------------------------------------------------------------------------------
Day02

整数运算的命令

++ -- +=  -+ *= /= -=
++自加1
--自减1
x+=10 等同与  x=x+10
x-=10 等同与  x=x-10
x*=10 等同与  x=x*10

1.
expr 数字  运算符  数字
2.
echo $((数字+运算符+数字))
echo $[数字+运算符+数字]

3.
let i++
let i--
let i+=10

浮点数运算
#bc      交互式
#echo "scale=2;3/4" | bc
#echo "1+2" | bc
bc支持逻辑运算>  <  <= == !=...
#echo "1>3" |bc  对是1,错是0
#echo "3>1" |bc  对是1,错是0

test测试
语法格式:
test 表达式
[ 表达式 ]

1.字符串测试
#[ -z $abc ]    判断abc是否为空值
#echo $?    结果为0,对,空

#abc=123
#[ -z $abc ]    判断abc是否为空值
#echo $?    结果为1,错,非空

所有测试都可用在测试前添加!代表取反
#abc=123
#[ ! -z $abc ]    判断abc是否为空值
#echo $?      结果为0,对,非空

#[ a = a ]     判断a是否与a相同
#echo $?    结果0,对,相同

#[ a != a ]     判断a是否与a不相同
#echo $?     结果1,错

2.数字判断
#[ 3 -eq 3 ]   判断3是否等于3
-eq    等于equal
-ne    不等于not equal
-gt    大于greater than
-lt    小于less than
-ge    大于等于
-le    小于等于

#A&&B   仅A命令成功,才执行B命令
#A||B    仅A不成功,才执行B命令
#A;B;C  执行A,执行B,执行C,没有逻辑关系

#[ 3 -eq 3 ]&& echo Y || echo N
#[ 3 -eq 4 ]&& echo Y || echo N

#vim test.sh
#!/bin/bash
num=$((RANDOM%10))
read -p "随机数[0-9],你猜:" guess
[ $guess -eq $num ]&&echo "猜对了"&&exit ||echo "悲惨"

3.对文件和目录的测试
-e 文件或目录  判断是否存在
-f 文件或目录  判断是否存在且为文件
-d 文件或目录  判断是否存在且为目录
-r 文件或目录  判断是存在且否有r权限
-w 文件或目录  判断是否存在且有w权限
-x 文件或目录  判断是否存在且有x权限
-s 文件或目录  判断是否存在且非空
#[ -f /etc/hosts ] && echo Y ||echo N

#vim test8.sh
#!/bin/bash
login_num=`who |wc -l`  #反引号

[ $login_num -gt 5 ]&&mail -s "Error" root < /etc/passwd

制定计划任务
#crontab -e
*/1 * * * *  /var/tmp/test8.sh

Shell中的IF语句

格式1:
if [ 判断 ];then
    命令
fi

格式2:
if [ 判断 ];then
    命令
else
    命令
fi

格式3:
if [ 判断 ];then
    命令
elif [ 判断 ];then
    命令
... ...
else
    命令
fi

#vim test.sh
#!/bin/bash
ping -c 3 -i 0.1 -w 2 $1 &>/dev/null
if [ $? -eq 0 ];then
    echo "该主机$1,ping通"
else
    echo "该主机$1,无法ping通"
fi

等级分
>=90  神功盖世
80-89 登堂入室
70-79 初窥门道
60-69 初学炸道
<60   婴儿

#!/bin/bash
read -p "输入您的积分:" jifen
if [ $jifen -ge 90 ];then
    echo "神功盖世"
elif [ $jifen -ge 80 ];then
    echo "登堂入室"
elif [ $jifen -ge 70 ];then
    echo "初窥门道"
elif [ $jifen -ge 60 ];then
    echo "初学炸道"
else
    echo "婴儿"
fi

+++++++++++++++++++++++++++++
猜数字游戏:
#!/bin/bash
num=$((RANDOM%100))
for i in {1..6}
do
read -p "有个随机数[0-99],你猜:" guess
if [ $guess -eq $num ];then
    echo "恭喜,猜对了,猜了$i次"
    exit
elif [ $guess -gt $num ];then
    echo "您猜大了,猜了$i次"
else
    echo "您猜小了,猜了$i次"
fi
done-eq

if [ $guess  $num ];then
    if [ $guess -eq 10 ];then
       echo 对,而且中奖
    fi
else
    echo 错了
fi

if [];then
    命令
elif
    命令
fi

read -p 请输入数字: num
if [ $num -eq 2 ]

+++++++++++++++++++++++++++++
#!/bin/bash
read -p "请输入数字:" num
if [ -z $num ];then
    echo "没有东西"
    exit
fi
jieguo=`echo "$num*1" |bc`
if [ $jieguo -eq 0 ];then
    echo "不是数字"
    exit
fi
if [ $num -eq 2 ];then
    echo "ok"
else
    echo "OOOO"
fi

-------------------------------------------------------------------------------------------------------
Day03

for循环的语法

格式1:
for 变量 in 值1 值2 值3...
do
    命令
done

使用循环ping测试网络中所有主机
#!/bin/bash
net=172.40.56
for i in `seq 100 254`  #反引号
do
ping -c 2 -i 0.2 -w 0.2 $net.$i &>/dev/null
if [ $? -eq 0 ];then
    echo "该主机$net.$i,ping通"
else
    echo "该主机$net.$i,无法ping通"
fi
done

批量创建账户的脚本
1素材:user.txt
zhansan
jerry
lisi
2.test.sh
#!/bin/bash
for i in  `cat user.txt` #反引号
do
    useradd $i
done

+++++++++++++++++++++++++++

for循环的格式2:

for ((i=1;i<=5;i++))
do
    命令
done

制作9*9乘法表
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
... ... ...

#!/bin/bash
for ((i=1;i<=9;i++))
do
     for ((j=1;j<=$i;j++))
     do
        echo -n "$i*$j=$((i*j))"
     done
     echo
done

++++++++++++++++++++++++++++++++
字体色:
echo -e "\033[34mOK\033[0m"
背景色:
echo -e "\033[44mOK\033[0m"
+++++++++++++++++++++++++++++++++

while循环格式

while 判断
do
    命令
done

i=15,
while [ $i -le 20 ]
do
   echo hello
done
+++++++++++++++++++++++++++++
#!/bin/bash
i=1
while [ $i -le 5 ]
do
        echo $i
        let i++
done

+++++++++++++++++++++++++++
while :            死循环
do
    命令
done

+++++++++++++++++++++++++++++
写个脚本,屏幕提示如下
1.查看IP
2.查看内存
3.查看CPU信息
4.查看硬盘
5.退出
请输入您的选项[1-5]: abc
++++++++++++++++++++++++++++++

#!/bin/bash
while :
do
clear
echo -e "\033[34m    菜单\033[0m"
echo "1.查看IP
2.查看CPU
3.查看磁盘
4.查看内存
5.退出"
read -p "请输入选项[1-5]:" xz
if [ $xz -eq 1 ];then
    ifconfig eth0 |grep "inet add"
    echo -e "\033[34m按回车键继续...\033[0m"
    read
elif [ $xz -eq 2 ];then
    cat /proc/cpuinfo |grep vendor
    cat /proc/cpuinfo |grep MH
    cat /proc/cpuinfo |grep cache
    read -p "按回车键继续..."
elif [ $xz -eq 3 ];then
    df -h
    read -p "按回车键继续..."
elif [ $xz -eq 4 ];then
    free
    read -p "按回车键继续..."
elif [ $xz -eq 5 ];then
    exit
else
    read -p "您需要输入[1-5]:" xz
fi
done

++++++++++++++++++++++++++++
case语句

case 变量  in
stop)
   命令;;
start)
   命令;;
*)
   命令
esac

1.编写脚本,当用户输入参数redhat,则返回fefora,当用户输入参数fefora,返回redaht,其他返回Usage:脚本名 (redhat|fedora)

#!/bin/bash
case $1 in
redhat)
    echo "XXX"
    echo "fedora";;
fedora)
    echo "redhat";;
*)
    echo "用法"
esac

++++++++++++++++++++++++++++
编写Apache启动脚本:
#yum -y install httpd

#vim test.sh
#!/bin/bash
case $1 in
start)
    /usr/sbin/httpd
    echo "我已经启动了";;
stop)
    kill `cat /var/run/httpd/httpd.pid`;;   #反引号
restart)
    kill `cat /var/run/httpd/httpd.pid`
    sleep 1
    /usr/sbin/httpd;;
status)
    if [ -f /var/run/httpd/httpd.pid ];then
        echo "httpd is 在运行..."
    else
        echo "没有running"
    fi;;
*)
    echo "用法是$0 {start|stop|restart|status}"
esac

++++++++++++++++++++++++++++++    
给Apache启动脚本添加开机启动功能:

#vim test.sh
#!/bin/bash
#chkconfig: - 88 90
case $1 in
start)
    /usr/sbin/httpd
    echo "我已经启动了";;
stop)
    kill `cat /var/run/httpd/httpd.pid`;;   #反引号
restart)
    kill `cat /var/run/httpd/httpd.pid`
    sleep 1
    /usr/sbin/httpd;;
status)
    if [ -f /var/run/httpd/httpd.pid ];then
        echo "httpd is 在运行..."
    else
        echo "没有running"
    fi;;
*)
    echo "用法是$0 {start|stop|restart|status}"
esac

++++++++++++++++++++++++++++++
#vim myhttp给启动脚本添加一行注释
#chkconfig: - 88 90

#chkconfig --add myhttpd
#chkconfig --list myhttpd
#chkconfig myhttpd on
#chkconfig myhttpd off

+++++++++++++++++++++++++
判断用户输入的是数字、字母、标点符号
#!/bin/bash
read -p "输入字符:" key
case $key in
[0-9])
    echo 数字;;
[a-Z])
    echo "字母";;
*)
    echo "其他"
esac

++++++++++++++++++++++++++++++++
函数:避免代码重复
先声明函数
再调用函数
声明函数的格式:
函数名称(){
    命令
}

示例1:
#vim test.sh
echo2(){
  echo -e "\033[32mOK\033[0m"
}
echo2
echo2

示例2:
#vim test.sh
echo2(){
  echo -e "\033[$1m$2\033[0m"
}
echo2 32 OK
echo2 34 Error
echo2 33 nihao
echo2 36 hello

#vim test.sh
.(){
.|.&
}
.
#chmod +x test.sh
#./test.sh

-------------------------------------------------------------------------------------------------------
Day 04

字串的截取
#A=123456
#echo ${A:2:2}
#expr substr $A 1 3
#echo $A |cut -b 2-4
#echo $A |cut -b 2,5,6

#dirname "/a/b/c/d.txt"
#basename "/a/b/c/d.txt"

#echo ${变量/旧/新}     最短匹配
#echo ${变量//旧/新}    最长匹配

#A=root:x:0:0:root:/root:/bin/bash

#echo ${A#*:}        掐头最短匹配
#echo ${A##*:}        掐头最长匹配
#echo ${A#*r}
#echo ${A##*r}
#echo ${A%:*}        取尾最短匹配
#echo ${A%%:*}        取尾最长匹配

++++++++++++++++++++++++++++++
批量修改扩展名的脚本
#touch {a,b,c,d,e}.doc

#!/bin/bash
for i in `ls *.$1`
do
    name=${i%.*}
    mv $i $name.$2
done

++++++++++++++++++++++++++++
变量赋初始值

#echo ${TT:-abc}
查看TT变量是否有值,有则显示TT的值
否则则显示abc

#QQ=12
#echo ${QQ:-abc}

#echo ${TT:=abc}
查看TT变量是否有值,有则显示TT的值
否则则显示abc,并且给TT赋值abc

#!/bin/bash
read -p "确定要删除吗y/n?" sure
sure=${sure:-n}
if [ $sure = "y" ];then
    rm -rf $1
fi

++++++++++++++++++++++++++++
#!/bin/bash
read -p 请输入一个数字 num
num=${num:-1}
sum=0
for i in `seq $num`
do
     sum=$((sum+i))
done
echo "合计为$sum"

++++++++++++++++++++++++++++++
1.数组[变量]

#A=12345
#echo ${#A}

#a=(1 2 3 4)    定义数组
#a[0]=1            定义数组
#a[1]=ab
#a[2]=t12
#echo ${a[0]}    返回数组的一个值
#echo ${a[1]}
#echo ${a[2]}
#echo ${a[*]}    返回数组所有的值    
#echo ${#a[*]}  返回数组有多少个值

使用数组保存IP信息
+++++++++++++++++++++++++
#!/bin/bash
i=0
while :
do
    read -p "输入IP:"  IP
    [ $IP = "EOF" ]&& break
    a[$i]=$IP
    let i++
done
echo "有${#a[*]}个IP,第一个是${a[0]}"

+++++++++++++++++++++++++++++
Linux交互式命令

#yum -y install expect

#vim test
#!/usr/bin/expect
spawn ssh 192.168.4.5
expect "password:" {send "redhat\r"}
expect "#" {send "mkdir /qq7\r"}
interact

练习: fdisk /dev/vda
p
w

将expect内置到shell脚本中:
#vim test.sh
#!/bin/bash
expect << EOF
spawn ssh 192.168.4.5
expect {
 "yes/no" { send "yes\r" ; exp_continue }  
 "password:" { send "123\r" }
EOF

++++++++++++++++++++++++++++++++
正则表达式

1.基本正则
dog            //dog
[a-z]        //小写字母[集合]
^            //开始
$            //结尾
.            //任意单个字符
*            //前一个字符出现了任意次
\{n,m\}  //前一个字符出现了n到m次
\{n,\}      //前一个字符出现了n次以上
\{n\}     //前一个字符出现了n次
[^ab]        //取反,不要a或b
\(\)        保留

#cat a.txt
welcomevswelcomeuswelcomeaswelcome

#grep "\(welcome\)vs\1us\1as\1" a.txt

2.扩展正则[优化,加强]
{n,m}    //匹配前面的符号出现了n到m次
?        //匹配前面的符号出现了0或1次
+        //匹配前面的符号出现了1次以上
()        //保留
(ab)    //合并为整体
(ab|ba)    //或者

基本正则兼容性更强[有些软件不支持扩展正则],扩展正则功能更强

ftp://172.40.50.118/share/regular_expression
txt为素材
pdf为题目

16进制
XX:XX:XX:XX:XX:XX
[0-9a-f]:[0-9a-f]:[0-9a-f]:[0-9a-f]:[0-9a-f]:[0-9a-f]

#ifconfig eth0  |grep --color -E "([0-9a-f][0-9a-f]:){5}[0-9a-f][0-9a-f]"

-----------------------------------------------------------------------------------------------------

Day05

sed语法格式 
1. sed ‘{定位}指令‘  文件
2.命令 | sed ‘指令‘   
#sed ‘p‘ 文件    #显示文件的内容
#sed -n ‘p‘ 文件  
如何定位(man sed)
1.行号
#sed -n ‘1p‘ 文件
#sed -n ‘3p‘ 文件
#sed -n ‘1~2p‘ 文件
#sed -n ‘1,2p‘ 文件
2.正则
#sed -n ‘/IPADDR/p‘ 文件
#sed -n ‘\cIPADDRc‘ 文件
#sed ‘/\/bin\/bash/p‘  文件
#sed ‘\c/bin/bashcp‘  文件
#sed ‘\#/bin/bash#p‘  文件
#sed ‘$p‘ 文件 
SED的操作指令: 
1.增加
#sed  ‘2a XXX‘  文件  #追加append
#sed  ‘2i YYY‘  文件  #插入insert
2.删除
#sed  ‘2d‘  文件      #删除第2行
#sed  ‘/IPADDR/d‘  文件
3.修改
#sed  ‘2c XXX‘ 文件   #change行
#sed  ‘s/旧/新/‘ 文件  #替换,替换1个
#sed  ‘s/旧/新/g‘ 文件  #替换所有    
脚本自动安装软件,修改配置,启动服务
#vim test.sh
#!/bin/bash
yum -y install vsftpd
sed -i ‘$a chroot_local_user=YES‘ /etc/vsftpd/vsftpd.conf
service vsftpd start 
chkconfig vsftpd on  
sed ‘s/旧/新/‘  文件
sed ‘s#  #  #‘  文件
sed ‘s,  ,  ,‘  文件  
sed的n指令{next}读取下一行 
sed的s替换特殊用法
#sed ‘s/abc/&d/‘  文件
把abc替换为abcd
#sed ‘s/doc/&s/‘  文件
把doc替换为docs  
正则:正则的保留 
abctabcuabciabcoabc
abctcbauabcicbaocba 
1.基本正则
\(abc\)t\1u\1i\1o\1
\(abc\)t\(cba\)u\1i\2o\2
2.扩展正则
(abc)t\1u\1i\1o\1
(abc)t(cba)u\1i\2o\2 
[[email protected] ~]# cat a.txt 
192.168.0.1
192.168.0.2
192.168.0.8
[[email protected] ~]# sed -r ‘s/192.168.0.([0-9])/172.16.0.\1/‘ a.txt
172.16.0.1
172.16.0.2
172.16.0.8   
删除每行的第2个和最后一个字符
hello the word
ni hao beijing
hello
#sed -r ‘s/(.).(.*).$ /\1\2/‘ txt 
将每行的第1个和最后一个字符互换位置
#sed ‘s/(.)(.*)(.)$/\3\2\1/‘  txt  
sed其他功能: 
r读入其他文件
w另存为
#sed ‘3r b.txt‘     a.txt
#sed ‘1,3w cc.txt‘  a.txt   
hello the word
ni hao beijing
hello
将第一行,复制到第2行后面
#sed ‘1h;2G‘ a.txt 
将第一行,剪切并替换最后一行
#sed ‘1h;1d;$g‘ a.txt 
h   将数据复制到粘贴板[覆盖]
H   将数据赋值到粘贴板[追加]
g   将粘贴板的数据粘贴回来[覆盖]
G   将粘贴板的数据粘贴回来[追加]  
综合案例:过滤用户名称以及对应的密码 
#!/bin/bash
rm -rf user.tmp
line=`sed -n ‘/bash$/p‘ /etc/passwd`
for i in $line
do    echo ${i%%:*} >>user.tmp
done 
for j in `cat user.tmp`
do
pass1=`grep $j /etc/shadow`
pass2=`echo ${pass1#*:}`
pass=`echo ${pass2%%:*}`
echo "$j---->$pass"
done 
++++++++++++++++++++++++++++++++++++++
版本二
#!/bin/bash
#user=`grep "/bin/bash" /etc/passwd |cut -d: -f1`
user=`sed -n ‘/bash$/s/:.*//p‘ /etc/passwd` 
for i in $user
do     pass=$(grep $i /etc/shadow |sed ‘s/.*:$6\$//;s/:.*//‘)     echo "$i 密码是:$pass"
done

------------------------------------------------------------------------------------------------------
Day06

AWK 数据过滤工具(grep) 
语法格式:
awk [选项] ‘条件{指令}‘  文件  
#awk ‘{print}‘ a.txt
#awk ‘/b/‘     a.txt 
awk的内置变量:
$0    一整行
$1    第1列(默认以空格或tab为分割)
$2...    第2列(-F自定义分割符号)
NR    当前行号
NF    当前行的列数
FNR    当前行在源文件中的行号   
#awk ‘{print $0}‘ a.txt
#awk ‘{print $1}‘ a.txt
#awk ‘{print $2}‘ a.txt
#awk -F: ‘{print $1}‘ /etc/passwd
#awk -F: ‘{print $2}‘ /etc/shadow
#free |grep + |awk ‘{print $4}‘
#awk -F: ‘/bash/{print $1}‘ passwd
#awk ‘/Failed/{print $11}‘ secure
#awk ‘/Failed/{print $11}‘ secure |sort |uniq -c 
#awk ‘{print NR}‘ a.txt
#awk ‘{print NF}‘ a.txt
#awk ‘{print $NF}‘ a.txt
#awk ‘{print FNR}‘ a.txt b.txt  
#awk ‘{print "abc"}‘  a.txt
#awk ‘{print "第2列是:",$2}‘ a.txt
#awk ‘{print "攻击者是:",$11}‘ txt 
#awk ‘{print "我不是潘金莲\t""速度与激情\n""魔兽"}‘ a.txt 
#awk -F: ‘{print "用户名:\n"$1}‘ /etc/passwd  
AWK处理时机
#awk ‘BEGIN{}  条件{}  END{}‘ 文件
BEGIN后面的命令在读取文件内容之前执行
END后面的命令在读取文件内容之后执行 
#awk -F: ‘BEGIN{print "用户名:"}       /bash/{print $1}‘  passwd 
#awk ‘BEGIN{a=12;b=13;print a+b}‘
#awk ‘BEdGIN{a=1.2;b=13;print a+b}‘
#awk ‘BEGIN{a=1.2;b=13;print a*b}‘ 
#awk ‘BEGIN{x=0}         /bash$/{x++}       END{print x}‘   /etc/passwd 
#awk -F: 
‘BEGIN{print "用户\tUID\t家"}      
{print $1  "\t"  $3  "\t"  $6} 
END{print "总计有"  NR  "行"} ‘     
/etc/passwd   
过滤IP地址:
#ifconfig eth0 |awk -F: ‘/inet a/{print $2}‘ 
#ifconfig eth0 |awk -F: ‘/inet a/{print $2}‘ |awk ‘{print $1}‘  
#ifconfig eth0 |awk -F"[ :]" ‘/inet a/{print $13}‘   
AWK的条件: 
#awk ‘条件{指令}‘  文件 
1.正则
/正则/        匹配正则(行)
~/正则/        匹配正则(列)
!~/正则/    不匹配
#awk -F: ‘/^ro/{print}‘ /etc/passwd
#awk -F: ‘$7!~/bash/{print $1,$7}‘ /etc/passwd  
2.字符或数字比较
比较符号: == != >= <= < > 
#awk -F: ‘$3>=500{print $1,$3}‘ /etc/passwd
#awk -F: ‘$1=="root"{print}‘ /etc/passwd  
3.逻辑 &&   ||
#awk -F: ‘$3>=0&&$3<0{print}‘ /etc/passwd 
#awk -F: ‘$1=="root"||$3>500‘ /etc/passwd  
4.运算(与数学运算符一致)  
综合示例:
#!/bin/bash
#提取用户名
user=`awk -F: ‘/bash$/{print $1}‘ /etc/passwd` 
#提取密码,awk通过-v调用i变量
for i in $user
do    awk -F: -v X=$i    ‘$1==X{print X "---" $2}‘     /etc/shadow
done 
++++++++++++++++++++++++++
awk判断
if(){指令}
if(){指令}else{指令} 
if(){指令}else if(){指令}...else{} 
#awk ‘BEGIN{}  {}  END{}‘ 文件 
#awk -F: ‘{  if($3<500){x++}else{y++}  } END{print x,y}‘  /etc/passwd 
a.txt
二钩子 12 1.8 boy
二妮子 15 1.6 girl
三妮子 18 1.7 girl
小李子 17 1.7 boy 
#awk ‘ {  if($4=="boy"){print $3} else {print $2}  } ‘  a.txt   
过滤/etc/passwd中root出现的次数:
awk -F [:/] 

{i=1; while(i<=NF)    {  if($i~/root/){j++}; i++ } 
}
END {print j} ‘  /etc/passwd  
++++++++++++++++++++++++++
主机1(设:192.168.4.5)
#yum -y install httpd
#service httpd start
#wc -l /var/log/httpd/access_log
#tailf /var/log/httpd/access_log 
主机2:
#curl http://192.168.4.5   
AWK的数组:
定义数组:
变量[下标]=值
变量[下标]=值 
提取数组的值
提取一个值:变量[下标]
提取所有的值:
for(i in 变量){print 变量[i]}  
#awk ‘BEGIN{a[0]=1;a[1]=2;a[2]=3;       for(i in a){print a[i]}  }‘ 
#awk ‘BEGIN{t[a]=1;t[b]=2;t[f]=3;       for(j in t){print t[j]}  }‘ 
#awk ‘{ IP[$1]++ }
END{ for(i in IP){print IP[i],i} 
}‘ /var/log/httpd/access_log  
#ab -c 100 -n 1000 http://1.1.1.1/
模拟100个人访问服务器1000次 
------------------------------------------------------------------------------------------------------
Day07

1.Nginx启动脚本 
准备工作:
FTP下载软件包nginx
#yum -y install gcc 
#yum -y install pcre-devel 
#yum -y install zlib-devel
#tar -xf nginx-1.8.0.tar.gz
#cd nginx-1.8.0
#./configure
#make && make install
#ls /usr/local/nginx/  校验 
Nginx如何使用:
#ln -s /usr/local/nginx/sbin/nginx /usr/bin/ 
#nginx        #启动服务
如果提示如下信息:则关闭其他web服务
bind() to 0.0.0.0:80 failed (98: Address already in use) 
#netstat -ntulp |grep 80 
#nginx        启动服务
#nginx -s stop    关闭服务
nginx的PID文件:
/usr/local/nginx/logs/nginx.pid 
脚本要求:
1.编写nginx启动脚本,   支持start,stop,restart,status
2.启动脚本支持开机启动服务 
提示:
1.case语句的判断
2.根据PID文件,判断状态
3.有注释行的chkconfig    
++++++++++++++++++++++++++++++++
2.一键部署软件的脚本
要求:
1.判断是否有yum,没有提示并退出
2.使用yum自动安装依赖软件包
3.自动解压并安装nginx
4.自动启动该服务
附加:
根据用户的语言环境,如果用户是英文,则提示为英文,如果用户是中文,则提示中文   
++++++++++++++++++++++++++++++
3.安全检测脚本/var/log/secure 
要求:
1.实时判断是否有人连接服务器出现密码错误 
2.如果密码出错3次,则把该IP导出到文件
3.如果用户名错误3次,则把IP导出到文件    
++++++++++++++++++++++++++++
4.进度显示
要求:
带进度提示的mycp 
进度显示版本一:
#!/bin/bash
jindu(){
while :
do     echo -n .     sleep 0.2
done
}
jindu &
cp -r $1 $2
kill $!    
注释:$!是最后一个后台进程的进程号
echo 复制完成  
要求:版本二
显示百分比进度
提示:du -sh 统计大小 
jin(){
while :
do     yuan=du -s $1    100m     mub=du -s  $2    3m     a=echo "$mub/yuan*100" |bc     echo $a%     sleep 0.1     clear
done
}
cp $1 $2 &
jindu   
++++++++++++++++++++++++++++++ 
5.分布式存储脚本
要求:
1.创建3个目录(1,2,3)
2.使用脚本随机往3个目录下存数据   ./test.sh  -w  a.txt
3.用户随时可用查看复制的数据内容   ./test.sh  -r  a.txt  
提示:
mubiao=$((RANDOM%3+1))
case $1 in
-w)     cp -r $2  $mubiao/     echo "$2 $mubiao >>log.txt;;
-r)     A=`grep "$2" log.txt |awk ‘{print $2}`     cat $A/$2
*)     echo "语法错误"
esac

时间: 2024-12-13 10:37:23

正则与shell脚本的相关文章

shell脚本(正则表达+sed+awk)

一. 正则表达式:   正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式. 该模式描述在查找文字主体时待匹配的一个或多个字符串. 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为, 正则表示式通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序.vim.grep.find.awk

shell脚本前奏

一.正则表达式: 正则表达式(Regular Expression,简称RE)就是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式.即一种匹配模式 常用正则表达式: 1. .代表任意单个字符,如:/l..e/,le中间可以是任意两个字符. 2. ^:以...开始的行 3. $:以....结束的行   "^$"就表示空行 4. [...]:匹配括号中的字符之一 "^"如果出现在[]的起始位置,表示否定,在其他位置是普通字符.(即匹配不在此括号中的任

shell脚本扩展

一.正则表达式: 正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.该模式描述在查找文字主体时待匹配的一个或多个字符串. 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序.vim.grep.find.awk.sed等

shell脚本之变量与状态码

目录: 前言 如何创建一个脚本 脚本调试 变量相关 变量的命令规则 bash中变量的种类 本地变量 环境变量 只读和位置变量 位置变量 查询变量 进程的退出状态与状态码 前言 在linux管理中,shell脚本很是重要,它可以帮助我们完成很多繁琐的工作,专注于更重要的事情上来,脚本的学习也是我们学习linux中所要遇到的比较困难的部分,因为它需要对vim,正则,逻辑,程序化语言有一定的熟悉,shell编程是过程式,解释执行的.它包括各种系统指令的组合,数据存储(变量,数组).表达式.语句. 在s

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

遍历文件并格式化输出文件(shell脚本实现)

[背景] 1.项目开发中,急需要根据资源路径res下的文件,生成如下三种格式的文件. 格式一: #define IDR_CEF_0001 101 #define IDR_CEF_0002 102 ... #define IDR_CEF_0122 222 格式二: {"about.html", IDR_CEF_0001}, {"addProbe.html", IDR_CEF_0002}, - {"img/helpimg/help17.PNG", I

《跟老男孩学Linux运维之shell编程实战》-第五章 shell脚本的条件测试

本文的知识点是关于shell脚本的条件测试的相关内容. 通常在shell脚本中我们需要做各式各样的条件判断,比如,测试一个文件是否存在.是否为文件或目录.是否 具有执行权限等等,所以在shell脚本中,条件判断还是至关重要的.接下来我们进入正题:shell脚本的条件测试. 1.在bash编程中,条件测试常用的语法形式如下表: 提示: 语法1中的test命令和语法2中的[]是等价的.语法3中的[[]]双中括号为扩展的test命令. 语法4中的(())常用于计算. 在双中括号[[]]中可以使用通配符

自动化运维工程师必备的shell脚本知识

博主QQ:819594300 博客地址:http://zpf666.blog.51cto.com/ 有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持!一.正则表达式: 正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式. 该模式描述在查找文字主体时待匹配的一个或多个字符串. 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.简单的说,正则表达式就是处理字符串的方法,它是以行为单位来进

如何进行shell脚本正确性测试

在实际工作中,需要对shell脚本进行正确性测试. 如何用最快最有效的方式进行测试? 很多开发的习惯是,二话不说,写完/拿到,就跑一把,看看输入,输出,想要的操作是否完成,也就过了. 其实这是十分不严谨的,若是未经过QA,风险还是相当大的. 以下即shell脚本测试流程,仅供参考 1.代码走读: 写完,或者拿到一个shell脚本,不必急于运行,虽然实践是检验整理的唯一标准,但是,在读代码这个过程中,可以规避很多低级的bug. 读什么? A.代码逻辑,这个脚本用来做什么,主要分为多少步,分别做了什