Linux三剑客(grep, sed, awk)

参考:
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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吮指原味张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值