正则表达式
正则表达式
正则表达式:匹配的是文章中的字符
通配符:匹配的是文件名 任意单个字符
元字符:不表示本来的含义,在正则表达式中有特殊含义的字符
正则 元字符的使用
自己写容易,读取别人的正则困难
1、记忆元字符的含义
2、多用
基本正则表达式
扩展正则表达式
. 单个任意字符
[] 单个字符
. 在[ ] 里 代表原来意思
[: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 正则表达式会匹配全角空格符
space 包括空格,制表符
[^] 匹配指定范围外的任意单个字符
* 代表前面的字符出现 [0到 正无穷 次] .* 任意长度的字符,不包括 0次 \? 0 或1次 可有可无 \+ 1次到正无穷次 \{4\} #前面 的字符出现四次 \{3,5\} #前面的字符出现3到5次
\{3,\} #前面的字符出现最少三次
\{,5\} #前面的字符出现最多5次

#提取IP地址,子网掩码和网关


^ #开头的行 $ #结尾的行 ^ [[:space:]] $ # 空白行 \b #字符串的开头 \< \b #字符产的结尾 \> ^PATTERN$ #用于模式匹配整行 (单独一行 只有root) ^$ #空行 ^[[:space:]]*$ # 空白行 \<PATTERN\> #匹配整个单词

分组 () 使括号将需要组合的字符 括起来
或者:\ |

过滤 IP地址,子网掩码和网关

grep -E egrep #默认使用基本正则表达式 表示次数 * 匹配前面字符任意次 ? 0或1次 + 1次或多次 {n} 匹配n次 {m,n} 至少m,至多n次 {,n} #匹配前面的字符至多n次,<=n,n可以为0 {n,} #匹配前面的字符至少n次,<=n,n可以为0 表示分组 () 分组 分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+ 后向引用:\1, \2, ... | 或者 a|b #a或b C|cat #C或cat (C|c)at #Cat或cat
练习操作
表示邮箱

表示qq号

表示手机号

grep
grep [选项] ... 查找条件 目标文件
-color=auto 对匹配到的文本着色显示 -m # 匹配#次后停止 grep -m 1 root /etc/passwd #多个匹配只取第一个 -v 显示不被pattern匹配到的行,即取反 grep -Ev '^[[:space:]]*#|^$' /etc/fstab -i 忽略字符大小写 -n 显示匹配的行号 -c 统计匹配的行数 grep -c root /etc/passwd #统计匹配到的行数 -o 仅显示匹配到的字符串 -q 静默模式,不输出任何信息 -A # after, 后 ?行 grep -A3 root /etc/passwd #匹配到的行后3行业显示出来 -B # before, 前 ?行 -C # context, 前后各 ?行 -e 实现多个选项间的逻辑or关系,如:grep –e ‘cat ' -e ‘dog' file grep -e root -e bash /etc/passwd #包含root或者包含bash 的行 grep -E root|bash /etc/passwd -w 匹配整个单词 grep -w root /etc/passwd useradd rooter -E 使用ERE,相当于egrep -F 不支持正则表达式,相当于fgrep -f file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件 -r 递归目录,但不处理软链接 开始搜索目录 -R 递归目录,但处理软链接

#过滤b开头

#过滤出以/结尾的

#过滤出非空行
AWK
程序语言
awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自
由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK
AWK:原先来源于 AT & T 实验室的的AWK NAWK:New awk,AT & T 实验室的AWK的升级版 GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容 GNU AWK 用户手册文档 https://www.gnu.org/software/gawk/manual/gawk.html gawk:模式扫描和处理语言,可以实现下面功能 vim: 是将整个文件加载到内存中 再进行编辑, 受限你的内存 awk(语言): 读取一行处理一行
工作原理
awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。
区别
awk 文本处理工具
1
3
4
....
有n行
加载一行处理一行
vim 文本处理工具 内存不足打不开超级大的文件
把整个文件加载到内存中处理,如果内存不够大,无法打开处理文件
选项
-F #指定分割符 -v #指定变量
表达式:awk 的语言的表达式
1、不写没有
2、找到特定的行
处理动作:
print 打印
printf 打印 (控制长宽高)
$0 :全文
$1 :第一列
$2 :第二列
awk '{print $1}'
awk 内置变量 和 shell 环境中的变量会有冲突 '{ }' (单引号)
awk'{print $2}'
以空格为分隔符 取第二列
awk -F: '{print $n}' 以冒号为分割符 取第n列
满足我的表达式留下来,不满足的从哪来回哪去
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
/regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

不支持使用行号,但是可以使用变量NR 间接指定行号加上比较操作符 或者逻辑关系 比较操作符: ==, !=, >, >=, <, <= #####逻辑 与:&&,并且关系 或:||,或者关系 非:!,取反


#过滤出第三行
awk数组特性 - awk的数组是关联数组(即key/value方式的hash数据结构),索引下标可为数值(甚至是负数、小数等),也可为字符串
1. 在内部,awk数组的索引全都是字符串,即使是数值索引在使用时内部也会转换成字
2. awk的数组元素的顺序和元素插入时的顺序很可能是不相同的 - awk数组支持数组的数组
awk提供了 length() 函数来获取数组的元素个数,它也可以用于获取字符串的字符数量。还可以获取数值转换成字符串后的字符数量。


# length(a) length(数组名) 可以查看数组长度
算数操作符
x+y,x-y,x*y ,x/y, x^y ,x%y -x: 转换为负数 +x:将字符串转换为数值 比较操作符 ==,!=,>,<=,<,<= #### 逻辑 与:&&,并且关系 或:||,或者关系 非:!,取反

实验题加面试题
一

#每处理一行 打一个ok

#处理之前打个ok


#处理之后打个ok
二


#以:为分隔符 提取粗第一列和第三列
三


内置变量
awk 选项 '模式{print }'
- FS :指定每行文本的字段分隔符,缺省为空格或制表符(tab)。与 “-F”作用相同 -v "FS=:" - OFS:输出时的分隔符 - NF:当前处理的行的字段个数 - NR:当前处理的行的行号(序数) - $0:当前处理的行的整行内容 - $n:当前处理行的第n个字段(第n列) - FILENAME:被处理的文件名 - RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
一、
① 过滤出/etc/passwd 第一列

②

# -v 指定变量
二、
NF: 字段的个数 倒数第一列 $NF 倒是第二列 $(NF-1)

#过滤出倒数第二列。 NF=6 ,最后一列,过滤出倒数第二列,也就是第五列。NF-1 (以空格和%和为分隔符)

#过滤出第三列
三、

#显示处理的文件名
四、取10里大于5小于10的数

五、取etc/passwd中第三列大于1000的

#指定:为分隔符
六、提取opt下99文件里18:11到18:14的文件

七、
1为真

#n不知道 初始值0,0为假 第一行不打印,n+1=1 ,1为真第二行开始打印

# !取反 n初始值为0,0取反为1,所以打印第一行。1+1=2,为真取反为0,第二行不打印。0+1=1,为真,取反为0.所以第三行不答应.... 所以只打印第三行。

#只打奇数行。 i初始值为0,取反为1.1为真第一行打印。到第二行1取反为0.0为假所以第二行不打印。

#只打印偶数行。i初始值为0,0取反为1,1为真,1又取反为0.0为假是所以第一行不打印。 i=1,取反为0,外面还有个!又取反为1.所以打印第二行。

#只打印偶数行,给i赋个值。令i=1
八、
awk 支持for while 循环


九 、去重

abd 初始值为0 假 取反 为真 1 打印 加一 为2
hiuu 初始值为0 假 取反 为真 1 打印 加一 为2
abd 为真 值为2 取反 0 假 不打印 加一 为1 真
十、过滤 永久挂载文件下的文件系统

十一、过滤出/etc/fstab 中有多少真正的单词


[[:alpha:]] =[a-zA-Z]
十二、过滤出磁盘已用的一列,去除%号

十三、提取字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中所有的数字

十四、提取test.txt 文件中的主机名



十五、查出/tmp/的权限,以数字方式显示

十六、查出用户uid最大值的用户名,UID及shell类型


浙公网安备 33010602011771号