shell脚本应用(四)

  • A+
所属分类:linux技术
--正则--
基础正则
^word     ##搜索以word开头的 vi/vim中 ^ 一行的开头
word$     ##搜索以word结尾的 vi/vim中 $ 一行的结尾
^$        ##表示空行
.         ##代表且只能代表任意一个字符
         ##例:. 只代表点本身,转义符号,让有特殊身份意义的字符,脱掉马甲,还原
n        ##换行符
r        ##匹配回车
w         ##匹配任意一个字符和数字
*         ##重复0次或多次前面的一个字符
.*        ##匹配所有字符。例:^.* 以任意多个字符开头,.*$以任意多个字符结尾
[abc]     ##匹配字符集内的任意一个字符
[^abc]    ##匹配不包含 ^ 后的任意字符的内容。中括号里的 ^ 为取反
[1-9]     ##表示匹配括号内的范围内的任意字符
a{n,m}  ##重复n到m次前一个重复的字符。若用egrep、sed -r可以去掉斜线
{n,}    ##重复至少n 次前一个重复的字符。若用egrep、sed -r可以去掉斜线
{n}     ##重复n 次前一个重复的字符。若用egrep、sed -r可以去掉斜线
{,m}    ##重复少于m次
注:egrep,grep –E或sed –r 过滤一般特殊字符可以不转义
扩展正则(egrep或grep -E)
+          ##重复一次或一次以上前面的一个字符
?          ##重复0次或一次前面的一个字符
|          ##或者的意思,用或的方式查找多个符合的字符串
()         ##找出括号内的字符串
grep awk sed 语法
(一)grep
grep [选项] [条件表达式] 目标文件
例如:
cat /proc/meminfo |grep -e Mem -e Cache -e Swap     ##查看系统内存、缓存、交换分区-e的作用是匹配多个表达式
 
grep -R -o -n -E  '[a-z0-9_]+@[a-z0-9_]+.[a-z]{2,4}' /etc/     ##查找/etc目录下的所有文件中的邮件地址;-R递归,-n表示匹配的行号,-o只输出匹配内容,-E支持扩展正则表达式,
 
grep -R -c 'HOSTNAME' /etc/ |grep -v "0$"     ##查找/etc/目录下文件中包含“HOSTNAME”的次数,-c统计匹配次数,-v取反
 
grep -R -l 'HOSTNAME' /etc/           ##查找包含“HOSTNAME”的文件名,-l显示匹配的文件名,-L显示不匹配的文件名
 
dmesg | grep -n --color=auto 'eth'       ##查找内核日志中eth的行,显示颜色及行号
 
dmesg | grep -n -A3 -B2 --color=auto 'eth'     ##用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,在关键字所在行的前两行与后三行也一起找出出来显示
 
cat /etc/passwd |grep -c bash$         ##统计系统中能登录的用户的个数
 
touch /tmp/{123,123123,456,1234567}.txt   ##创建测试文件,以下三条命令是一样的效果,匹配文件名123,可以包含1个到多个
ls |grep -E '(123)+'
ls |grep '(123)+'
ls |egrep '(123)+'
 
ps -ef |grep -c httpd             ##统计httpd进程数量
 
grep -C 4 'games' --color /etc/passwd       ##显示games匹配的“-C”前后4行
 
grep ^adm /etc/group             ##查看adm组的信息
 
ip a |grep -E '^[0-9]' |awk -F : '{print $2}'     ##获取网卡名称
 
ifconfig eth0 |grep -E -o 'inet addr:[^ ]*' |grep -o '[0-9.]*'   ##截取ip地址,[^ ]*表示以非空字符作为结束符,[0-9.]*表示数字和点的组合
 
ip a |grep inet |grep eth0 |grep -o "inet[^/]*" |grep -o "[0-9.]*"  ##截取ip地址
 
ifconfig eth0 |grep -i hwaddr |awk '{print $5}'   ##截取MAC地址
 
ip a |grep -A 3 "eth0" |grep link/ether |grep -o "ether[^r]*" |grep -o -E "[0-9a-f:]+"|grep -E "[0-9a-f:]{2}$"      ##截取MAC地址
 
grep "^m" oldboy.log       ##过滤输出以m开头的行
grep "m$" oldboy.log
grep -vn "^$" oldboy.log       ##过滤空行
grep -o "0*" oldboy.log
grep -o "oldb.y" oldboy.log
grep ".$" oldboy.log       ##以.结尾的行
grep "0{3}" oldboy.log       ##重复三次
 
(二)sed
语法:sed 选项  ‘内容’  文件名
选项:
-n 抑制自动打印pattern space,sed默认输出全部,-n用于取消默认输出
-i 编辑文件
-r 支持扩展正则表达式
1.改:
语法:sed '/正则匹配条件/s/old/new/g' 文件
sed 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只是显示,不修改
sed -i 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只修改,不显示
sed -i 's/dhcp/static/g' ip ##将所有的dhcp替换为static
sed -i '/^IP1/s/static/dhcp/g' ip ##将IP1开头的行替换
sed -i '2s/static/dhcp/g' ip ##指定特定行号2行替换
cat -n /etc/selinux/config ##查看并显示行号
sed -i '7s/disabled/enforcing/g' /etc/selinux/config ##开启selinux
2.删:
语法:sed '/表达式/d' 文件
vim ip ##添加空行
sed '/^$/d' ip ##删除空行并显示在屏幕上
sed -i '/IP1/d' ip ##删除包含IP1的行
sed -i '/^IP2/d' ip ##删除以IP2开头的行
sed -i '2d' ip ##删除第二行
3.增:
语法:sed ' /表达式/a "需要添加的文字"' 文件
sed 'a IP3=static' ip ##每一行后都加上IP3=static
sed '3a IP3=static' ip ##只在第3行后加上IP3=static,并显示不修改
sed '3i IP3=static' ip ##只在第3行前加上IP3=static,显示不修改
sed -i '3a IP3=static' ip ##修改,不显示
sed -i '/^IP3/a "test add"' ip ##在以IP3开头的行后添加
 
(三) awk
awk [选项] '模式{动作 ranges}' 文件1 文件2 ...
选项: -F   指定输入分隔符,可以是字符串或正则表达式
常用动作: print、printf
匹配范围(ranges):指定的匹配范围,格式为part1,part2(例如$1,$2)
awk的变量:
awk变量:
FS:列分隔符,默认位空白
RS:行分隔符,默认位换行符
OFS:输出列分隔符
ORS :输出行分隔符
awk内置变量:
NR:处理中行数
FNR:单个文件的行数
NF:列的个数