前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >秒懂 Linux 三剑客:awk、sed、grep 的超实用操作示例

秒懂 Linux 三剑客:awk、sed、grep 的超实用操作示例

作者头像
天意生信云
发布2025-01-22 08:00:05
发布2025-01-22 08:00:05
21400
代码可运行
举报
运行总次数:0
代码可运行

在介绍"Linux三剑客"之前,我们先引入正则表达式的概念,有助于之后命令的理解和使用。

正则表达式

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符"),可以用来描述和匹配字符串的特定模式。grep、sed、awk等命令均支持正则表达式,它们的操作对象或者说匹配对象都是文件内部的内容。

通配符

含义

*

指*前一个字符可以出现0次或无数次

.

匹配换行符以外的任意字符一次

^hello

匹配以hello开头的行

hello$

匹配以hello结尾的行

[0-9]

匹配0-9的任意一个字符

[a\|b]

匹配a或b中的任意一个字符

\

转义符,让符号的特殊含义消失,变成普通字符

[abc]

匹配abc中的任意一个字符

[^]

取反,比如[^0-9]是取除数字以外的字符

字符\{n,\}

匹配该字符n次

字符\{n,\m}

匹配字符n到m次

现在登录服务器,新建一个文本文件练习一下:

代码语言:javascript
代码运行次数:0
运行
复制
vi file.txt
代码语言:javascript
代码运行次数:0
运行
复制
#1. `*` -匹配前一个字符出现0次或多次
grep "a*" file.txt
#匹配包含零个或多个`a`的行。
#2. `.` -匹配任意单个字符
grep "a.c" file.txt
#匹配`a`和`c`之间有一个任意字符的行,如`abc`或`a1c`。
#3. `^` -匹配行首
grep "^Hello" file.txt
#匹配以`Hello`开头的行
代码语言:javascript
代码运行次数:0
运行
复制
#4.`[0-9]` -匹配数字
grep "[0-9]" file.txt
#匹配包含任意数字的行。
#5.`[a\|b]` -匹配`a`或`b`
grep "a\|b" file.txt
#匹配包含`a`或`b`的行。
代码语言:javascript
代码运行次数:0
运行
复制
#6.`[abc]` -匹配括号内的任意一个字符
grep "[abc]" file.txt
#匹配包含`a`、`b`或`c`中任意一个字符的行。
#7.`[^]` -取反
grep "[^0-9]" file.txt
#匹配不包含数字的行。
#8.`{n}` -匹配前面的字符出现n次
grep -E "a{3}" file.txt
#匹配包含连续3个`a`的行。
#9`{n,m}` -匹配前面的字符出现n到m次
grep -E "a{2,4}" file.txt
#匹配包含连续2到4个`a`的行

Start

grep

grep的全称为global regular expression print。即grep可以从单个或多个文本中以行为单位抓取一定的内容。这个内容为某一特定的字符模式,也就是我们上面所说的正则表达式,或是普通的单一字符或字符串。抓取到内容后,grep默认会把一定的信息给到标准输出中。

以下是结合之前生成的`file.txt`文件内容,用`grep`命令进行正则表达式匹配的示例。

代码语言:javascript
代码运行次数:0
运行
复制
#1.忽略大小写(`-i`)
#示例:查找包含`hello`的行(不区分大小写)
grep -i "hello" file.txt
#2.显示行号(`-n`)
#示例:查找包含`Linux`的行并显示行号
grep -n "Linux" file.txt
#3.反向匹配(`-v`)
#示例:查找不包含`2024`的行
grep -v "2024" file.txt
#4.匹配完整单词(`-w`)
#示例:查找完全匹配`regex`的行
grep -w "regex" file.txt
#5.显示匹配部分(`-o`)
#示例:只显示文件中所有匹配的数字
grep -o "[0-9]\+" file.txt
代码语言:javascript
代码运行次数:0
运行
复制
#6.递归搜索目录(`-r`或`-R`)
#示例:递归搜索当前目录下所有文件中包含`Linux`的行
grep -r "Linux" .
#7.使用扩展正则表达式(`-E`或`--extended-regexp`)
#示例:查找包含`abc`或`def`的行
grep -E "abc|def" file.txt
#示例:查找连续出现2-4个数字的行
grep -E "[0-9]{2,4}" file.txt
#8.限制匹配输出的行数(`-m`)
#示例:查找包含数字的行,最多输出2行
grep -m 2 "[0-9]" file.txt
#9.打印匹配行及上下文(`-A`、`-B`、`-C`)
#示例:查找包含`GHI`的行,并显示后1行(`-A`)
grep -A 1 "GHI" file.txt
#示例:查找包含`GHI`的行,并显示前1行(`-B`)
grep -B 1 "GHI" file.txt
#示例:查找包含`GHI`的行,并显示上下各1行(`-C`)
grep -C 1 "GHI" file.txt
#10.统计匹配行数(`-c`)
示例:统计包含`is`的行数
grep -c "is" file.txt
#11.显示不匹配的文件名(`-L`)
#示例:查找不包含`Hello`的文件
grep -L "Hello" file.txt
#(如果当前只有`file.txt`,则无输出,因为文件包含该内容)
#12.仅显示匹配的文件名(`-l`)
#示例:查找包含`openai`的文件
grep -l "openai" file.txt

