正则与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脚本的主要内容,如果未能解决你的问题,请参考以下文章