以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~
grep、awk、sed 都是 Linux 命令行工具,通常用于处理文本数据,俗称“Linux 三剑客“。
正文详细整理了 grep、awk、sed 常见用法,附录还汇总“三剑客”常用的正则表达式,日常工作中处理文本数据看这一篇够用啦!
一、grep 命令
1、适用场景
grep 命令擅长在文本文件中搜索指定的模式,常用于查找文本中匹配的内容。
2、基本格式
代码语言:javascript复制grep <选项> "模式" 文件名
3、常用选项
代码语言:javascript复制-A n # 显示匹配到的「后n行」
-B n # 显示匹配到的「前n行」
-C n # 显示匹配到的「前n行」和「后n行」
-c # 统计匹配的行数(⚠️ 不是匹配到的个数)
-E # 支持扩展正则匹配
-f # 从文件获取匹配规则
-i # 忽略大小写
-l # 只显示文件名
-n # 显示行号
-q # 静默,不打印结果
-r # 递归
-v # 反选,过滤内容
-w # 匹配完整单词
-z # 匹配完整行
4、使用示例
- 从文本文件中查找只包含abc的行
grep "abc" demo.txt
- 从文本文件中查找同时包含abc、def的行
grep -E "abc|def" demo.txt
- 从文本文件中查找空行以外内容
grep -v "^$" demo.txt # 这里的 ^$ 是正则表达式,后边会具体讲
- 在当前目录(不包含子目录)中查找包含abc的文本文件
grep -l "abc" *
- 在当前目录(包含子目录)中查找包含abc的文本文件
grep -rl "abc" * # -r 会递归查找子目录
二、awk 命令
1、适用场景
awk 命令擅长对文本的列进行复杂处理,格式化输出文本内容。
2、基本格式
代码语言:javascript复制awk <选项> '{指令}' 文件名
3、基本概念
代码语言:javascript复制NR # 当前行的「行号」
NF # 当前行的「列数(字段个数)」
$0 # 当前行的文本内容,"{print} 等价于 {print $0}"
$1 # 当前行、第一个字段的文本内容
$2 # 当前行、第二个字段的文本内容
$(NF-1) # 当前行、倒数第二个字段的文本内容
$NF # 当前行、倒数第一个字段的文本内容
----------------------------------------------------
$1 $2/$(NF-1) $3/$NF
▼ ▼ ▼
┌──────┬──────────────┬───────┐
$0/NR ▶ │ ID │ NAME │ AGE │
├──────┼──────────────┼───────┤
$0/NR ▶ │ 1 │ Tommy │ 23 │
├──────┼──────────────┼───────┤
$0/NR ▶ │ 2 │ Jerry │ 25 │
└──────┴──────────────┴───────┘
4、常用选项
代码语言:javascript复制-F # 指定分割符
5、使用示例
- 打印行内容
# 打印 2 ~ 4 行
awk 'NR>1, NR<5' demo.txt
awk 'NR==2,NR==4' demo.txt
----------------------------------------------------
# 匹配所有包含 root 的行,并打印
awk '/root/' demo.txt
----------------------------------------------------
# 匹配所有不包含 root 的行,并打印
awk '!/root/' demo.txt
----------------------------------------------------
# 匹配所有以 root 开头的行,并打印
awk '/^root/' demo.txt
- 打印列内容
# 以 : 为分隔符,打印所有行的第二列
awk -F ':' '{print $2}' demo.txt
----------------------------------------------------
# 匹配所有以 root 开头的行,并打印第二列
awk '/^root/{print $2}' demo.txt
----------------------------------------------------
# 匹配所有以 C或E 开头的行,并打印第二列
awk '/^[CE]/{print $2}' demo.txt
----------------------------------------------------
# 匹配所有不包含 C和E 的行,并打印第二列
awk '/[^CE]/{print $2}' demo.txt
----------------------------------------------------
# 匹配所有长度为 4 的第二列字段,并打印第五列
awk '(length($2)==4) {print $5}' demo.txt # ( )可省略
awk '{if(length($2)==4) print $5}' demo.txt
----------------------------------------------------
# 匹配所有第二列等于 Tommy 的行,并打印第五列
awk '($2==Tommy) {print $5}' demo.txt # ( )可省略
----------------------------------------------------
# 匹配所有第二列包含 Tom 的行,并打印第五列
awk '($2~Tom) {print $5}' demo.txt # ( )可省略
----------------------------------------------------
# 匹配所有第二列大于 30 的行,并打印第五列
awk '($2>30) {print $5}' demo.txt # ( )可省略
- 高阶命令
# BEGIN 块:在开始时执行打印
awk 'BEGIN {print "- head -"} {print $2}' demo.txt
----------------------------------------------------
# END 块:在结束时执行打印
awk '{print $2} END {print "- tail -"}' demo.txt
----------------------------------------------------
# 在打印中自定义字符串
awk '{print $1 "------" $2}' demo.txt
----------------------------------------------------
# 带行号打印第二列
awk '{print NR,$2}' demo.txt
----------------------------------------------------
# 第一列替换为行号,并打印
awk '{$1=NR;print}' demo.txt
- 使用内置函数
# substr:截取字符
awk '{print substr($2,1,3)}' demo.txt
----------------------------------------------------
# length:获取长度
awk '{print length($2)}' demo.txt
----------------------------------------------------
# toupper:将小写字符转换成大写字符
awk '{print toupper($2)}' demo.txt
----------------------------------------------------
# tolower:将大写字符转换成小写字符
awk '{print tolower($2)}' demo.txt
三、sed 命令
1、适用场景
sed 命令擅长处理文本内容,如插入、删除、替换、查找等。
2、基本格式
代码语言:javascript复制sed <选项> "模式" 文件名 # sed 即流编辑器
3、常用选项
代码语言:javascript复制-e # 多点编辑
-i # 编辑文件,i.bak 表示编辑的同时生成备份文件
-n # 仅显示经过编辑的行
-r # 支持扩展正则匹配
# 使用技巧