1)grep简介
grep命令是一个Linux文本处理工具,它与egrep命令属于同一系列,这些命令都是用于对文件和文本执行重复搜索任务的工具。我们可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。
2)grep命令格式
grep 匹配条件 处理文件名称
grep root passwd ##过滤root关键字所在的行
grep -i root passwd ##忽略大小写过滤root关键字所在的行
grep -E "\<root" passwd ##过滤root字符之前没有字符的行
grep -E "root\>" passwd ##过滤root字符之后没有字符的行
grep -数字 ##显示过滤行以及上面几行和下面几行
grep -n ##显示匹配的行所在行号
grep -A数字 ##显示过滤行以及下面几行
grep -B数字 ##显示过滤行以及上面几行
grep -v ##反向过滤 不含该关键字的行
3)grep命令字符数量匹配规则
正则表达式 | 含义 |
---|---|
^westos | 以westos关键字开头 |
westos$ | 以westos结尾 |
w…s | w开头s结尾中间含有3个任意字符 |
…s | s结尾前面有3个任意字符 |
* | 字符出现次数任意(即0次到任意次) |
? | 字符出现0到1次 |
+ | 字符出现1次到任意次 |
{n} | 字符出现n次 |
{m,n} | 字符出现m到n次 |
{,n} | 字符出现0到n次 |
{m,} | 字符最少出现m次 |
grep ^westos passwd
grep bash$ passwd
grep c..... passwd
grep ......n passwd
注意最后两条,这里的开头和结尾 不是正经的开头和结尾,只要满足。。。。的条件,不管单词在那个位置都会被查出来
grep -E w(ab){2,}s test
278 grep -E "w(ab){2,}s" test 关键字是wababs
279 grep -E "wa{2,3}s" test 关键字是waas和waaas
脚本练习:显示系统中能被su切换的用户名称
2、sed
sed 全名叫 stream editor即流编辑器,与 vim 的交互式编辑方式截然不同,作为一种非交互式编辑器,sed使用预先设定好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。其功能十分强大,加上正则表达式的支持,可以进行大量的复杂文本的编辑操作。
a)p :显示
sed 参数 命令 处理对象
sed -n 5p westos ##显示第5行
sed -n 3,5p westos ##显示第3行到第5行
sed -n "3p;5p" westos ##显示第3行和第5行
sed -n 1,5p westos ##显示1-5行
sed -n '5,$p' westos ##显示第5行到最后一行
sed -n '/^#/p' fstab ##显示以#开头的行
sed -n 5p passwd
290 sed -n 3,5p passwd
292 sed -ne "3p;5p" passwd
294 sed -ne '5,$p' passwd
sed -n '/^c/p' passwd 显示以c开头的行
b)d :删除
sed 5d passwd ##删除第5行
sed '/^c/d' passwd ##把以c开头的行删除
sed -e '5,$d' passwd ##删除第5行到最后一行
308 sed '/^r/!d' passwd ##删除不是以r开头的所有行
c)a :添加
sed '/^#/a hello world' fstab ##在以#开头的行后添加字符串
sed '$a hello world' fstab ##在最后一行后添加字符串
sed '2atesttest' fstab 第二行添加testtest
sed '/3333333/ahahahaha' fstab 在33333333后边加hahahahahah
sed '$a huanhang\nhahahahahaha' fstab ##在最后一行后添加字符串,使用换行符隔开
d)c :替换
sed '/^2/c hello world' fstab ##将所有以2开头的行替换为指定字符串
sed '1cshiwobushini' fstab ##将第5行替换为指定字符串
sed '/44444444/cnimeiiangdaoba' fstab 把444444444替换为nimeiiangdaoba
e)w :把符合的行写入到指定文件中
sed '/nologin$/wwestosfile' /etc/passwd 把passwd中nologin结尾的行写入westosfile中
f)i :插入
sed '5ihello westos' westos:在westos文件的第5行前插入指定字符串
插入是插入前边,添加是添加在后边,插入类似插队
sed '/3333333/ahahahaha' fstab
sed '/3333333/ihahahaha' fstab
g)r :整合文件
sed '2raaa' fstab :将aaa文件中的内容整合到fstab文件的第2行后
sed 字符替换
sed 's/:/###/g' westos
sed 's/:/###/' westos
sed 's/:/###/g' westos
sed '1,5s/:/###/g' westos
sed '1s/:/###/g' westos
sed '1s/:/###/g;5s/:/###/g' westos
sed 'lp/,/shutdown/s/:/###/g' westos
sed /s/\//####/g' westos
sed 's@/@####@g' westossed 's@/@####@g' -i westos
##把sed处理的内容保存到westos文件中
135 cp /etc/passwd .
136 vim passwd
137 cat passwd
sed 's/a/b/g' test 把a替换成b,g表示关键字的所有列,不加g表示第一列
sed 's/a/b/' test
sed 's/nologin/haha/g' passwd 把所有的nologin替换成haha
sed '1,5s/sbin/###/g' passwd 把1-5行所有的sbin替换成###
156 sed '$s/nologin/haha/g' passwd 最后一行nologin替换为haha
158 sed '/colord:/,/nologin/s/sbin/buhuiba/g' passwd 把colord和nologin之间的sbin替换为buhuiba
特殊符号替换:把/替换为###,下边两种方法
sed 's/\//###/g' passwd 直接用转义符号\,表示/只是一个普通字符,没有特殊含义
sed 's@/@###@g' passwd 用@代替/,要替换的/就失去了特殊意义
注意:以上所有的操作均无法在文件中保存,下面这个方法能保存到文件
sed 's@/@###@g' -i passwd 保存到文件
脚本练习:
Apache_port.sh
此脚本接入数字
http的端口就改为此数字
假设selinux为关闭状态
例如:
sh Apache_port.sh
ERROR: Pleaase input port number following script !!
sh Apache_port.sh 8080
apache的端口会被修改为8080
3.awk(报告生成器)
awk -F 分割符 BEGIN{}{}END{} FILENAME
##BEGING处理之前所需做的事情
##END处理之后所需做的事情NR ##行数
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 : '{print NR}' /mnt/passwd 行号
30 awk -F : '{print NF}' /mnt/passwd 每行有几列
31 awk -F : '{print FILENAME}' /mnt/passwd 处理的文件名称
34 awk -F : 'BEGIN{westos=1}{westos++}END{print westos}' /mnt/passwd
35 awk -F : 'BEGIN{westos=1}{++westos}END{print westos}' /mnt/passwd
每处礼一行,westos自加一
37 awk -F : '/nologin$/{print $1,$3}' /mnt/passwd nologin结尾的
38 awk -F : '/nologin$|^root/{print $1,$3}' /mnt/passwd 一个条件两个元素
39 awk -F : '/nologin$/||/^root/{print $1,$3}' /mnt/passwd 两个条件
把||改为&&就是并且,但是并且不能一个条件两个元素
awk -F : '$7~/bash$/{print $0}' /mnt/passwd 第七列是bash结尾的
43 awk -F : '$7!~/bash$/{print $0}' /mnt/passwd 不是bash结尾
脚本练习:
统计在系统中能su切换的并且用户加目录不在/home下的用户数量
awk -F : 'BEGIN{N=0}$6!~/^\/home/&&/bash&sh$/{N++}END{print N}' /etc/passwd