参考:
Linux三剑客(grep、awk、sed)超详细版
Linux三剑客
0. 小提示
若没有安装Linux虚拟机或者没有可以远程连接的Linux服务器,可以下载Git,使用Git Bash一样可以练习Linux命令。
1. grep命令
作用:在文件中提取和匹配符合条件的字符串行。
使用格式:grep [选项] '搜索内容' 文件名
选项:
-v:显示未匹配到的行
-i:忽略大小写
-n:显示匹配的行号
-c:统计匹配的行数
-o:仅显示匹配到的字符串,而非整行
-E:使用 ERE,相当于 egrep(扩展正则)
举例:
[veroll@localhost ~]$ cat test
root root hello root
new
new
root
root
leo
kate
hogwart
string
leon
# 显示含有 root 的行,并显示行号
[veroll@localhost ~]$ grep -n 'root' test
1:root root hello root
4:root
5:root
# 查找以 s 开头的行
[veroll@localhost ~]$ grep -n '^s' test
9:string
# 查找以 n 结尾的行
[veroll@localhost ~]$ grep -n 'n$' test
10:leon
# 查找以s开头的行或以n结尾的行(注意:扩展正则中才能使用|符号)
[veroll@localhost ~]$ grep -nE '^s|n$' test
9:string
10:leon
# 查找o字符恰好出现两次的行(注意:扩展正则中才能使用{}符号)
[veroll@localhost ~]$ grep -nE 'o{2}' test
1:root root hello root
4:root
5:root
2. sed命令
作用:用来将数据进行选取、替换、删除、新增。sed 是流编辑器,一次处理一行内容。
使用格式:sed [选项] '[动作]' 文件名
选项:
-e:允许对输入数据应用多条sed命令编辑
-f 脚本文件名:从sed脚本中读入sed操作
-i:用sed的修改结果直接修改读取数据的文件(危险操作)
-h:显示帮助
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选项,则只会把经过sed命令处理的行输出到屏幕
-r:在sed中支持扩展正则表达式
-V:显示版本信息
动作:
a \:追加, 在当前行后添加一行或多行,添加多行时,除最后一行外,每行末尾都需要用'\'代表数据未完结
c \:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾都需要用'\'代表数据未完结
d :删除,删除指定行
i \:插入,在当前行前插入一行或多行,插入多行时,除最后一行外,每行末尾都需要用'\'代表数据未完结
p:打印;sed -n '/root/p':只打印包含 root 的行;/***/中的内容表示正则匹配语法脚本
s :替换,sed -e '3s/old/new/g':将第三行中的old 替换为 new,g 代表全局替换;'/'可以换成 '#','@'等
举例:
[veroll@localhost ~]$ cat student
ID Name PHP Linux MySQL Average
1 Sally 82 95 86 87.66
2 Jerry 74 96 87 85.66
3 Tom 99 83 93 91.66
# 在第二行后插入数据
[veroll@localhost ~]$ sed '2a hello world' student
ID Name PHP Linux MySQL Average
1 Sally 82 95 86 87.66
hello world
2 Jerry 74 96 87 85.66
3 Tom 99 83 93 91.66
# 在第二行前插入数据
[veroll@localhost ~]$ sed '2i hello world' student
ID Name PHP Linux MySQL Average
hello world
1 Sally 82 95 86 87.66
2 Jerry 74 96 87 85.66
3 Tom 99 83 93 91.66
# 替换第二行的数据
[veroll@localhost ~]$ sed '2c hello world' student
ID Name PHP Linux MySQL Average
hello world
2 Jerry 74 96 87 85.66
3 Tom 99 83 93 91.66
# 删除第二行到第四行的数据
[veroll@localhost ~]$ sed '2,4d' student
ID Name PHP Linux MySQL Average
# 只打印出第二行的数据
[veroll@localhost ~]$ sed -n '2p' student
1 Sally 82 95 86 87.66
# 在第三行中,将字符串"Jerry"替换为"JJJJJ"
[veroll@localhost ~]$ sed '3s/Jerry/JJJJJ/g' student
ID Name PHP Linux MySQL Average
1 Sally 82 95 86 87.66
2 JJJJJ 74 96 87 85.66
3 Tom 99 83 93 91.66
3. awk命令
作用:把文件逐行读入,以空格为默认分割符,将每行切片,切开的部分再进行后续处理
使用格式:awk [选项] '/正则表达式/ 动作' [文件]
- pattern:正则表达式
- action:对匹配到的内容执行的命令(默认为输入每行内容)
常用选项及参数:
- -F: 设置输入域分隔符。e.g.
-F :
即设定冒号为域的分隔符。若不填写,默认空格为域分隔符。 - FILENAME:awk 浏览的文件名
- BEGIN:处理文本前要执行的操作
- END:处理文本后要执行的动作
- FS:设置输入域分割符,等价于命令行 -F 参数
- NF:浏览记录的域的个数(列数)
- NR:已读的记录数(行数)
- OFS:输出域分割符
- ORS:输入记录分割符
- RS:控制记录分割符
- $0:整条记录
- $n:表示当前行的第n个域(从1开始计数)
应用:
有一个passwd
文件如下所示,使用awk
命令对其进行操作
[veroll@MiWiFi-CR8809-srv ~]$ cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
搜索 passwd 文件中,包含 root 关键字的所有行,并将其整行打印
[veroll@MiWiFi-CR8809-srv ~]$ awk -F : '/root/{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
搜索 passwd 文件中,包含 root 关键字的所有行,并打印第七个域
[veroll@MiWiFi-CR8809-srv ~]$ awk -F : '/root/{print $7}' passwd
/bin/bash
搜索 passwd 文件中,第三个域的值等于0的所有行,并将其整行打印
[veroll@MiWiFi-CR8809-srv ~]$ awk -F : '$3==0{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
搜索passwd文件中,第七个域的值以login结尾的所有行,并将其整行打印(请使用正则表达式)
[veroll@MiWiFi-CR8809-srv ~]$ awk -F : '$7~/login$/{print $0}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
打印 passwd 文件第2行的信息
[veroll@MiWiFi-CR8809-srv ~]$ awk -F : 'NR==2{print $0}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
使用 BEGIN 加入标题
[veroll@MiWiFi-CR8809-srv ~]$ awk -F : 'BEGIN {print "开始"} {print $1 $2}' passwd | head -2
开始
rootx
自定义行分割符
[veroll@MiWiFi-CR8809-srv ~]$ echo "111 222|333 444|555 666" | awk 'BEGIN{RS="|"}{print $0}'
111 222
333 444
555 666