正则表达式概述
元字符:描述字符的字符,它用于对字符表达式的内容、转换及各种操 作信息描述
正则表达式:是由一系列字符和元字符构成的字符串,简称 RE(Regular Expression),它的主要功能是文本查询和字符串操作,它 可以匹配文本的一个字符或字符集合。
实际上,正则表达式完成了数据的过滤,将不符合正则表达的数据拒绝, 留下符合的
基本正则表达式元字符集合及其意义
特殊字符集:[[:digit:]]代表数字 [[:lower:]]小写字母 [[:upper:]]大写字母 [[:alpha:]] 代表字母[[:alnum:]] 代表数字和字母[[:space:]]代表空格
\?:匹配前面字符串0次或者1次,即可有可无(扩展)
\+:匹配前面的字符至少1次(扩展)
^PATTERN$:用于匹配整行
^$:空行
\<:词首锚定,用于单词模式的左侧
\>:词尾锚定,用于单词模式的右侧
\<PATTERN\>:匹配整个单词
( ) 表示一个字符集合或用在expr中
| 表示“或‘’,匹配一组可选的字符
"()"符号和“|”符号 "()"符号和“|”符号通常结合使用,表示一组可选字符 的集合。
re(a|b|c)d 等价于 re[abc]d
"|"符号也可以表示多个正则表达式的“或”关系
grep -E “zha?ng|zhi”(|的两边作为一个整体)
分组:\(xy\):将xy作为一组(扩展)
后向引用:引用前面的分组括号中的模式所匹配的字符,使用\1,\2,\3
\1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配的字符
\(ab\+\(xy\)*\)* \1:ab\+\(xy\)* \2:xy
特殊:在通配符中*的意思为匹配任意多个字符 ?的意思为匹配任意一个字符
Bash shell本身不支持正则表达式,使用正则表达式的是 shell命令和工具,如grep,sed,awk等。
dd命令创建一个具有特定大小的文件
dd if=/dev/zero of=./test.txt bs=1k count=1 创建一个大小为1k的文件
grep与正则表达式
sed与正则表达式
sed概述:
sed 是一种在线编辑器,它一次处理一行内容。处理时, 把当前处理的行存储在临时缓冲区中,称为“模式空间” (pattern space),接着用sed命令处理缓冲区中的内容, 处理完成后,把缓冲区的内容送往屏幕。接着处理下一行, 这样不断重复,直到文件末尾。
语法格式:
sed [options] 'addressCommand' file ...
option:
- -n:不再默认显示模式空间中的内容
- -i:直接修改原文件
- -e SCRIPT -e SCRIPT:可以同时执行多个脚本
- -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
- -r∶sed 的动作支持的是延伸型正规表示法的语法。(预设是基础正规表 示法语法)
address:定址
- StartLine,EndLine-->1,100
- /RegExp/-->/^root/
- /Pattern1/,/Pattern2/:第一次被Pattern1开始至第一次被Pattern2匹配到的行结束
- LineNumber:指定的行
- StartLine,+N-->从StartLine开始,向后N行
command:
- d:删除符合条件的行
- p:显示符合条件的行
- a \"String":在指定的行后追加新行,内容为String
- i:\"String":在指定的行前面追加新行,内容为String
- r FIle:将指定的文件的内容添加至符合条件的行处
- w FIle:将指定范围内的内容另存至指定的文件中
- s/pattern/string/修饰符:查找并替换 (g:全局替换 i:忽略字符大小写 &:引用匹配到的串)
awk与正则表达式
awk [option] 'program' file ...
-F:指明输入时用到的字段分隔符 (默认空格)
-v: var=value:自定义变量
实例
tail -n 5 /etc/profile | awk '{print $2,$5}'
df -h | awk -F % '/^\/dev/{print $1}'|awk '{if($NF>=20) print $1}'
print
print item1,item2, ...
要点:
1.用逗号进行分开;
2.在awk中如果想着进行变量替换,一般不要放到双引号中
3.item可以省略,省略的意思是print $0,显示整行
内置变量
NF:字段数量,print NF和print $NF(最后一个字段)的区别,在awk引用内部变量无需加$
NR:显示当前行的行数
FNR:各文件分别计数,awk '{print FNR}' /etc/fstab /etc/issue
printf
格式化输出:printf FORMAT, item1,item2,....
1、FORMAT必须给出来 (输出是的格式控制)
2、printf不会自动换行,需要显示给出换行控制符\n
3、FORMAT需要分别为后面的每个item指定一个格式化符号
%c:显示ASCII码
%d:显示十进制证书
%e:科学计数法
%f:浮点数
%s:显示字符串
awk -F : '{printf "username:%s\n",$1}' /etc/passwd
awk -F: '{printf "username:%s\n uid:%d\n",$1,$3}' /etc/passwd
%u:显示无符号整数
%%:显示%自身
4、第一个数字控制显示的宽度,第二个#表示小数点后面的精度(%3.1f),默认右对齐,-号为左对齐,+为显示字符的符号
awk -F : '{printf "username:%-15s uid:%d\n",$1,$3}' /etc/passwd
内置函数
rand():0到1之间的随机数
length():字符串长度
split (string, array, field separator)
-b:指定分割后的每个文件的大小
-d:使用数字作为后缀
-a length:制定后缀的长度
-l num:按照行进行分割
PREFIX:指定分割后的文件的前缀,写在所有选项的最后
- awk的内建函数split允许你把一个字符串分隔为单词并存储在数组中。你可以自己定义域分隔符或者使用现在FS(域分隔符)的值
- split (string, array) -->如果第三个参数没有提供,awk就默认使用当前FS值
-
time="12:34:56" out=`echo $time | awk '{split($0,a,":");print a[1],a[2],a[3]}'` echo $out
substr 截取字符串
substr(s,p) 返回字符串s中从p开始的后缀部分
substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
echo "123" | awk '{print substr($0,1,1)}'
流程控制语句
在linux awk的while、do-while和for语句中允许使用 break,continue语句来控制流程走向,也允许使用exit这样的 语句来退出。break中断当前正在执行的循环并跳到循环外执行下一条语句。if 是流程选择用法。awk中,流程控制语句,语法结构,与c语言类型。有了这些语句,其实很多shell程序 都可以交给awk,而且性能是非常快的。
条件判断语句
循环语句
根据扩展名切割文件名
${VAR%.*} 非贪婪模式 ${VAR%%.*} 贪婪模式
通配符从右向左进行匹配
例: VAR="hack.fun.book.txt"
echo ${VAR%.*} hack.fun.book 非贪婪模式(从右向左截,只截走第一个)
echo ${VAR%%.*} hack 贪婪模式(从右向左截,只留下一个)
${VAR#*.} 非贪婪模式 ${VAR##*.} 贪婪模式
从左到右进行匹配
例:VAR="hack.fun.book.txt"
echo ${VAR#*.} fun.book.txt 非贪婪模式(从左向右截,只截走第一个)
echo ${VAR##*.} txt 贪婪模式(从左向右截,只留下一个)