Shell正则
- 正则表达式是为处理大量的字符串而定义的一套规则和方法,通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串;
- 最常 应用正则表达式 的命令有
grep
,sed
,awk
基础的正则表达式
-
^word
:匹配以word开头的内容;
-
word$
:匹配以word结尾的内容;
-
^$
:表示空行;
-
.
:表示且只能代表任意一个字符;
-
\
:转义字符即让字符原有的含义失效;
-
*
:
-
.*
:匹配所有字符;
-
[abc]
:匹配含有abc的任意字符;
-
[^abc]
:匹配不含邮abc的任意字符;
-
[a-z]
:匹配包含小写字母;
-
[A-Z]
:匹配包含大写字母;
-
[a-Z]
:匹配包含所有字母;
-
(www|888)
:匹配包含字符串www或888的字符;
-
(a+)
:匹配字符a出现一次或多次的字符;
-
ab(c|d)
:匹配包含字符串abc或abd的字符;
-
[[:digit:]]
:匹配包含数字的字符;
-
[[:lower:]]
:匹配包含小写字母的字符;
-
[[:upper:]]
:匹配包含大写字母的字符;
-
[[:alpha:]]
:匹配包含所有字
母的字符;
grep
- 下面创建一个文本文件
test.txt
,使用grep
命令来测试上面的正则表达式,文本内容如下:
I am liyanyan teacher!!
I teach Linux.
test
I like basketball sdasdasdfgd!
my jianshu is sdasdsfds.com
our site is fdsfgdsfd.com
my qq is 114335fdsfsda.
note 34710233454.
grep参数选项
-
grep -o
:只打印出匹配到的字符;
-
grep -E
:支持扩展元字符,即转义字符;
-
grep --color=auto 'root' /etc/passwd
: --color=auto匹配的目标文本有颜色显示;
- 利用
别名alias
可以将grep --color=auto
配置到系统的配置文件/etc/bashrc
中去,这样就不用每次都输入了,找到/etc/bashrc
文件然后利用sublime
打开,在最后输入alias grep='grep --color=auto'
,保存需要输入密码,获取修改此系统文件的权限,如下所示:
- 终端再来执行
grep 'root' /etc/passwd
,结果如下:
-
grep -n 'root' /etc/passwd
:打印行 包含root
,有行号,默认区分大小写,-n
表示打印行号;
-
grep -n -i 'root' /etc/passwd
:打印行 包含root
,有行号,不区分大小写,-i
表示不区分大小写;
-
grep -n -i '^root' passwd
: 打印行 包含root
,有行号,以root
开头;
-
grep -n -i -v '^root' passwd
:打印行 包含root
,有行号,不区分大小写,不以root
开头,-v
表示取反;
-
grep -n -B 3 '^_svn' /etc/passwd
:打印行 有行号,以_svn
开头的前面3行,-B 3
表示目标行的前面三行;
-
grep -n -A 3 '^_svn' /etc/passwd
:打印行 有行号,以_svn
开头的后面3行,-A 3
表示目标行的后面三行;
-
grep -n -C 3 '^_svn' /etc/passwd
:打印行 有行号,以_svn
开头的前面三行与后面3行,-C 3
表示目标行的前面3行与后面3行;
-
grep -w 'macOS' /etc/passwd
:打印行 包含macOS
字符,-w
表示按照指定字符搜索;
grep+正则表达式
-
grep "^m" test.txt
:过滤以m
开头的行,会将过滤行打印出来,如下所示:
-
grep "m$" test.txt
:过滤以m
结尾的行,会将过滤行打印出来,如下所示:
-
grep -vn "^$" test.txt
:将空行排除掉,然后打印出其他内容,且打印出行号,如下所示:
-
grep "." test.txt
:匹配任意字符,不包括空行,如下所示:
-
grep ".*" test.txt
:匹配任意字符,包括空行,如下所示:
-
grep "\.$" test.txt
:匹配以点结尾的所有行,如下所示:
-
grep "[abc]" test.txt
:匹配包含abc的所有行,如下所示:
-
grep "[0-9]" test.txt
:匹配包含0-9的所有行,如下所示:
-
grep "[a-z]" test.txt
:匹配包含所有小写字母;
-
grep "[A-Z]" test.txt
:匹配包含所有大写字母;
-
grep "[^a-z]" test.txt
:匹配去除小写字母的其他所有字符;
-
grep "^[a-z]" test.txt
:匹配以小写字母开头的内容;
-
grep "3\{2\}" test.txt
:匹配字符3 重复出现2次;
-
grep -E "3{2}" test.txt
:匹配字符3 重复出现2次,有参数E,无需转义字符;
-
grep -E "3{1,3}" test.txt
:匹配字符3 重复出现1-3次;
-
grep -E "3{1,}" test.txt
:匹配字符3,重复出现1次或1次以上;
-
grep -E "(com)" test.txt
:匹配字符串com的字符,如下:
-
grep -E "(a+)" test.txt
:匹配字符a,出现一次或者多次的字符,如下所示:
-
grep "[[:digit:]]" test.txt
:匹配包含数字的字符,如下:
sed
- sed是一个流编辑器,非交互的编辑器,它一次处理一行内容;处理时将当前处理的行存储在临时缓冲区中,也称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区中的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾,文件内容并没有改变,除非你使用重定向存储输出;
- sed主要用来自动编辑一个或者多个文件,简化对文件的反复操作,编写转换程序等;
sed命令
- sed [options] 'command' file
- sed与grep不一样,不管是否找到指定的模式,退出状态都是0,只有当命令存在语法错误时,sed的退出状态才是非0;
-
a
:在当前行添加一行或多行;
-
c
:用新文本修改(替换)当前行中的文本;
-
d
:删除行;
-
i
:在当前行之前插入文本;
-
l
:列出非打印字符;
-
p
:打印匹配到的内容;
-
n
:读入下一输入行,并从下一条命令而不是第一条命令开始对其处理;
-
!
:对所选行以外的所有行应用命令;
sed参数选项
-
sed -n
:取消默认的输出;
-
sed -i
:直接修改对应的文件;
-
sed -r
:支持扩展元字符,即转义字符;
应用
-
sed -n 'halt/p' test.txt
:打印匹配halt的行;
-
sed -n '2p' test.txt
:打印第二行;
-
sed -n '$p' test.txt
:打印最后一行;
awk
- awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母;
- awk适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上;
- 通常,awk是
以文件的每一行 为处理单位的
;awk每接收文件的一行,然后执行相应的命令,来处理文本;
awk参数
-
awk -F":" '{ print $1 }' hello.txt
:-F参数用来指定分隔符 :
awk命令
-
awk -F":" '{ print $1 }' hello.txt
:其中print
为打印命令,读取hello.txt文件中的内容,遍历每一行以分隔符:
隔开,然后打印每一行的第一个分隔字符串;
awk的内置命令
-
NF
:每一行经过分隔符切割之后获取的 字段的个数;
-
NR
:文件的行数;