- 管道
- 正则表达式
- grep
- sed
- awk
管道,什么是管道?
Linux 提供管道符 “|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入
# 示例:
echo "hello world"|grep 'hello'
正则,什么是正则?
正则表达式就是记录文本规则的代码
常用的元字符
代码 | 说明 |
---|---|
. | 匹配出换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符的开始 |
$ | 匹配字符的结束 |
常用的限定符
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
练习题:
1、匹配以字母a开头的单词;
2、匹配刚好6个字符的单词;
3、匹配1个或多个连续的数字;
4、匹配5到12位的QQ号;
\ba\w*\b
\b\w{6}\b
\d+
^\d[1-9]{5,12}$
grep
根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行;
命令形式:
grep [OPTIONS] PATTERN[FILE]
- -v 显示不被pattern匹配到的行
- -i 忽略字符的大小写
- -n 显示匹配的行号
- -c 统计匹配的行数
- -o 仅显示匹配到的字符串
- -E 使用ERE,相当于egrep
实例展示
1、查找文件内容包含 False 的行数
grep -n 'False' log.log
2、查找文件内容不包含 False 的行
grep -nv 'False' log.log
3、查找以 t 开头的行
grep -n ^t grep_demo.txt
4、查找以 s 结尾的行
grep -n s$ grep_demo.txt
[root@VM_0_10_centos test_linux]# cat grep_demo.txt
root
admin
test
devops
root
admin
test01
java
log
java
web001
logs
data
ROOT
LOGS
TEST001
TEST002
[root@VM_0_10_centos test_linux]# grep -n s$ grep_demo.txt
4:devops
12:logs
[root@VM_0_10_centos test_linux]# grep -n -i ^t grep_demo.txt
3:test
7:test01
16:TEST001
17:TEST002
[root@VM_0_10_centos test_linux]# grep -c -i ^t grep_demo.txt
4
sed
sed 是流编辑器,一次处理一行内容
命令形式 :
sed [-hn] [-e<script>][-f<script文件>] 文本文件
命令解析
- -e
命令参数 | 命令示例 | 说明 |
---|---|---|
a: 新增(add) | sed -e ‘4 a newline’ | 在第4行后面新增一行; |
c: 取代 | sed -e ‘2,5c No 2-5 number’ | 用参数c后面的内容取代第2行到第5行的内容; |
d: 删除(delete) | sed -e ‘2,5d’ | 删除第2行到第5行的内容; |
i: 插入(insert) | sed -e ‘2 i newline’ | 在第2行前面插入(新增)一行 |
p: 打印 | sed -n ‘/root/p’ | 打印出文件中 root所在行的内容 |
s: 取代 | sed -e ‘s/old/new/g’ | 全局将 old 替换成 new(模式空间,不会修改源文件) |
替换
- 全局替换 (会将文件中匹配到的所有root替换成hello)
sed -e 's/root/hello/g' test.txt
- 直接修改文件内容
sed -i 's/root/hello/g' test.txt
awk
把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理
命令形式
awk 'pattern + action' [FILE]
常用参数 | 说明 |
---|---|
FILENAME | awk 浏览的文件名 |
BEGIN | 处理文本之前要执行的操作 |
END | 处理文本之后要执行的操作 |
FS | 设置输入域分隔符,等价于命令行 -F 选项 |
NF | 浏览记录的域的个数 (列数) |
NR | 已读的记录数(行数) |
OFS | 输出域分隔符 |
ORS | 输出记录分隔符 |
RS | 控制记录分隔符 |
$0 | 整条记录 |
$1 | 表示当前行的第一个域…依次类推 |
1、搜索 /etc/passwd 有root关键字的所有行,并显示对应的shell
awk -F : '/root/{print $7}' /etc/passwd
2、打印 /etc/passwd 的第二行信息
awk 'NR==2 {print $0}' /etc/passwd
3、使用 begin 加入标题
[root@VM_0_10_centos test_linux]# awk -F : 'BEGIN {print "BEGIN", "BEGIN"} /root/ {print $1, $2}' /etc/passwd
BEGIN BEGIN
root x
operator x
4、自定义分割符
[root@VM_0_10_centos test_linux]# echo "111 222|333 444|555 666"|awk 'BEGIN{RS="|"}{print $0}'
111 222
333 444
555 666