shell编程基础(二)
一、初识正则表达式
1. 基本语法
1.1 字符类
字符 | 含义 | 举例 |
---|---|---|
. | 匹配任意一个字符 | abc.可以匹配abcd、abc9 |
[] | 匹配括号中的任意一个字符 | [abc]d可以匹配ad、bd、或cd |
- | 在[]括号内表示字符范围 | [0-9a-fA-F]可以匹配一位十六进制数 |
^ | 位于[]括号内的开头,匹配括号中字符之外的任意字符 | [^xy]匹配出xy之外的其他字符,因此[ ^xy]1可以匹配a1、b1、但是不匹配x1、y1 |
[[:xxx:]] | grep工具预定义的一些命名字符类 | [[:alpha:]]匹配一个字母,[[:digit:]]匹配一个数字 |
1.2 数量限定符
字符 | 含义 | 举例 |
---|---|---|
? | 紧跟在它前面的单元应匹配零次或一次 | [0-9]?\ .[0-9]:匹配0.0、2.3等 |
+ | 紧跟在它前面的单元应匹配一次或多次 | [a-zA-Z0-9_.-]+@[a-zA-Z0-9 .-]+:匹配email地址 |
* | 紧跟在它前面的单元应匹配零次或多次 | [0-9] [0-9]*匹配至少一位数字 |
{N} | 紧跟在它前面的单元应精准匹配N次 | [1-9] [0-9]{2}:匹配从100到999的整数 |
{N,} | 紧跟在它前面的单元应匹配至少N次 | [1-9] [0-9]{2,}:匹配三位以上整数 |
{,M} | 紧跟在它前面的单元应匹配最多M次 | [0-9] {,1}相当于[0-9]? |
{N,M} | 紧跟在它前面的单元应匹配至少N次,最多M次 | [0-9] {1,3}\ .[0-9]{1,3}\ .[0-9] {1,3}\ .[0-9]{1,3}:匹配ip地址 |
1.3 位置限定符
字符 | 含义 | 举例 |
---|---|---|
^ | 匹配行首的位置 | ^Content匹配位于一行开头的Content |
$ | 匹配行末的位置 | :KaTeX parse error: Expected group after '^' at position 15: 匹配位于一行结尾的 : 号,^̲匹配空行 |
\ < | 匹配单词开头的位置 | \ <th匹配. . . this,但不匹配ethernet、tenth |
\ > | 匹配单词结尾的位置 | p\ >匹配leap. . .,但不匹配parent、sleepy |
\b | 匹配单词开头或结尾的位置 | \bat\b匹配. . . at . . .,但不匹配cat、atexit、batch |
\B | 匹配非单词开头和结尾的位置 | \Bat\B匹配battery,但不匹配. . . attend、hat . . . |
1.4 特殊字符
字符 | 含义 | 举例 |
---|---|---|
\ | 转义字符,普通字符转义为特殊字符,特殊字符转义为普通字符 | 普通字符<写成\ <表示单词开头的位置,特殊字符 . 写成\ . |
() | 将正则表达式的一部分组成一个单元,可以对整个单元使用数量限定符 | ([0-9] {1,3}\ .){3}[0-9]{1,3}匹配ip地址 |
| | 连接两个子表达式,表示或的关系 | n(o|rither)匹配no或neither |
2. Basic正则和Extended正则
Basic正则也有Extended的一些语法,只是字符?+{}|()应解释为普通字符,要表示这些字符的含义必须对其进行转义。如果用grep而不是egrep,并且没有加-E参数,则应该遵照Basic规范
二、grep命令
1. 概述
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并将匹配的行打印出来,全程称是Global Regular Expression Print,表示全局正则表达式版本,使用权限为所有用户。
grep家族包括egrep、和fgrep。egrep是grep的扩展,支持更多的re元字符,fgrep将所有字母都看作单词,也就是正则表达式中的元字符表示回其自身的字面意义,不再特殊。
2. 格式及参数
- grep [options]
- -c:只输出匹配行的计数
- -i:不区分大小写
- -h:查询多文件时不显示文件名
- -l:查询多文件时值输出包含匹配字符的文件名
- -n:显式匹配行和行号
- -s:不显示不存在或无匹配文本的错误信息
- -v:显式不包含匹配的所有行
- –color=auto:可以将找到的关键词部分加上颜色显式
三、find命令
-
find用于查找文件
-
-name:find ./ -name “init” find /目录位置 参数 “匹配项”
-
-size:find ./ -size +3M -size -7M
-
-type:-d/-f/-p/-l/-c/-b:查找指定类型的文件
-
-maxdepth:find ./ -maxdepth 2 -type d:指定搜索的层级
-
-exec:find ./ -maxdepth 2 -type d -size +2k -exec ls -l {} ;
-
-ok:find ./ -maxdepth 1 -type d -ok rm -rf {} ;
-
-xargs:将搜索到的结果集进行分批处理
-
-atime|ctime|mtime:天为单位—>a表示访问,c表示文件内容修改,m:表示文件属性修改
四、sed命令
sed为流编辑器(Stream Editor),在脚本中作为过滤器进行使用,即将前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出
- sed option ‘script’ file1 file2……
常用选项
-
-n,–queit,–silent:静默输出,默认情况下sed程序在所有脚本执行完会自动打印模式空间的内容,使用此参数可以进行屏蔽
-
-e script:允许多个脚本命令执行
-
-f script-file:从文件中读取脚本指令
-
-i,–in-place:直接修改源文件
-
a:追加
-
d:删除
-
替换
-
sed -i ‘s/[字符串]/-&-/’ [文件名]:&的含义为取地址,及它代表前面的字符串
五、awk
sed以行为单位处理文件,AWK既可以以行为单位也可以一列为单位。awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和tab键,但是行分隔符和列分隔符都可以自定义,可以将没一行若干字段以:分割,就可以重新定义awk的列分隔符为:,并以列为单位处理文件
- awk option ‘script’ file1 file2……
- awk option -f scriptfile file1 file2 ……
- awk ‘/^ *$/ {var=var+1} END {print var}’ [文件名]:统计文件中的所有空行
awk中预定义的变量
-
FILENAME:当前输入文件的文件名,该变量为只读
-
NR:当前行的行号,该变量为只读
-
NF:当前行所拥有的列数,该变量为只读
-
OFS:输出格式列分隔符,缺省为空格
-
FS:输出文件的列分隔符,缺省为连续空格和Tab
-
ORS:输出格式的行分隔符,缺省是换行符
-
RS:输出文件的行分隔符,缺省是换行
-
统计进程号大于7000小于8000
六、其他
- 其他内容可关注个人博客!不将就