1、grep
[root@desktop mnt]# grep root passwd #过滤出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
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
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
#!/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结尾的行
[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插入模式
[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
处理一行写一行,效率高
[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 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有多少行