基于kinux下的shell正则表达式

1、grep


全局搜索正则表达式
[root@desktop mnt]# grep root passwd  #过滤出passwd中含root的行

[root@desktop mnt]# grep ^root passwd #^ 表示以root开头行


[root@desktop mnt]# grep root$  passwd #$ 表示以root结尾行
[root@desktop mnt]# grep -i root  passwd #-i 忽略大小写
[root@desktop mnt]# grep -E "root|ROOT"  passwd #-E 扩展正则表达式,相当于egrep,|表示或

[root@desktop mnt]# grep -v "root|ROOT"  passwd #-v 反向过滤



[root@desktop mnt]# grep -E  "r...\>" test #不做拓展搜索,精确匹配关键字
root
rootroot
[root@desktop mnt]# grep -E  "\<r...\>" test
root
[root@desktop mnt]# grep r...t test #.表示位数,精确指定
rooot
rooat
[root@desktop mnt]# grep r..t test
root

rootroot


[root@desktop mnt]# grep -E "ro*t" test ##*表示字符ro出现0到任意次
root
rt
rooot
rot
rootroot
rooooot
grep中字符的匹配次数设定
*  字符出现0-任意次
? 字符出现0-1次
+  字符出现1-任意次
{m,n}  字符出现最少出现m次,最多出现n次
{0,n}  字符出现0-n次
{m,}  字符出现至少m次
.*    关键字之间匹配任意字符

[root@desktop mnt]# grep -E "ro?t" test #?表示字符ro出现0到1次
rt
rot
[root@desktop mnt]# grep -E "ro{1,}t" test #"ro{1,}t"表示字符ro出现1到任意次
root
rooot
rot
rootroot

rooooot


[root@desktop mnt]# grep "ro\{1,\}t" test #\表示转义,加-E后不用写\
root
rooot
rot
rootroot
rooooot
[root@desktop mnt]# grep -E "ro+t" test ##"ro+t"表示字符ro出现1到任意次
root
rooot
rot
rootroot
rooooot
[root@desktop mnt]# grep -E "ro{,2}t" test #"ro{,2}t"表示字符ro出现0到2次
root
rt
rot
rootroot
[root@desktop mnt]# grep -E "(root)?" test #"(root)?"表示字符root出现0到1次
root
rt
rooot
rot
rootroot
rooat
rooooot
[root@desktop mnt]# grep -E "r.*t" test #关键字之间匹配任意字符
root
rt
rooot
rot
rootroot
rooat

rooooot


shell脚本:显示系统中可以登陆的用户
#!/bin/bash
SHELL=$(echo `grep -v nologin /etc/shells`|sed 's/ /|/g')

grep -E "$SHELL" /etc/passwd |cut -d : -f 1



2、sed


行编辑器
(1)p显示模式
[root@desktop mnt]# sed -n '/^UUID/p' fstab #显示以UUID开头的行
[root@desktop mnt]# sed -n '/0$/p' fstab #显示以0结尾的行
[root@desktop mnt]# sed -n '/^UUID/!p' fstab #不显示以UUID开头的行
[root@desktop mnt]# cat -n fstab|sed -n '/2,6/!p' fstab #显示2-6行

[root@desktop mnt]# cat -n fstab|sed -n -e '2p' -e '6p'#显示2和6行,多个条件用-e连接


[root@desktop mnt]# cat -n fstab|sed -n -e '2p;6p'#显示2和6行

[root@desktop mnt]# sed -n '/^$/!p' fstab #不显示空行

[root@desktop mnt]# cat file

hello
[root@desktop mnt]# sed -n '1p' westos
hello
[root@desktop mnt]# sed  '1p' westos #不加-n时会显示两次
hello
hello
shell脚本  两个文件userfile和passfile读取文件建立用户赋予密码
#!/bin/bash
MAX_LINE=` wc -l $1|cut -d " " -f 1`
for LINE_NUM in `seq  1  $MAX_LINE`
do  
     USERNAME=`sed -n "${LINE_NUM}p"  $1`
     PASSWORD=`sed -n "${LINE_NUM}p"  $2`
     useradd   $USERNAME
     echo  $PASSWORD| passwd --stdin $USERNAME

done



(2)d删除模式(不用加-n)
[root@desktop mnt]# sed  '/^$/d' fstab #删除空行
[root@desktop mnt]# sed '2d;6d' fstab #删除2和6行
[root@desktop mnt]# sed -n '/^UUID/d' fstab #删除以UUID开头的行

