1.grep
grep命令简介
grep (缩写来自Globally search a Regular Expression and Print)——全局搜索正则表达式,是一种强大的文本搜索工具,它能使用特定模式匹配搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep和fgrep都是grep的扩展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
grep格式
格式:grep 匹配条件 处理文件
grep root passwd #过滤root关键字
grep ^root passwd #以root开头
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 #反向过滤,显示除了匹配行之外的其他行
grep字符数量匹配规则
^westos #以westos开头
westos$ #以westos结尾
w....s #以w开头s结尾,中间有4个任意字符
.....s #以s结尾,前面5个任意字符
* #字符出现0到人一次
? #0到1次
+ #1到任意次
{n} #n次
{m,n} #m到n次
{0,n} #0-n次
{,n} #0-n次
{m,} #最少m次
(lee){2} #lee字符串出现2次:grep -E "w(lee){2}s" test
练习脚本:
请显示系统中能被su命令切换的用户名称
参考答案:
#!/bin/bash
grep -E "bash$|sh$|tcsh$|csh$" /etc/passwd | cut -d : -f 1
grep字符数量匹配规则示例:
练习:
2.sed
SED(Stream EDitor)是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大。
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
对字符的处理
-p #显示(p:print)
sed -n 5p westos #显示westos文件第五行,n:不显示模式空间里的内容
sed -n 3,5p westos #显示3到5行
sed -ne "3p;5p" westos #显示3和5行,e:多条策略
sed -ne 1,5p westos #显示1-5行
sed -ne '5,$p' westos #第5行到最后一行
sed -n '/^#/p' fstab #显示以#开头的行
-d #删除
sed 5d westos #删除westos文件的第五行
sed '/^#/d' fstab #把fstab文件中以"#"开头的行删除
sed '/^UUID/!d' fstab #除了UUID以外的行都删除
sed -e '5,$d' westos #删除第五行到最后一行
-a #添加
sed -e '$a hello world' fstab
sed -e '$a hello\nworld' fstab
sed -e '/^#/a hello world' fstab
-c #替换
sed -e '/^#/c hello world' fstab
sed '5chello world' fstab
-i #插入,放到匹配行的前面(和-a对应)
sed '5ihello westos' westos
-r #整合文件
sed '5r haha' westos
sed 字符替换
sed 's/:/###/g' westos #将passwd文件的全文的:替换成###
sed 's/:/###/' westos
sed '1,5s/:/###/g' westos #替换第一行到第五行
sed '1s/:/###/g' westos #替换第一行
sed '1s/:/###/g;5s/:/###/g' westos #替换第一行和第五行
sed '/lp/,/shutdown/s/:/###/g' westos #替换lp到shutdown之间的
sed 's/\//####/g' westos #替换全文的/为####,其中\为转义字符
sed 's@/@####@g' westos #用@表示分隔符也行,和上个命令作用一样
sed 's@/@####@g' -i westos #把sed处理的内容保存到westos文件中,该命令用来修改原文件内容
练习及脚本
编写脚本Apache_port.sh
此脚本后写入数字
http的端口就改为此数字
(假设selinux为关闭状态)
参考如下:
#!/bin/bash
[ -z "$1" ] && {
echo "please enter a number"
exit #判断脚本后是否输入数字
}
[ -z "`netstat -antlupe | grep $1`" ] || { #此处的``不是单引号,而是反向单引号,其内的优先执行
echo "Error: $1 is used by system proto"
exit #判断输入的端口号是否被占用
}
[ -e "/etc/httpd/conf/httpd.conf" ] || {
yum install httpd -y &> /dev/null || {
echo apache not installed and yum repo is unavailable
exit #如果未安装apache服务,则自动安装,若安装过程中yum源未配置好则报错
}
}
sed "/^Listen/c Listen $1" -i /etc/httpd/conf/httpd.conf
#修改apache服务的端口号
systemctl restart httpd > /dev/null && {
echo " confiugre port successfully"
} || {
echo " Error: can't up service"
} #重启apache服务,重启失败会报错
-p:显示
-d:删除
-a:添加
-c:替换
-i:插入
-r:整合文件
sed 字符替换
练习:
小插曲: $和反向单引号作用相同,里面的内容都是优先执行
3.awk
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。
awk -F 分隔符 BEGIN{}{}END{} FILENAME
NR #行数
NF #列数
FILENAME #当前文件名称本身
westos #显示westos变量值
“westos” #显示westos字符串
/bash$/ #表示条件,以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结尾的行
课后练习:
统计在系统中能用su切换的并且用户家目录不在/home下的用户数量
#!/bin/bash
awk -F : 'BEGIN{N=0}$6!~/home/&&/bash$|sh$|tcsh$|csh$/{print $1;N++}END{print N}' /etc/passwd
用法示例:
练习:
总结:awk、sed、grep更适合的方向:
grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本
awk 更适合格式化文本,对文本进行较复杂格式处理
结束!!!