shell(2):正则表达式
一、整理正则表达式博客
(1)正则
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。
在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,下面我们就为大家介绍三种文本处理工具/命令:grep、sed、awk,它们三者均可以解释正则。
正则介绍:
^行首 $行尾 .除了换行符以外的任意单个字符 .*所有字符 *:左边的那一个字符有0个到无穷个 +:左边的那一个字符有1个到无穷个 ?:左边的那一个字符有0个到1个 {n}:左边的那一个字符有n个 {n,m}:左边的那一个字符有n个到m个 {n,}:左边的那一个字符有n个到无穷个
[]字符组内的任一字符 [^]对字符组内的每个字符取反(不匹配字符组内的每个字符) ^[^]非字符组内的字符开头的行 [a-z]:所有的小写字母 [A-Z]:所有的大写字母 [a-zA-Z]:所有的大小写字母,等于[a-Z] [0-9]:数字 \<单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词 \>单词尾 注意的一点是:如果要匹配的字符就是-本身话,必须放到最后去[123123\-]
扩展正则sed 加 -r参数或转义 grep 加-E或egrep或转义 awk直接支持,但不包含{n,m} 可以使用--posix支持 awk '/ro{1,3}/{print}' /etc/passwd awk --posix '/ro{1,3}/{print}' /etc/passwd sed -n '/roo\?/p' /etc/passwd sed -rn '/roo?/p' /etc/passwd ?前导字符零个或一个 +前导字符一个或多个 abc|def abc或def a(bc|de)f abcf或adef x\{m\}x出现m次 x\{m,\}x出现m次至多次(至少m次) x\{m,n\}x出现m次至n次
(2)grep
参数
-n :显示行号 -o :只显示匹配的内容 -q :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容 -l :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc -A :如果匹配成功,则将匹配行及其后n行一起打印出来 -B :如果匹配成功,则将匹配行及其前n行一起打印出来 -C :如果匹配成功,则将匹配行及其前后n行一起打印出来 --color -c :如果匹配成功,则将匹配到的行数打印出来 -E :等于egrep,扩展 -i :忽略大小写 -v :取反,不匹配 -w:匹配单词
(3)sed
sed 选项参数 命令
例如: #sed -n '3p' test.txt #静默输出第3行内容,3为定位行位置,p为命令 #sed ‘4a abcd’ test.txt #第4行追加abcd字符,a为命令
其中,
选项参数:
-n:静默处理,不打印输出结果
命令:
p:打印 c:替换行内容 a:追加内容 i:插入内容 1,4d:删除1到4行内容 1d,4d:删除1行和4行内容 d:删除 //:命令中使用正则表达式放入//中 //d:删除正则匹配到的行 s:替换 s/aaa/bbb/g:将全部行中的aaa替换为bbb,不加g则每行只替换第一个aaa s/()()/\1\2/g:匹配两个括号中的内容,\1\2表示将第一个括号和第二个括号内容显示 例如: #sed 's/^(.)(.*)$/\2/' test.txt #test文件中任意行去掉第一个字符,^(.)任意单字符开始,(.*)任意0到无穷字符,\2只显示第二个括号部分
二、grep(正则表达式及字符处理)
目标文件/etc/passwd,使用grep命令或egrep
1.显示出所有含有root的行:
2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的内容:
3. 显示出有多少行含有nologin。
4.显示出那些行含有root,并将行号一块输出。
5.新建用户
abominable
abominate
anomie
atomize
编写正则表达式,将他们匹配出来
(.除了换行符以外的任意单个字符)
删除用户:
或者使用userdel
6.建四个用户
Alex213sb
Wpq2222b
yH438PIG
egon666
egon
过滤出用户名组成是字母+数字+字母的行
7.显示出/etc目录下所有包含root的文件名
(-o显示)
8. 过滤掉/etc/ssh/sshd_config内所有注释和所有空行
作业三:Sed作业:以/etc/passwd文件为模板
1,删除文件每行的第一个字符。
sed -r 's/^(.)(.*)/\2/' etc/passwd
2,删除文件每行的第二个字符。
sed -r 's/^(.)(.)(.*)/\1\3/' /etc/passwd
3,删除文件每行的最后一个字符。
sed -r 's/(.*)(.)$/\1/' /etc/passwd
4,删除文件每行的倒数第二个字符。
sed -r 's/(.*)(.)(.)$/\1\3/' /etc/passwd
5,删除文件每行的第二个单词。
sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\1\2\4/' /etc/passwd
6,删除文件每行的倒数第二个单词。
sed -r 's/([a-Z]+)([^a-Z]+)([a-Z]+)$/\2\3/' /etc/passwd
7,删除文件每行的最后一个单词。
sed -r 's/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)$/\1\2\3/' /etc/passwd
8,交换每行的第一个字符和最后一个字符。
sed -r 's/^(.)(.*)(.)$/\3\2\1/' /etc/passwd
9,交换每行的第一个字符和第二个单词。
sed -r 's/^(.)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\4\2\3\1\5/' /etc/passwd
10,交换每行的第一个单词和最后一个单词。
sed -r 's/^([a-Z]+)([^a-Z]+)(.*)([^a-Z]+)([a-Z]+)$/\5\2\3\4\1/' /etc/passwd
11,删除一个文件中所有的数字。
sed -r 's/[0-9]//g' /etc/passwd
12,删除每行开头的所有空格。
sed -r 's/^ *//g' /etc/passwd
13,用制表符替换文件中出现的所有空格。
sed -r 's/ /\t/g' /etc/passwd
14,把所有大写字母用括号()括起来。
sed -r 's/[A-Z]/(&)/g' /etc/passwd
15,打印每行3次。
sed 'p;p' /etc/passwd
16,只显示每行的第一个单词。
sed -r 's/^([a-Z]+)([^a-Z]+)(.*)/\1/' /etc/passwd
17,打印每行的第一个单词和第三个单词。
sed -r 's/^([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)/\5\2\3\4\1\6/' /etc/passwd
18,用命令获取格式为 mm/yy/dd 的日期格式,结合管道,将其换成 mm;yy;dd格式