Shell脚本3

一、正则表达式

REGEXP:Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符,正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等,主要用来匹配字符串(命令结果,文本内容),通配符匹配文件(而且是已存在的文件)。

1.1元字符

".":匹配任意单个字符,可以是一个汉字
"[]":匹配指定范围内的任意单个字符,示例:[zhou] [0-9] [] [a-zA-Z]
"[^]":匹配指定范围外的任意单个字符,示例:[^zhou] [^a.z] a.z

[:alnum:]:字母和数字
[:alpha:]:代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:]:小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:]:大写字母
[:blank:]:空白字符(空格和制表符)
[:space:]:包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围广
[:cntrl:]:不可打印的控制字符(退格、删除、警铃...)
[:digit:]:十进制数字
[:xdigit:]:十六进制数字
[:graph:]:可打印的非空白字符
[:print:]:可打印字符
[:punct:]:标点符号
\w:匹配单词构成部分,等价于[_[:alnum:]]
\W:匹配非单词构成部分,等价于[^_[:alnum:]]
\S:匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s:匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意
Unicode:正则表达式会匹配全角空格符

 

1.2表示次数

"*":匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
".*":任意长度的任意字符
"\?":匹配其前面的字符出现0次或1次,即:可有可无
"\+":匹配其前面的字符出现最少1次,即:肯定有且 >=1"\{n\}":匹配前面的字符n次
"\{m,n\}":匹配前面的字符至少m次,至多n次
"\{,n\}":匹配前面的字符至多n次,<=n
"\{n,\}":匹配前面的字符至少n次

 

1.3位置锚定

1 ^:行首锚定, 用于模式的最左侧
2 $:行尾锚定,用于模式的最右侧
3 ^PATTERN$:用于模式匹配整行 (单独一行  只有root)
4 ^$:空行
5 ^[[:space:]]*$:空白行
6 \< 或 \b:词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
7 \> 或 \b:词尾锚定,用于单词模式的右侧
8 \<PATTERN\>:匹配整个单词

1.4分组或者其它

1 分组:"()"将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
2 后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名。方式为: \1, \2, \3, ...,\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

1.5扩展正则表达式

1 表示次数:
2 *:匹配前面字符任意次
3 ?:0或1次
4 +:1次或多次
5 {n}:匹配n次
6 {m,n}:至少m,至多n次
7 {,n}:匹配前面的字符至多n次,<=n,n可以为0
8 {n,}:匹配前面的字符至少n次,<=n,n可以为0
1 表示分组:
2 分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
3 后向引用:\1, \2, ...
4 |:或者  
5 a|b:a或b
6 C|cat:C或cat
7 (C|c)at:Cat或cat

二、grep

grep [选项]… 查找条件 目标文件
-i:查找时忽略大小写
-v:反向查找,输出与查找条件不相符的行
-o:只显示匹配项
-f:对比两个文件的相同行
-c:匹配的行数([root@localhost ky15]# grep -c root passwd  2

三、sed

3.1基本用法

1 sed [option]... 'script;script;...' [input  file...]
2 参数解释:
3 [option]:选项         
4 'script':自身脚本语法         
5 [input  file...]:支持标准输入管道
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e:多点编辑
-f:从指定文件中读取编辑脚本
-r, -E:使用扩展正则表达式
-i.bak:备份文件并原处编辑
-s:将多个文件视为独立文件,而不是单个连续的长文件流

3.2sed脚本格式

基本用法:

1. 不给地址:对全文进行处理(比如行号)

2. 单地址:

  • #:指定的行,$:最后一行
  • /pattern/:被此处模式所能够匹配到的每一行

3. 地址范围:

  • #,#:从#行到第#行,3,6 从第3行到第6行
  • #,+#:从#行到+#行,3,+4 表示从3行到第7行
  • /pat1/,/pat2/:第一个正则表达式和第二个正则表达式之间的行
  • #,/pat/:从#号行为开始找到 pat为止
  • /pat/:找到#号个pat为止

4. 步进:~

  • 1~2 奇数行
  • 2~2 偶数行


命令:

  • p:打印当前模式空间内容,追加到默认输出之后
  • Ip:忽略大小写输出
  • d:删除模式空间匹配的行,并立即启用下一轮循环
  • a [\]text:在指定行后面追加文本,支持使用\n实现多行追加
  • i [\]text:在行前面插入文本
  • c [\]text:替换行为单行或多行文本
  • w file:保存模式匹配的行至指定文件
  • r file:读取指定文件的文本至模式空间中匹配到的行后
  • =:为模式空间中的行打印行号
  • !:模式空间中匹配行取反处理
  • q:结束或退出sed

3.3搜索替代

s/要替换的词/要替换成的词/:修饰符,查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g:行内全局替换
p:显示替换成功的行
w:/PATH/FILE 将替换成功的行保存至文件中
I,i:忽略大小写

四、awk

4.1基本用法

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段然后进行处理。AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

工作原理:
前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

格式:

awk [选项] ‘模式条件{操作}’ 文件1 文件2....
awk -f|-v 脚本文件 文件1 文件2.....

模式:
未指定表示 为空

/1/2/代表正则表达式

关系表达式

4.2awk常见的内置变量

  • FS :指定每行文本的字段分隔符,缺省为空格或制表位。与 “-F”作用相同 -v "FS=:"
  • NF:当前处理的行的字段个数
  • NR:当前处理的行的行号(序数)
  • $0:当前处理的行的整行内容
  • $n:当前处理行的第n个字段(第n列)
  • FILENAME:被处理的文件名
  • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n

4.3案例

(1)提取下面的字段中的 IP 地址和时间

(2)提取host.txt主机名后再放回host.txt文件

 (3)统计/etc/fstab文件中每个文件系统类型出现的次数

 (4)统计/etc/fstab文件中每个单词出现的次数

(5)提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字

 (6)提取主机名并放入原文件

posted @ 2022-12-23 17:02  崧蓝  阅读(79)  评论(0编辑  收藏  举报