一、 基础正则表达式:
1、 基础正则表达式示例:
1) 查找特定字符(-n表示显示行号,-i表示不区分大小写,-v表示反向选择)
2) 利用中括号“[ ]”来查找集合字符
查找匹配“i” 或者“o”的字符:
查找“oo”前面不是“w”的字符串:
查找“oo”前面不允许存在小写字母的行:
查找包含数字的行:
3) 查找行首“^”与行尾字符“$”
查找以小写字母开头的行:
查找不以字母开头的行:
查找以“.”结尾的行:
4) 查找任意一个字符“.”与重复字符“*”
“.”代表任意一个字符:
查询包含至少两个o以上的字符:
查询以w开头d结尾,中间包含至少一个o的字符串:
查询以w开头d结尾,中间的字符可有可无的字符串:
查找任意数字所在的行:
5) 查找连续字符范围“{ }”
查询以w开头d结尾,中间包含2-5个o的字符串:
查询以w开头d结尾,中间包含2个以上o的字符串:
2、 扩展正则表达式(egrep):
二、 文本处理器
1、 Sed
1) 输出符合条件的文本(p表示正常输出)
输出所有内容:
输出第3行:
输出所有奇数行,n表示读入下一行资料:
输出所有偶数行,n表示读入下一行资料:
输出第1-5行之间的奇数行:
输出第10行至文件尾之间的偶数行:
输出包含the的行:
输出以PI开头的行:
输出以数字结尾的行:
输出包含单词wood的行:
2) 删除符合条件的文本(d)
删除第3行:
删除第3-5行:
删除包含cross的行:
删除以小写字母开头的行:
删除以“.”结尾的行:
删除所有的空行:
3) 替换符合条件的文本:
4) 迁移符合条件的文本:
编写一个脚本实现“将第1-5行内容转移到第17行后”
vim opt.list
执行:sed -f opt.list test.txt
验证结果。
6)sed直接操作文件:
编写一本脚本,用来调整vsftpd服务配置:禁止匿名用户,但允许本地用户(也允许写入)。需要安装vsftpd包(安装包在linux系统安装光盘上)。脚本如下
#!/bin/bash
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
CONFIG="/etc/vsftpd/vsftpd.conf"
[ ! -e “$CONFIG.bak” ] && cp $CONFIG $CONFIG.bak
sed -e ‘/^anonymous_enable/s/YES/NO/g’ $SAMPLE > $CONFIG
sed -i -e ‘/^local_enable/s/NO/YES/g’ -e ‘/^write_enable/s/NO/YES/g’ $CONFIG
grep “listen”
C
O
N
F
I
G
∣
∣
s
e
d
−
i
′
CONFIG || sed -i '
CONFIG∣∣sed−i′alisten=YES’
C
O
N
F
I
G
s
e
d
−
i
−
e
′
CONFIG sed -i -e '
CONFIGsed−i−e′apam_service_name=vsftpd’ $CONFIG
sed -i -e ‘/one/s//#/’ $CONFIG
systemctl restart vsftpd
systemctl enable vsftpd
2、 awk工具
2) 按字段输出文本
3) 通过管道,双引号调用shell命令
DHCP自动安装脚本如下
#/bin/bash
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 &> /dev/null
sed -i ‘/^BOOTPROTO/s/dhcp/static/’ /etc/sysconfig/network-scripts/ifcfg-ens33
sed -i ‘/^ONBOOT/aIPADDR=192.168.1.10’ /etc/sysconfig/network-scripts/ifcfg-ens33
ifdown ens33 &> /dev/null
ifup ens33 &> /dev/null
mount /dev/cdrom /media &> /dev/null
cd /media/Packages
rpm -ivh dhcp-4.2.5-47.el7.centos.x86_64.rpm &> /dev/null
sed -i -e ‘5asubnet 192.168.1.0 netmask 255.255.255.0 {\nrange 192.168.1.100 192.168.1.200;\noption domain-name-servers 202.106.0.20,202.106.46.151;\noption routers 192.168.1.1;\n}’ /etc/dhcp/dhcpd.conf
systemctl start dhcpd