前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Linux】三剑客 grep、awk、sed 常见用法

【Linux】三剑客 grep、awk、sed 常见用法

作者头像
行者Sun
发布2024-09-02 11:54:56
4400
发布2024-09-02 11:54:56
举报
文章被收录于专栏:Linux

以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~

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的行
代码语言:javascript
复制
grep "abc" demo.txt
  • 从文本文件中查找同时包含abc、def的行
代码语言:javascript
复制
grep -E "abc|def" demo.txt
  • 从文本文件中查找空行以外内容
代码语言:javascript
复制
grep -v "^$" demo.txt    # 这里的 ^$ 是正则表达式,后边会具体讲
  • 在当前目录(不包含子目录)中查找包含abc的文本文件
代码语言:javascript
复制
grep -l "abc" *
  • 在当前目录(包含子目录)中查找包含abc的文本文件
代码语言:javascript
复制
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、使用示例

  • 打印行内容
代码语言:javascript
复制
# 打印 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
  • 打印列内容
代码语言:javascript
复制
# 以 : 为分隔符,打印所有行的第二列
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            # ( )可省略
  • 高阶命令
代码语言:javascript
复制
# 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
  • 使用内置函数
代码语言:javascript
复制
# 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             # 支持扩展正则匹配

# 使用技巧
🔔 只要编辑文件,就使用参数 i
🔔 只要用到动作 p,就使用参数 n

4、使用示例

  • 插入内容
代码语言:javascript
复制
# 在指定的行前(in front)插入内容(context)
sed -i "1i context" demo.txt
----------------------------------------------------
# 在指定的行后(after)插入内容(context)
sed -i "1a context" demo.txt
----------------------------------------------------
# 在匹配的行后(after)插入内容(context)
sed -i "/root/a context" demo.txt
  • 删除内容
代码语言:javascript
复制
# 删除指定的行(第 1~5 行)
sed -i "1,5d" demo.txt
----------------------------------------------------
# 删除匹配的行
sed -i "/root/d" demo.txt
  • 替换内容
代码语言:javascript
复制
# 替换指定行(第 1 行)的内容
sed -i "1c context" demo.txt
----------------------------------------------------
# 替换指定的字符串(在全部行中替换)
sed -i "s#old#new#g" demo.txt
🔔 s:替换
🔔 g:全局
----------------------------------------------------
# 替换指定的字符串(在第 1~5 行中替换)
sed -i "1,5s#old#new#g" demo.txt
----------------------------------------------------
# 替换指定的字符串(只替换第 2 次出现的字符串)
sed -i "s#old#new#2" demo.txt
----------------------------------------------------
# 替换指定的字符串(同时指定多个字符串)
sed -i "s#old-1#new-1#g;s#old-2#new-2#g" demo.txt
sed -i -e "s#old-1#new-1#g" -e "s#old-2#new-2#g" demo.txt
----------------------------------------------------
# 替换指定的字符串(在匹配行中替换)
sed -i "/swap/ s/^\(.*\)$/#\1/g" demo.txt
🔔 \1表示原始内容的第一个分组
🔔 这里建议使用 / 作为分隔符
----------------------------------------------------
# 替换指定的字符串(使用变量替换)
sed -i "s#old#${new}#g" demo.txt
sed -i 's#old#"${new}"#g' demo.txt
🔔 将字符串替换为对应的变量,需要使用「双引号」
"(双引号):保留 $ 引用
'(单引号):关闭所有引用
  • 查找、打印内容
代码语言:javascript
复制
# 打印指定的行(第 1~5 行)
sed -n "1,5p" demo.txt
----------------------------------------------------
# 打印匹配的行
sed -n "/root/p" demo.txt
----------------------------------------------------
# 打印指定行以外的内容
sed "1,5d" demo.txt
----------------------------------------------------
# 打印第一行
sed -n "1p;1q" demo.txt        # 相比 1p 可以提高效率
  • 高阶命令
代码语言:javascript
复制
# 在每行开头处插入空格
sed -i "s#^# #g" demo.txt
----------------------------------------------------
# 在每行结尾处插入冒号
sed -i "s#$#:#g" demo.txt
----------------------------------------------------
# 从指定行开始,每 3 行插入一行
sed -i "1~3a context" demo.txt
----------------------------------------------------
# 在指定位置插入(第 5 列)
sed -i "s/^\(.\{4\}\)/\1  /g" demo.txt
🔔 \1表示原始内容的第一个分组
🔔 \(.\{4\}\)表示前4个字符
----------------------------------------------------
# 从指定行开始,每 3 行删除一行
sed -i "1~3d" demo.txt
----------------------------------------------------
# 删除空行
sed -i "/^$/d" demo.txt

附录 正则表达式

基本正则表达式(无需添加参数即可生效)

符号

含义

符号

含义

^

标记开头(最左侧)

$

标记结尾(最右侧)

^$

空行

\

转义特殊字符

.

匹配任意一个字符

*

匹配前一个字符0次或多次

.*

匹配任意长度字符

< 或 >

定位单词的左侧和右侧

[ ]

匹配[ ]内任意一个字符

[^ ]

匹配[ ]内字符以外的任意字符

说明

[abc] 可以写作 [a-c]=====================================================[a-z] # 匹配小写字母,⬅️➡️ [[:lower:]][A-Z] # 匹配大写字母,⬅️➡️ [[:upper:]][a-zA-Z] # 匹配所有字母,⬅️➡️ [[:alpha:]][0-9] # 匹配所有数字,⬅️➡️ [[:digit:]][a-zA-Z0-9] # 匹配字母和数字,⬅️➡️ [[:alpha:][:digit:]]

扩展正则表达式(需要添加参数方可生效,grep -E,sed -r)

符号

含义

符号

含义

?

匹配前一个字符0次或1次

+

匹配前一个字符1次或多次

[ ]+

匹配[ ]内任意字符1次或者多次

( )

分组过滤,()里的内容是一个整体

|

或,用于同时过滤多个字符串

{m}

匹配前一个字符m次

{m,n}

匹配前一个字符至少m次,至多n次

{m,}

匹配前一个字符至少m次

{,n}

匹配前一个字符至多n次

说明

grep -E "good|gold" demo.txt ⬅️➡️ grep -E "g(oo|ol)d" demo.txt

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 实施运维知识交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档