正则与shell脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则与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   



以上是关于正则与shell脚本的主要内容,如果未能解决你的问题,请参考以下文章

正则与shell脚本

Shell脚本——正则表达式

shell脚本——正则表达式Sed与Awk文本处理工具详解

如何在 shell 脚本中使用正则表达式?

shell脚本之正则表达式

shell脚本扩展