1.grep [Globally search a Regular Expression and Print]
grep
grep -E = egrep
1)grep 格式
1.grep 匹配条件 处理文件
grep root passwd #过滤root关键字
grep -i root passwd ##后略大小写
grep -E "\<root" passwd ##root字符之前不能有字符
grep -E "root\>" passwd ##root字符之后不能有字符
grep -数字 ##显示过滤行以及上面几行和下面几行
grep -n ##显示匹配的行所在行号
grep -A ##显示过滤行以及下面几行
grep -B ##显示过滤行以及上面几行
grep -v ##反向过滤
2. grep字符数量匹配规则
^westos ##以westos开有
westos$ ##以westos结尾
w....s ##w开头s结尾中间4个任意字符
.....s ##s结尾前面5个任意字符
.* ##字符出现任意
.? ##0到1次
.+ ##1次到任意次
.{n} ##n此
.{m,n} ##m到n次
.{0,n} ##0-n次
{,n} ##0-n次
{m,} ##最少m次
(lee){2} ##lee字符串出现2次实验:
grep ^bash passwd #查找passwd文件中以bash开头的
grep bash$ passwd #查找passwd文件中以bash结尾的
vim westos
hes
has
heas
heees
haaas
heaeas
heaeaeas
grep h.s westos #查找westos文件中以h开头s结尾中间1个任意字符
grep h..s westos #查找westos文件中以h开头s结尾中间2个任意字符
grep h...s westos #查找westos文件中以h开头s结尾中间3个任意字符
grep h.*s westos #查找westos文件中以h开头s结尾中间任意个字符
grep -E 'h.+s' westos #查找westos文件中以h开头s结尾中间1个到任意个 字符
grep -E 'h.?s' westos #查找westos文件以h开头s结尾中间有出现0到1次个任意字符
grep -E 'h.{1,2}s' westos #查找westos文件以h开头s结尾中间有出现1到2次个任意字符
grep -E 'h.{2}s' westos #查找westos文件以h开头s结尾中间有出现2次任意的字符
grep -E 'h.{2,}s' westos #查找westos文件以h开头s结尾中间有出现最少2次个任意字符
grep -E 'h.{,2}s' westos #查找westos文件以h开头s结尾中间有出现0到2次任意字符 【最多2次】
grep -E 'he{2,}s' westos #查找westos文件以he开头s结尾中间有出现最多2次任意字符
grep -E 'h(ea){2,}s' westos #查找westos文件以h开头s结尾中间有出现ea字符出现最少2次
2.sed
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件1)对字符的处理
p ##显示
sed -n 5p westos ##显示第五行
sed -n 3,5p westos ##显示3到5行
sed -ne "3p;5p" westos ##显示3和5行
sed -ne 1,5p westos ##1-5行
sed -ne '5,$p' westos ##5到最后以行
sed -n '/^#/p' fstab ##显示以#开头的行
d ##删除
sed 5d westos ##删除第五行
sed '/^#/d' fstab ##把#开头的行删除
sed '/^UUID/!d' fstab ##除了UUID以外的行都删除
sed -e '5,$d' westos ##删除第5行到最后一行
a ##添加
sed -e '$a hello world' fstab #给fstab文件的最后一行添加hello world
sed -e '$a hello\nworld' fstab #\n 表示换行
sed -e '/^#/a hello world' fstab #给fstab文件的第一个字符是‘#’的行数后添加hello world
c ##替换
sed -e '/^#/c hello world' fstab #fstab文件中以#开头的行替换成hello world
sed '5chello world' fstab #fstab文件中,第5行替换成hello world
w ##把符合的行写到指定文件中
sed '/^UUID/w westofile' fstab ##把westos中UUID开头的行写入westosfile中
i ##插入
sed '5ilinux' westos #给westos文件第5行上边添加linux
r ##整合文件
sed '2r westosfile' westos #将westosfile文件中的内容整合到westos文件的第2行后面
sed 字符替换
sed 's/:/###/g' westos #s:表示所有行,g:表示所有列【把全文的:替换为###】
sed 's/:/###/' westos #后边不加g表示带有:关键字的第一列
sed 's/:/###/g' westos
sed '1,5s/:/###/g' westos #把第一行到第五行的:替换为###
sed '1s/:/###/g' westos #把第一行的:替换为###
sed '1s/:/###/g;5s/:/###/g' westos #把第一行和第五行的:替换为###
sed '/lp/,/shu/s/:/###/g' westos #在passwd文件从lp行到shu行把:换成###
sed 's/\//####/g' westos
sed 's@/@####@g' westos #把全文的/替换为####sed 's@/@####@g' -i westos 把sed处理的内容保存到westos文件中
实验:
cd /mnt
rm -rf *
ls
cp /etc/passwd .
vim passwd
cat passwd
sed '/sbin/cwestos' passwd #在passwd文件中把含有sbin的行替换成westos
sed 's/sbin/westos/g' passwd #在passwd文件中把全文的sbin替换成westos
sed '1,5s/sbin/westos/g' passwd #在passwd文件中把第1行到第5行的sbin替换成westos
sed '2s/sbin/westos/g;5s/sbin/westos/g' passwd #在passwd文件中把第2行和第5行的sbin替换成westos
sed 's/sbin/westos/g;s/nologin/hello/g' passwd #在passwd文件中把全文的sbin替换成westos,把全文的nolodin替换成hello
cat passwd
sed '/lp/,/halt/s/sbin/westos/g' passwd #在passwd文件中从lp开头的行到halt结尾的行,把sbin替换成westos
sed 's@/@###@g' passwd #在passwd文件中把全文件的/替换成###
sed 's@/@###@g' -i passwd #在passwd文件中把sed处理的内容(把全文件的/替换成###)保存到westos文件中
3.awk
awk -F 分隔符 BEGIN{}{}END{} FILENAMENR #行数
NF #列数
FILENAME #文件名称本身
westos #westos变量值
“westos” #westos字符串/bash$/ #条件
/条件1|条件2/ #条件1或者条件2
/条件1/||/条件2/ #条件1或者条件2
/条件1/&&/条件2/ #条件1并且条件2$0 #所有的列
$1 #第一列
$2 #第二列
$3 #第三列
awk -F : '$6!~/home/&&/bash$/{print}' /etc/passwd #/etc/passwd文件的第六列没有home关键字并且以bash结尾的行实验:
rm -rf *
cp /etc/passwd .
vim passwd
awk -F : '{print NR}' /mnt/passwd #显示passwd文件的行数
awk -F : '{print NF}' /mnt/passwd #显示passwd文件每一行的列数
awk -F : '{print FILENAME}' passwd #显示passwd文件的文件名
awk -F : 'BEGIN{westos=0}{westos++}END{print westos}' passwd #在passwd文件中,给westos赋值,每处理一行westos这个值自动+1,最后显示westos字符【可以得到passwd文件有多少行】
awk -F : '/nologin$/{print $0}' passwd #显示每一行以nologin结尾的,所有的列
awk -F : '/nologin$/{print $1,$3}' passwd #passwd文件中,显示以nologin结尾的行数的,第一列和第三列
awk -F : '/nologin$|^root/{print $1,$3}' passwd #passwd文件中,显示以nologin结尾的或者以root开头的行数的,第一列和第三列
awk -F : '/nologin$/&&/^root/{print $1,$3}' passwd #passwd文件中,显示以nologin结尾的并且以root开头的行数的,第一列和第三列
awk -F : '$7~/nologin$/{print $0}' passwd #在passwd文件中,显示第7列是nologin结尾的,所有的列
awk -F : '$7!~/nologin$/{print $0}' passwd #在passwd文件中,显示第7列不是nologin结尾的,所有的 列
awk -F : '$7!~/nologin$/&&/test/{print $0}' passwd #在passwd文件中,显示第7列不是nologin结尾的,并且含有test的,所有的列
课后练习:
1.统计在系统中能su切换的并且用户加目录不在/home下的用户数量
awk -F : 'BEGIN{X=0}$6!~/^\/home/&&/sh$/{X++}END{print X}' /etc/passwd
2.练习及脚本
Apache_port.sh
此脚本接入数字
http的端口就改为此数字
假设selinux为关闭状态
例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!
sh Apache_port.sh 8080
apache的端口会被修改为8080
3.请显示系统中能被su命令切换的用户名称
egrep "sh$" /etc/passwd | cut -d : -f 1