正则表达式和grep、vim、awk、sed等的关系:
命令是怎么执行的:
select是bash自带的字符菜单工具。
select基本语法:
PS3="select的提示符"
select variable in list
do
commands
done
例如:
#!/bin/bash
PS3="Please input the number:"
select number in "select A" "select B" "select C" "Exit"
do
case $number in
"select A")
echo "AAAAAAA"
;;
"select B")
echo "BBBBBBB"
;;
"select C")
echo "CCCCCCC"
;;
"Exit")
exit
;;
*)
echo -e"\n"
echo "Sorry,haven't this item..."
esac
done
clear
常用通配符:
例:
正则表达式里通配符和shell里面的通配符的区别:
grep通用正则表达式分析程序(global research regular expression and printing):
其实,grep是一个过滤命令,根据特定的正则表达式来过滤文本里的内容。grep是根据某个模式进行匹配文件里的一行一行的数据去处理的,如果有匹配的行,就会将整行输出到屏幕上。
用途:使用正则表达式搜索文本,并把匹配的行打印出来
格式:grep [选项]… 模式 目标文件
grep用的时候模式要用双引号”“引起来!!!
PS: 效率:grep>sed>awk
pattern模式:
(一行一行的处理–》文字流)
Linux系统支持三种形式的grep命令,通常将这三种形式的grep命令称为grep命令族,这三种形式具体为:
PS:还有 ls /bin/*grep 也可。
一、正则表达式是一个指定文本模式的标准Unix 语法。
二、正则表达式是由一串字符和元字符构成的字符串,简称RE(Regular Expression)
三、正则表达式由下列元素构成 :
正则里的通配符:
a…b 表示ab之间有三个字符
② 方括号表达式:一个文字字符域
③域表达式和字符类
考虑到不同的编码方案推荐使用字符类方式(此类方法不常用,以被上面②方式代替!)
通用修饰符(理解为通配符即可):
\<wubing\> 表示wubing这个单词
PS: grep在界定单词的时候,默认使用的分隔符是空白
egrep、awk和Perl等Linux工具还支持正则表达式扩展出来的一些元字符,这些元字符如下表所示:
egrep ‘cat.' /etc/aa
egrep ‘cat\.' /etc/aa
PS:tab键怎么grep匹配出来:
①egrep “\s”–》\s表示空白(空格、tab、换行符)
②egrep “[[:space:]]” –》查找空白(空格、tab、换行符)
③grep -P “\t“ –》得到Tab键 –》使用perl语言的正则语法,支持\t表示tabl键,\s表示空白
写ip地址正则时的方法:需要按个位(1位)、十位(2位)、百位(3位)
"\b([1-9]|[1-9][0-9]|1[01][0-9]|12[0-6])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) ){3}\b"
"\b(12[89]|1[3-8][0-9]|19[01])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]) ){3}\b"
"\b(19[2-9]|2[01][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]) ) {3}\b"
egrep "[0-Z._]+@[0-Z]+\.[a-Z]+"
egrep "^http://([0-Z]+\.){2}[a-Z]{2,3}"
egrep --color "http://(.*\..*){2}" --》网址至少有两个点!(适用所有网址)
1.进入/lianxi目录,复制/etc/passwd到当前目录下,然后对passswd进行操作
2.查找出当前passwd文件中以ftp开头或者mail开头的行,在屏幕输出
3.查找出当前passwd文件中首行不是以r、m、f开头的行,在屏幕输出
4.查找出当前passwd文件中以bash结尾的行
5.查找出/etc/login.defs文件中的有效行(不显示空行和注释行)
6.查找出/var/log/messages文档中有16个字母的单词
7.查找/etc/passwd文件里用户名包含liu同时使用bash的用户
8.查找/etc/ssh/sshd_config文件里的有效行
9.查找/etc/ssh/sshd_config文件里的包含连续2个数字的行
10.查找出包含特殊字符的行
11.查找出不包含数字的行
12.查找出/var/log/messages里的ip地址出来
13.写一个正则来表示出下面的网址,例如:
http://www.baidu.com
http://www.sina.com
http://www.163.com
http://www.12306.cn
http://www.qillu.edu
14.写一个表示邮箱的正则,例如:
feng@qq.com
1234feng@163.com
meng.xianhui@yahoo.cn
liudenghua@sina.com
10001@qq.com
123_ui@12306.com
qilu@qilu.edu
15.C类ip地址的正则表达式
section1:范围在192-223之间
section2和section3和section4范围:0-255之间
例如:193.168.23.1
答案:
1)cp /etc/passwd .
2)cat passwd|grep "^ftp|^mail"
3)cat passwd|grep -v "^r|^m|^f"
4)cat passwd|grep "bash$"
5)cat /etc/login.defs|egrep -v "^$|^#"
6)cat /var/log/messages|egrep "\<[0-Z]{16}\>"
7)
法1: cat /etc/passwd|egrep "^[0-Z]*liu[0-Z]*" | egrep "bash"
法2: cat /etc/passwd|egrep "^.*liu.*:x:"|egrep "bash"
法3: cat /etc/passwd|egrep "^[0-Z_]*liu.*bash$"
8)cat /etc/ssh/sshd_config|egrep -v "^$|^#"
9)cat /etc/ssh/sshd_config|egrep "\b[0-9]{2}\b" --》连续两个数字
10)cat /etc/ssh/sshd_config|egrep "[^0-Z]" --》包含特殊字符(^在[]里面,表示取反)
11)cat /etc/passwd|grep -v ".*[0-9].*"
12)cat /var/log/messages | egrep "\b([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) ){3}\b"
13)egrep --color "http://(.*\..*){2}" --》网址至少有两个点!(适用所有网址)
14)egrep "\b[0-Z._]{1,16}+@[0-Z]+\.[a-Z]+\b" --》邮箱的正则(用户名最大16位)
15)"\b(19[2-9]|2[01][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]) ) {3}\b" --》C类IP地址
PS:连续匹配和单独的字符混合使用
cat m_phone.txt|egrep -v "^[0-Z .]*$"
监控/var/log/secure文件,统计出ssh错误连接本机次数超过十次的ip地址,拒绝这个ip地址再ssh连接过来(将这个ip地址写入到/etc/hosts.deny黑名单,/etc/hosts.allow是白名单)
分析:
#cat secure|egrep "Faild passwd"|egrep -o "\b172(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}\b" --》-o 只显示截出来的IP
上面的命令接 | sort | uniq -c | sort -nr –》uniq -c统计重复次数
得到 :
然后用while read aa bb,然后,echo “sshd:$bb” >>/etc/hosts.deny
答案:
#!/bin/bash
while true
do
cat secure|egrep "Failed passwd"|egrep -o "\b192(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}\b"|sort|uniq -c|sort -nr >secure.txt
deny=$(cat /etc/hosts.deny|egrep "^sshd:192(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$"|awk -F: '{print $2}')
echo $deny >deny_ip.txt
cat secure.txt|while read times IP
do
if (( $times>=2 ))
then
if ! grep $IP deny_ip.txt &>/dev/null
then
echo "sshd:$IP" >>/etc/hosts.deny&&echo "$IP has been written to /etc/hosts.deny"
fi
fi
done
sleep 1
done
①提醒用户输入ip地址
②要求判断文件中的ip地址是否是合法的ipv4地址
③不合法的ip地址给与提醒
④输出用户输入的ip地址
分析:首先有三个点,其次,第一部分为1-223,其他为0-255即可。
答案:
cat /lianxi/iphefa.sh
#!/bin/bash
while :
do
clear
read -p "Please input the IP:" addr
echo "$addr" >iphefa.txt
if ( (cat "iphefa.txt"|egrep "^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[01][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$")&>/dev/null )
then
echo "The IP that you input is :$addr"
break
else
echo "Please input the right IP!!"
read -p "Please input anykey to continue......"
fi
done
编写脚本实现显示当前主机eth接口的有效IP和有效网关,要求显示结果如下图所示(多使用正则表达式,少用cut和tr)
分析:route -n–》看网关,ifconfig–》看ip,
答案:
cat /lianxi/eth01.sh
#!/bin/bash
ifconfig|egrep "([1-9]|[1-9][0-9]|1[0-9][0-9]|2[01][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}"|head -n +2|tr -s " " ":"|cut -d":" -f4,6,8|tr -s ":" " " >eth01.txt
n=0
for i in $(<eth01.txt)
do
((n++))
if (( n==1 ))
then
(echo $i|egrep "([1-9]|[1-9][0-9]|1[0-9][0-9]|2[01][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}"&>/dev/null)&&echo "eth0:$i"||echo "no IP"
elif (( n==4 ))
then
(echo $i|egrep "([1-9]|[1-9][0-9]|1[0-9][0-9]|2[01][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}"&>/dev/null)&&echo "eth1:$i"||echo "no IP"
fi
done
route -n|tail -n 1 >GATEWAY.txt
cat GATEWAY.txt|while read a IP c d e f g ETH
do
if ( echo $IP|egrep "([1-9]|[1-9][0-9]|1[0-9][0-9]|2[01][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}"&>/dev/null )
then
echo "gateway: $IP ($ETH)"
else
echo "gateway: NULL"
fi
done