- 管道
- 正则表达式
- grep
- sed
- awk
1 管道
1.1 什么是管道?
Linux 提供管道符"|"将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入
echo "hello1234" | grep 'hello'
2 正则表达式
正则表达式就是记录文本规则的代码
举例
- 找出所有的 hi 单词 \bhi\b
- hi 单词后面有 lucy 单词 \bhi\b.*\blucy\b
- 以 0 开头,然后是两个数字,然后是一个连字号"-",最后是8个数字 0\d{2}-\d{8}
2.1 常用的元字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
2.2 常用的限定符
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复 n 次 |
{n,} | 重复 n 次或更多次 |
{n,m} | 重复 n 到 m 次 |
实战
- 匹配以字母 a 开头的单词----- \ba\w*\b
- 匹配刚好 6 个字符的单词-----\b\w{6}\b
- 匹配 1 个或更多连续的数字-----\d+
- 5 位到 12 位 QQ 号-----\d{5,12}
3 grep
3.1 定义
根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行
3.2 命令形式
grep [OPTIONS] PATTERN [FILE...]
3.3 选项
- -v 显示不被 pattern 匹配到的行
- -i 忽略字符大小写
- -n 显示匹配的行号
- -c 统计匹配的行数
- -o 仅显示匹配到的字符串
- -E 使用 ERE,相当于 egrep
实战
- 查找文件内容包含 root 的行数
- grep -n root test.txt
- 查找文内容不包含 root 的行
- grep -nv root test.txt
- 查找以 s 开头的行
- grep ^s test.txt
- 查找以 n 结尾的行
- grep n$ test.txt
4 sed
4.1 定义
sed 是流编辑器,一次处理一行内容
4.2 命令形式
sed [-hn..][-e<script>][-f<script FILE>][FILE]
- sed [-hn..][-e<script>][-f<script文件>][文本文件]
- -h 显示帮助。
- -n 仅显示 script 处理后的结果。
- -e<script> 以选项中指定的 script 来处理输入的文本文件。
- -f<script文件> 以选项中指定的 script 文件来处理输入的文本文件。
4.3 常用动作
- a:新增 sed -e '4 a newline'
- c:取代 sed -e '2,5c No 2-5 number'
- d:删除 sed -e '2,5d'
- i: 插入 sed -e '2i newline'
- p:打印 sed -n '/root/p'
- s:取代 sed -e 's/old/new/g'
实战
- 查看帮助
- man sed
- sed -h
- 在第四行后添加新字符串
- sed -e '4 a newline testfile' test.txt
- 在第二行后加上 newLine
- sed '2a drink tea' test.txt
- 在第二行前加上 newline
- sed '2i drink tea' test.txt
- 全局替换
- sed -e 's/root/hello/g' test.txt
- 直接修改文件内容
- sed -i 's/root/hello/g' test.txt
5 awk
5.1 定义
把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理
5.2 命令形式
awk 'pattern + action' [FILE]
5.3 命令解析
- awk 'pattern + action' [filenames]
- -pattern 正则表达式
- -action 对匹配到的内容执行的命令(默认为输入每行内容)
5.4 常用参数
- FILENAME awk 浏览的文件名
- BEGIN 处理文本之前要执行的操作
- END 处理文本之后要执行的操作
- FS 设置输入域分隔符,等价于命令行 -F 选项
- NF 浏览记录的域的个数(列数)
- NR 已读的记录数(行数)
- OFS 输出域分隔符
- ORS 输出记录分隔符
- RS 控制记录分隔符
- $0 整条记录
- $1 表示当前行的第一个域......以此类推
实战
- 搜索 /etc/passwd 有root 关键字的所有行,并显示对应的 shell
- awk -F : '/root/ {print $7}' /etc/passwd
- 打印 /etc/passwd 的第二行信息
- awk -F :'NNR==2{print $0}' /etc/passwd
- 使用 begin 加入标题
- awk 'BEGIN {print "BEGIN","BEGIN"}{print $1,$2}' /etc/passwd
- 自定义分隔符
- echo "111 222|333 444|555 666" | awk 'BEGIN{RS="|"}{print $0}'