主题:文本处理工具
一、grep
grep 全局搜索正则表达式
- 固定字符表示通用匹配
- whatis grep man grep 查看grep用法
- 正则表达式分为两种:传统+扩展正则表达式
- 对应的 有两个命令 grep(传统) 和 egrep(扩展)
- egrep = grep -E
grep 格式
grep 匹配条件 处理文件
实验
实验(一)
(1)cp /etc/passwd . 复制到当前
(2)vim passwd
删除前面一些,追加内容
root:root:test
test:test:root
ROOT:test
roothahahaahahahh
(3)过滤root关键字
grep root passwd 只显示过滤的关键字
(4)grep使用的贪婪模式,防止贪婪模式
grep -iE “<root>” passwd 过滤掉roothahahah
(5)以root开头(也就是每一行以root开头!)
grep ^root passwd
grep -i ^root passwd
(6)以root结尾
grep root$ passwd
(7)过滤忽略大小写
grep -i root passwd
(8)root之前、之后不能有字符(\表示之前或者之后不能有字符)
root字符之前不能有字符
grep -E “<root” passwd
root字符之后不能有字符
grep -E “root>” passwd
总结:不能有的是英文数字字符,不包括符号\等!
实验(二)
实验环境
cp /etc/passwd . 复制到当前
vim passwd
删除前面一些,中间添加westoslinux test
(1)显示过滤行以及上面几行和下面几行 grep -数字
grep -2 westoslinux passwd
(2)显示匹配的行所在行号 grep -n
grep -n westoslinux passwd
(3)显示过滤行以及下面几行(after)grep -A
grep -A2 westoslinux passwd
(4)显示过滤行以及上面几行grep -B
grep -B2 westoslinux passwd
(5)反向过滤grep -v
grep -v westoslinux passwd除了匹配行,其他都显示出来
(6)grep -n -2 westoslinux passwd
实验(三)
grep 字符数量匹配规则
^westos | 以westos开头 |
---|---|
westos$ | 以westos结尾 |
w…s | w开头s结尾,中间有4个字符(一个.代表一个字符) |
…s | s结尾前有5个任意字符 |
* | 字符出现0–任意次 |
? | 0–1次(0次或者1次) |
+ | 1–任意次 |
{n} | n次 |
{m,n} | m到n次 |
{0,n} | 0到n次 |
{,n} | 0到n次 |
{m,} | 最少m次 |
(jia){2} | jia字符串出现2次 |
实验过程:
(1)一个 . 代表一个字符
(2)当确定不了字符数时
(3)grep -E “wh{4}s” test h出现4次!
(4)grep -E “wh{2,4}s” test h出,2,3,4次!也就是2-4次!
(5)grep -E “wh{,4}s” test h最多出现4次!
(6)grep -E “wh{4,}s” test h最少出现4次!
(7)字符串出现两次 grep -E “w(lee){2}s” test
练习脚本:
请显示系统中能被su命令切换的用户名称
二、sed
- 常用于修改配置文件
- 操作ASCII纯文本,系统中大部分都是ASCII纯文本,尤其是配置文件
- cat passed 处理文件时,在内存中开辟出一个新的空间,叫模式空间
- sed 会对模式空间逐行进行阅读,当满足条件,就会把它取出,并显示!不符合,不予理睬;
- 逐行处理
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
对字符的处理
p | 显示打印的意思 |
---|---|
d | 删除 |
a | 添加 |
c | 替换 |
w | 写入;(放匹配行下面);把符合的行写到指定文件中 |
i | 插入(放到匹配行的上面) |
r | 整合文件 |
e | 多条策略 |
n | 静默模式 |
实验过程
实验环境:
(1)cd /mnt cp /etc/passwd .
(2)cat passwd -b > westos 显示行号,导入文件westos
(3)rm -fr passwd
1.p
(1)sed -n 5p westos 其中,-n 是静默模式表示不显示模式空间的内容 ,5p是规则,p是打印的意思
(2)sed 5p westos 第五行多打印一次
(3)命令规则写法
vim sedrule 写入内容 5p
sed -n westos -f sedrule
sed -n -f sedrule westos
(4)sed -n 3,5p westos静默显示3-5行
sed -ne 3,5p westos静默显示3-5行
(5)sed -ne “3p;5p” westos 参数e表示多条策略,多条策略用分号;隔开
(6)sed -ne 5,$ p westos 其中$p表示最后一行
(7)sed -n ‘/^#/p’ fstab 显示以#开头的行
sed命令不更改源文件,在终端显示满足条件的内容
2.d
实验环境:
cp /etc/fstab .
vim fstab 看到文件中很多的#
(1)sed 5d westos 删除第五行
(2)sed ‘/^#/d’ fstab 把以#开头的行删除
(4)sed ‘/^UUID/!d’ fstab只想保留UUID开头的行
(5)sed -e ‘5,$d’ westos 删除5到最后一行
3.a 添加
(1)sed -e ‘$a hello word’ fstab最后一行添加helloword
(2)sed -e ‘$a hello\nworld’ fstab换行添加
(3)sed -e ‘/^#/a hello world’ fstab意思是在#开头的行下面都会添加helloworld
4.c 替换
(1)sed -e ‘/^#/c hello world’ fstab #开头的行变成helloword
(2)sed ‘5chello world’ fstab
5.w 把符合的行写到指定文件中
sed ‘/^UUID/w westosfile’ westos把westos文件中UUID开头的写入westosfile中
6.i 插入,插在指定的上面
sed ‘5ihello westos’ westos
5.r 整合文件
sed ‘5r haha’ westos 把haha文件整合到westos文件的第5行下面
字符转换
斜杠表示分隔符
练习:
Apache_port.sh
此脚本后接入数字
http的端口就改为此数字
假设selinux为关闭状态
(实现用脚本自动改变apache的端口)
三、awk
用法:
awk -F 分隔符 ‘BEGIN{}{}END{}’ FILENAME
对上述用法解释:
- 不写分隔符 默认是空格
- 三个中括号{}分别代表开始、中间、结束做的动作!
- BEGIN后可以只写一个{},无论那种格式,BEGIN都要用单引号括起来!
- 例如 awk ‘BEGIN{A=10;print A+10}’
实验:统计文件的行数
基础知识:
(1)""表示的是字符串
(2)没有引号表示的是变量
(3)NR 行数 ;NF 列数;FILENAME文件名称
NR | 行数 |
---|---|
NF | 列数 |
实验过程:
(1)awk ‘BEGIN{ print “LINE”;N=0 }{N++}END{print N}’ westos 打印列数!
(2)awk ‘{ print NR}’ westos 打印行数
(2)awk ‘{ print NF}’ westos 默认以空格为分隔符,打印列数
(3)awk -F : ‘{ print NF}’ westos 以冒号为分隔符打印列数
(4)awk -F : ‘/bash $ /{ print NF}’ westos 打印以bash结尾的行的列数,条件写在两个/ /里面!
(5)awk -F : ‘/bash $ /{ print }’ westos把以bash结尾的行的内容打印出来
其中:westos 表示westos变量值;“westos” westos字符串;/bash$/ 表示条件
实验:条件
/添加1|条件2/ 条件1或者条件2
/添加1/||/条件2/ 条件1或者条件2
/添加1/&&/条件2/ 条件1并且条件2
列的表示形式:
$0 表示所有列
$1 第一列
$2 第二列
$3 第三列
~ 表示是的意思
!~ 表示不是的意思
实验过程:
(1)awk ‘BEGIN{A=10;print A+10}’
(2)awk -F : ‘/bash $ /{ print NF}’ /etc/passwd
(3)awk -F : ‘/^root/&&/bash $/{print $0}’ /etc/passwd两个条件
(4)awk -F : ‘/^root|bash $/{print $1}’ /etc/passwd 一个条件包含两个信息
(5)awk -F : ‘/^root/&&/bash $/{print $1}’ /etc/passwd打印符合条件的第一列
(6)awk -F : ‘/^root/&&/bash $/{print $1,$7}’ /etc/passwd 第一列和第七列
(7)awk -F : ‘/^root/&&/bash $/{print $0}’ /etc/passwd打印符合条件的所有列
(8)想看一下,某一列的内容是否满足条件
awk -F : ‘$7~/bash/{print}’ /etc/passwd 看一下第7列的内容是不是bash,逐行查询后,满足条件的打印出来!
(9)反选某一列的内容不是的打印出来
awk -F : ‘$7!~/bash/{print}’ /etc/passwd
(10)第6列的内容不是home
awk -F : '$6!~/home/ $/{print} ’ /etc/passwd
(11)第6列的内容不是home,并且加上一个条件:以bash结尾的行打印出来。这是两个条件,满足前一个的基础上,再根据第二个条件进行筛选
awk -F : '$6!~/home/&&/bash $/{print} ’ /etc/passwd
(12)awk ‘/bash $/{print FILENAME}’ /etc/passwd /etc/passwd文件以bash结尾的都打印一次名称。FILENAME表示打印文件的名称
注意:上述 $ 和前一个字符是不分开的!
补充知识:
&&和&的区别
1.1 相同点:
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
1.2不同点:
1.2.1. &&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式。
1.2.2.&作为为运算时,&是按位与操作,参加运算的两个数据按照二进制位进行“与”运算。
如果两个相应的二进制位都为1,那该位的结果值就是1,否则为0,即0&0=0,0&1=0,1&1=1,1&0=0。
|| 和 | 的区别
2.1 相同点 :当二者表示或的时候,二者都true则true,否则为false。
2.2 不同点:
2.2.1 || 也存在短路的问题,当前者为true时,则不会判断后面的表达(与上面的&&类似)
2.2.2 |是按位或操作,参加运算的两个数据按照二进制位进行“或”运算,如果两个相应的二进制位中只要有一个为1,则该位结果就是1,即为0|1=1、1|1=1、1|0=1、0|0=0。
||是逻辑或运算符,直接看意思,a||b,若a、b中有一个为真,则a||b结果为真。
总结
(1)双引号和$一起使用,会被识别为变量,必须使用单引号
(2)因为双引号不能忽视 $ 和\ `三个特殊符号,$ 和字符连用时,自然被识别为是变量呀
(3)$1 在awk中出现时意思是 第一列;在其他的场景中,还可以表示普通用户;表示变量。
(4) 单引双引的使用!
练习:统计在系统中能su切换的并且用户家目录不在/home下的用户数量
总结:
(1)能在系统中进行su切换的,首先要满足的条件是 在文件/etc/passwd中以sh结尾
(2)第二个条件是:不在家目录中,也就是第6列的值不能等于/home