符号及正则表达式
特殊符号
模糊匹配
- *匹配所有 正则表达式中:重复前面一个字符(连续出现)0次或者多次
- ?匹配单个字符,有且只有一个
- [abcd]匹配里面任意一个字符
- [a-d]匹配连续的任意单个符号
- [!a-d]或者’[ ^1-9 ] 取反
路径位置
- ~用户家目录
- -上次的目录
- . 当前目录
- …上一级目录
引号相关
- ''单引号 引用字符串 所见即所得(就是你输入的是什么,打印输出就是什么)
- “ ”双引号 引用字符串 解析变量、命令
- `` 反引号 解析命令,与$()一样 将引号中的命令先执行,将执行结果交给引号外面的命令进行处理
其他字符
- ;分号 表示命令切割符
- ”# “管理员提示符 或为 注释符号
- xargs: 将信息进行分组显示
- $ 普通用户提示符 或为 调用变量使用
- | 管道符 前面的数据流交给后面来处理
- \ 转义符 让字符还原成相对应得命令
- {} 生成序列 或为 引用变量 让变量成为整体
- ! 1 取反 2 vim 强制 3调用历史命令使用
- & 后台进程符 将执行的命令放到后台进行
- && 并且 and前面的命令正确输出 后面的命令才会执行
- || 或者 or 前面错误的后面才会输出 判断前面命令是否执行成功
重定向
-
1> 标准输出重定向符号
-
2> 错误输出重定向符号
-
1>> 标准输出追加重定向符号
-
2>> 错误输出追加重定向符号
-
&> 正确和错误都重定向输出
-
< 标准输入重定向符号
-
<< 标准输入追加重定向符号
grep正则表达式
含义
正则表达式就是为处理大量的字符串及文本而定义的一套规则和方法。
例如 echo “n” 的结果为 我是张三
特点
正则表达式有如下几个特点:
- 为处理大量文本及字符串而定义的一套规则和方法
- 其工作时以行为单位进行,即一次处理一行
- 通过正则表达式可以将复杂的处理任务化繁为简,提高操作Linux的效率
- 仅被三剑客(grep/egrep、sed、awk)命令支持,其他命令无法使用
正则表达式的作用
Linux系统是大量带有字符串的内容,例如文本配置、程序、命令输出日志文件等,而我们经常会有迫切的需要,比如要从大量字符串内容查找符合需要的字符串,这就需要考正则表达式了。可以说正则表达式就是为了过滤出这些字符而产生的
正则表达式容易混淆的事项
正则表达式应用及其广泛,存在于各种语言,例如:python java 等,目前本章讲的是Linux中的正则表达式,即Linux正则表达式,应用grep/egrep、sed、awk。Linux三剑客想要工作高效,离不开正则表达式的配合。
正则表达式和之前的通配符、特殊字符是有本质区别,正则在Linux通过三剑客命令在文件(或数据流)中过滤内容。而通配符等是大部分普通命令都是支持的,它是用来查找文件或者目录,比如擦查找.txt结尾文件时,就是用*.txt来查找
正则表达式符号
- ^ 以什么开头的字符 例如 n^ 以n开头的行
- $ 以什么结尾的字符 例如 n$ 以n结尾的行
- *重复前面一个字符(连续出现)0次或者多次的行
- .* 等于普通字符下的* 所有
- ^.* 组合符,匹配任意多个字符开头的内容
- .*$ 组合符 以任意多个字符结尾的内容
- [abc]==[a-c] 匹配[]集合内的任意一个字符a或者b或者c;
- [^abc] 匹配不包含后的任意字符,也就是取反,正则不能用!来代替
[abc] (中括号)功能实践:
[abc]==[a-c] 匹配[]集合内的任意一个字符a或者b或者c;
常见的形式:
- [a-z]表示匹配所有单个小写字母
- [A-Z]表示匹配所有单个大写字母
- [0-9]表示匹配所有单个数字
- [a-zA-Z0-9]表示匹配所有数字和字母
测试题
1 过滤 /etc/passwd 中以nologin结尾的行
cat /etc/passwd | grep “nologin$”
2 过滤 /etc/passwd 中以o开头的行
cat /etc/passwd | grep “^o”
3过滤 /etc/passwd 中至少含有一个0 的行
cat /etc/passwd | grep “00*”
4过滤 /etc/passwd 中的空行
cat /etc/passwd | grep “^$”
5过滤/etc/目录中(不含子目录)下的所有文件
ls -l /etc | grep “^-”
6过滤/etc/services含有点号的行
cat /etc/passwd | grep " . "(引号里是转义符和.)
正则表达式分类
Linux三剑客的正则表达式分为两类:
-
基本正则表达式 对于的元字符 ^$.[]
-
扩展正则表达式 在基本正则表达式上增加了(){}?+|等字符
扩展正则表达式
符号
- +匹配前一个字符出现一次或多次 :和*区别,后者可以匹配0次
- [😕]+ 匹配括号内的:或者/字符1次或者多次
- ? 匹配前一个字符0次或者1次
- | 表示或者 ,可以同时过滤多个字符串 示例:cat /etc/passwd | egrep “00?|ava”
- () 分组过滤被括起来的东西为一个整体。另外()的内容可以被后面的\n引用,n为数字表示引用第几个括号的内容
- \n 引用前面()小括号里的内容,例如:(aa)\1 匹配aaaa
扩展 {}
-
a* 匹配前一个字符出现0次或多次
-
a+ 匹配前一个字符出现1次或者多次
-
a{n,m} 匹配前一个字符最少出现n次,最多出现m次
-
a{n,}匹配前一个字符最少出现n次
-
a{n} 匹配前一个字符正好出现n次
-
a{,m} 匹配前一个字符最多出现m次
扩展正则测试题
1 过滤/etc/passwd 中含有root或oldboy的行
egrep “root|oldbooy” /etc/passwd
2 过滤/etc/passwd 中至少含有1个0字符的行
egrep “0+” /etc/passwd
3 过滤/etc/passwd 中匹配o字符0次到1次的行
egrep “o?” /etc/passwd
4 过滤/etc/passwd 中匹配0字符1次到3次的行
egrep “0{1,3}” /etc/passwd
5 过滤/etc/passwd 中匹配含有连续多个冒号或斜线的行
egrep “[😕]+” /etc/passwd
元字符表达式
\b 匹配单词边界 例如 \bmaster\b 只匹配单词master
\B 匹配非单词的边界 例如 : matser\B匹配master123中的master 不会单独匹配单词的master
\w 匹配字母、数字与下划线
\W 匹配字母、数字与下划线以外的字符
\d 匹配单个数字字符,这个表达式需要使用 grep -P 才能识别
\D 匹配单个非数字字符 这个表达式需要使用 grep -P 才能识别
\s 匹配1位空白字符 这个表达式需要使用 grep -P 才能识别
\S 匹配以为非空白字符 这个表达式需要使用 grep -P 才能识别
grep总结
–color=auto 过滤的内容加色
-v 取反
-i 不区分大小写
-n 显示行号
-w 按单词为单位过滤
-o 只输出匹配的内容
-E 扩展正则 即egrep
-A 显示过滤的字符串和它之后的多少行
-B 显示过滤的字符串和它之前的多少行
-C 显示过滤的字符串和它之前之后的多少行
-P 用于过滤peri兼容正则表达式
sed正则表达式
sed作用
sed简称流编辑器
sed是操作、过滤和转换文本内容的强大工具。常用功能有对文件实现快速增删改查,其中查询的功能是最常用的其次是过滤和取行
取行和替换是核心
语法格式
sed [选项] [sed内置命令字符] [输入文件]
选项
-n 取消sed默认输出。常与sed内置命令的p连用
- 直接修改文件内容,而不是输出到终端
-e 允许多次编辑
-p 打印 通常与-n一起使用
-s 替换
-g全局
d删除
r 扩展正则
sed-字符替换
sed 并不会对原文件产生改动
sed 's/pattern/替换文本/g' inpuetfilename
s表示替换 g表示全局 意味着行中的所有pattern的都会被替换
/分隔符
例如将i.txt下的@替换成$
sed 's/@/$/g' i.txt
sed-删除行
删除空行
sed '/^$/d' i.txt
sed 管道过滤
将打印的x都过滤替换为y
echo xyz xyz | sed 's/x/y/g'
将i.txt下的空行都删除,并且将@替换为四个空行(tab)
sed '/^$/d' i.txt | sed -r 's/@/\t/g'
练习 :
取/etc/passwd 2-4行
sed -n ‘2,4p’ /etc/passwd
取第四行
sed -n ‘4p’ /etc/passwd
过滤出含有root字符串的行(用sed来做)
sed -n ‘/root/p’ /etc/passwd
grep 方法
grep root /etc/passwd
sed总结
-n 取消命令的默认输出
-i 直接修改文件内容 而不是输出到终端
sed 编辑器 :
s 替换
g 全局global
p 打印print
d 删除delete
a 追加append
i 插入
awk正则表达式
简述
awk是一种处理文件文本的语言,一个强大的文本分析工具
awk提供了机器强大的功能: 可以进行正则表达是的匹配,样式装入、流程控制、数学运算符、进程控制语句甚至于内置的变量和函数
awk工作模式
开始块(BEGIN)
开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次
一般情况下,我们可以在开始块中初始化一些变量
BFGIN是awk的关键字,因此它必须是大写的
主体块(BODY)
就是awk的命令
对于每一个输入的行都会执行以此主体部分的命令
默认情况下,对于输入的每一行,awk都会执行命令
但是,我们可以将其限定在指定的模式中
结束块(END)
结束块是程序结束时执行的代码,END也是awk的关键字,也必须大写
与开始块相似,结束块也是可选的
awk用法
awk [选项] ‘脚本命令’ 文件名
选项 | 含义 |
---|---|
-F fs | 指定以 fs 作为输入行的分隔符,awk 命令默认分隔符为空格或制表符。 |
-f file | 从脚本文件中读取 awk 脚本指令,以取代直接在命令行中输入指令。 |
-v var=val | 在执行处理过程之前,设置一个变量 var,并给其设备初始值为 val。 |
例如
打印i.txt的空行,空行显示输出Blank line
awk '/^$/ {print "Blank line"}' i.txt
打印i.txt的第三列和第四列 的数据
awk '{print $3,$4}' i.txt
打印i.txt的最后一列 的数据
awk -F',' '{print $NF}' i.txt
awk总结
-F 指定分隔符
$1 第一列 $2 第二列 以此类推
$0 整行
$NF最后一列
$(NF-1)倒数第二列
NR 引导