[root@desktop mnt]# sed -n '/0$/d' fstab #删除以0结尾的行


(3)a添加模式
[root@desktop mnt]# cat test
hello
[root@desktop mnt]# sed '/hello/aworld' test #给test文件hello后加world,添加到下一行
hello
world
[root@desktop mnt]# sed 's/hello/hello world/g' test #行后添加相当于修改本行
hello world
[root@desktop mnt]# sed '/hello/aworld\nwestos' test #插入多行,\n表示换行
hello
world

westos


(4)i插入模式



(5)c替换模式
[root@desktop mnt]#cat westos
hello
[root@desktop mnt]#sed '/hello/chello world' westos
hello world
[root@desktop mnt]#sed '/hello/cwestos\nworld'  westos
westos

world


(6)w写入模式
处理一行写一行,效率高
[root@desktop mnt]# sed -n '/hello/wfile' westos #将westos中的hello写入file文件,file不存在时会自动创建
[root@desktop mnt]# cat file
hello
[root@desktop mnt]# sed -n '/hello/p' -i file #作用同上,file不存在时会报错
[root@desktop mnt]# cat file
hello
(7)其他用法
[root@desktop mnt]# sed '=' fstab #给fstab每一行添加行号
N 每一行添加换行符
G 每一行后添加空行

显示文件匹配的内容,及其所在的行

(8)s替换
[root@desktop mnt]# sed 's/nologin/###/g' passwd #全文替换nologin为###
[root@desktop mnt]# sed '3,5s/nologin/###/g' passwd #3-5行的nologin替换为###
[root@desktop mnt]# sed '/adm/,/sync/s/sbin/@@@@@@/g' passwd #从adm到sync的所有sbin替换为@@@@@@
[root@desktop mnt]# sed -e '/adm/,/sync/s/sbin/@@@@@@/g;s/x/HHHHH@/g' passwd #替换从adm到sync的sbin,替换全文x
[root@desktop mnt]# vim file #编写一个替换规则的文件file
/adm/,/sync/s/sbin/@@@@@@/g
s/x/HHHHH/g
[root@desktop mnt]# sed -f file passwd #-f指定file的规则区替换passwd

[root@desktop mnt]# sed -f file -i passwd #指定file的规则替换passwd,同时输出到passwd更改其内容



shell脚本   更改http服务的端口号
#!/bin/bash
yum install httpd.x86_64 -y &> /dev/null;
sed -i "/^Listen/cListen $1" /etc/httpd/conf/httpd.conf;
echo -e "\033[32mthe listen is changed;\033[0m"
sed -ne '42p'  /etc/httpd/conf/httpd.conf

systemctl restart httpd




3、awk报告生成器


[root@desktop mnt]# awk '{print NR}' passwd #打印passwd行号
[root@desktop mnt]# awk '{print NF}' passwd #打印passwd列号
[root@desktop mnt]# awk -F ":" 'BEGIN{print "NAME"}{print $1}END{print "END"}' passwd #打印passwd第一列,打印前先打印NAME,打印后再打印END
[root@desktop mnt]# awk '/nologin$/{print}' passwd #打印以nologin结尾的行
[root@desktop mnt]# awk -F ":" '/bash$/{print $1}' passwd #打印以bash结尾的行的第一列
[root@desktop mnt]# awk -F ":" 'BEGIN{N=0}/bash$/{N++}END{print N}' passwd #显示以bash结尾的行的数目
[root@desktop mnt]# awk  'BEGIN{N=0}//{N++}END{print N}' passwd #显示passwd文件的行数
[root@desktop mnt]# awk '/^[a-d]/{print}' passwd #打印passwd以a-d开头的行
[root@desktop mnt]# awk '/^[^a-d]/{print}' passwd #打印除a-d开头以外的行
[root@desktop mnt]# awk '/^a|nologin$/{print}' passwd   #打印开头为a结尾为nologin的行

[root@desktop mnt]# awk '/^a/&&/nologin$/{print}' passwd   #打印开头为a结尾为nologin的行




[root@desktop mnt]#ifconfig  eth0 | awk '/inet\>/{print $2}'    显示本机ip
172.25.254.113
[root@desktop mnt]# awk 'BEGIN{n=0}{n++}END{print n}'  /etc/passwd   显示文件passwd有多少行

猜你喜欢

转载自blog.csdn.net/xdmaidou/article/details/80754685
今日推荐