sed

sed命令是一种几乎所有基于unix的系统中都存在的轻量级文本流编辑器,主要可以对数据进行选取、替换、删除、新增的命令。

代码语言:javascript
代码运行次数:0
运行
复制
#1.替换文本
#用法:替换序列中的‘ATCG’为‘NNNN’
sed 's/ATCG/NNNN/' seq.fasta
#2. 全局替换
#用法:替换所有 `ATCG` 为 `NNNN`
sed 's/ATCG/NNNN/g' seq.fasta

#3. 忽略大小写(`I`)
#用法:替换大小写无关的 `atcg` 为 `NNNN`
sed 's/atcg/NNNN/Ig' seq.fasta
代码语言:javascript
代码运行次数:0
运行
复制
#4.只替换指定行
#用法:只替换第2行的`GCTA`为`XXXX`
sed '2s/GCTA/XXXX/' seq.fasta
#5.删除行
#用法:删除以`>`开头的行
sed '/^>/d' seq.fasta
#6.打印匹配行
#用法:打印包含`CTAG`的行
sed -n '/CTAG/p' seq.fasta
#7.添加行
#用法:在以`>`开头的行后添加一行注释
sed '/^>/a\# This is a sequence' seq.fasta
代码语言:javascript
代码运行次数:0
运行
复制
#8.插入行
#用法:在以`>`开头的行前插入一行
sed '/^>/i\# Header starts here' seq.fasta
#9.替换多行文本
#用法:将第2至4行的内容替换为`NNNN`
sed '2,4c\NNNN' seq.fasta
#10.输出至新文件
#用法:将修改结果保存到新文件
sed 's/ATCG/NNNN/g' seq.fasta > modified_seq.fasta
#11.行号范围操作
#用法:只处理第2到3行
sed '2,3s/CTAG/XXXX/' seq.fasta
#12.从指定行到文件末尾操作
#用法:从第3行到文件末尾替换`TAGC`为`----`
sed '3,$s/TAGC/----/' seq.fasta

awk

awk来源于Unix,自然也存在于各个Linux系统的发行版中,可用于处理和分析来源于磁盘文件或管道符传递的文本内容。其具有非常强大的功能,本次内容给大家简短解析awk命令,帮助大家快速上手。

代码语言:javascript
代码运行次数:0
运行
复制
# NR当前处理的行数 FNR当前文件读了多少行 NF当前处理行的列数
#1.打印整列
#用法:打印所有人的姓名
awk -F ',' '{print $1}' test.txt
#2.跳过标题行
#用法:打印姓名和分数(跳过第一行)
awk -F ',' 'NR > 1 {print $1, $4}' test.txt
#3.条件筛选
awk -F ',' '$4 > 85 {print $1, $4}' test.txt
代码语言:javascript
代码运行次数:0
运行
复制
#4.多条件筛选
#用法:筛选分数大于85且性别为Female的人
awk -F ',' '$4 > 85 && $3 == "Female" {print $1, $3, $4}' test.txt
#5.统计操作
#用法:计算所有人的平均分
awk -F ',' 'NR > 1 {sum += $4; count++} END {print "Average Score:", sum / count}' test.txt
#6.格式化输出
#用法:格式化输出姓名和分数
awk -F ',' 'NR > 1 {printf "Name: %s, Score: %d\n", $1, $4}' test.txt
#7.添加新列
#用法:为每个人添加评价(分数>= 85为优秀)
awk -F ',' 'NR == 1 {print $0 ",Evaluation"} NR > 1 {eval = ($4 >= 85) ? "Excellent" : "Good"; print $0 "," eval}' test.txt
代码语言:javascript
代码运行次数:0
运行
复制
#8.按字段排序

awk -F ',' 'NR == 1 {print $0; next} {print $0 | "sort -t, -k4 -nr"}' test.txt

#9.计算列的最大值

#用法:找出最高分及其对应的人名

awk -F ',' 'NR > 1 {if ($4 > max) {max = $4; name = $1}} END {print "Top scorer:", name, "with score", max}' test.txt

#10.结合正则表达式

awk -F ',' '$1 ~ /^A/ {print $1, $4}' test.txt

下期内容

下一节我们学习“shell脚本和变量”的相关内容

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

本文分享自 BioOmics 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正则表达式
  • grep
  • sed
  • awk
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档