正则表达式
():匹配小括号内的字符串,可以是一个,也可以是多个,常跟“|”(或)符号搭配使用,是多选结构
[]:匹配字符组内的字符,比如咱们常用的[0-9a-zA-Z.*?!]等,在[]内的字符都是字符
{}:匹配次数,匹配在它之前表达式匹配出来的元素出现的次数
^ 行首 $ 行尾 ^$空行
. 任意字符(除换行)
* 0-n个 + 1-n个 ? 1个
[^]表示除了[]内的内容 ^[]表示要以[]内容开头
[0-9] 0-9任意一个字符 [a-z] a-z任意一个字符 [A-Z] A-Z任意一个字符 [a-Z]等价于[a-zA-Z] 所有字母中的任意一个
< 单词头 > 单词尾 (以空格分隔单词)
转义支持
grep,sed,awk均是针对文本的行来操作
awk 直接支持转义,但不支持{}转义,加 --posix后支持{}转义
sed 加-r支持转义
grep 加-E支持转义
练习
grep -i -E 'ro{1,2}' passwd 等价于 grep -i 'ro{1,2}' passwd
sed -n -r '/roo?/'p passwd 等价于 sed -n '/root?/'p passwd
awk '/ro{2,}/{print}' passwd 无结果 awk --posix '/ro{2,}/{print}' passwd 才能匹配到结果
grep
参数
-n :显示行号
-o :只显示匹配的内容
-q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容
-l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc
-A :如果匹配成功,则将匹配行及其后n行一起打印出来
-B :如果匹配成功,则将匹配行及其前n行一起打印出来
-C :如果匹配成功,则将匹配行及其前后n行一起打印出来
--color :关键字加上颜色显示
-c :如果匹配成功,则将匹配到的行数打印出来
-E :等于egrep,扩展
-i :忽略大小写
-v :取反,不匹配
-w:匹配单词
练习
显示出所有含有root的行:grep 'root' passwd
输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:grep -C 2 'bash' passwd
显示出有多少行含有nologin:grep -c 'nologin' passwd
显示出哪些行含有root,并将行号一块输出:grep -n 'root' passwd
查找nfsnobody和ntp用户:grep -E 'n(fsnobody|tp)' passwd
过滤出单词组成是字母+数字+字母的行:grep -E '^[a-Z]+[0-9]+[a-Z]+' passwd
过滤掉所有注释和空行:sudo grep -v '^#' /etc/ssh/sshd_config | grep -v '^$'
sed
常用参数
-n p 只打印结果
-e 实现多行sed指令
d 删除某行或多行或匹配的某个字符串
s 替换,替换为空则为删除操作
g 全局 不加g只处理每行的第一个
/ 可用于分隔符,如果要替换路径等,可将/改为#或@
-i 可用来直接修改文件内容
练习
用sed打印所有行:sed -n '1,$'p test.txt
打印test.txt的3到10行:sed -n '3,10p' test.txt
打印test.txt 中包含 ‘root’ 的行:sed -n 'root'p test.txt
删除test.txt 的15行以及以后所有行:sed '15,$'d test.txt
删除test.txt中包含 ‘root’ 的行:sed '/root/'d test.txt
替换test.txt 中 ‘root’ 为 ‘toor’:sed 's/root/toor/g' test.txt
替换test.txt中 ‘sbin/nologin’ 为 ‘bin/login’:sed 's#sbin/nologin#bin/login#g' test.txt
删除test.txt中5到10行中所有的数字:sed '5,10s/[0-9]//g' test.txt
删除test.txt 中所有特殊字符(除了数字以及大小写字母):sed 's/[^0-9a-Z]//g' test.txt
在test.txt 20行到末行最前面加 ‘aaa:’:sed '20,$s/^./aaa:&' test.txt
把test.txt 中第一个数字移动到行末尾root:x:0:0:root:/root:/bin/bash:sed -r 's#([0-9][0-9])([0-9][0-9])([^0-9].$)#\1\3\2#' |