shell脚本之grep,sed,awk

一、grep

强大的全局文本搜索命令,并能将匹配到的文本按行打印
支持正则表达

用法

grep [OPTIONS] PATTERN [FILE]  

或者
cat FILE|grep [OPTIONS] PATTERN 

1 常用的OPTIONS

复制代码
-c    统计匹配到的行数  
-i    匹配时不区分大小写
-n    显示匹配行所在行号
-o    只显示匹配到的字符串
-v    取反,方向匹配,不匹配关键字的行
-E    开启扩展的正则表达式
-A n  显示匹配的所在的行及其后n行
-B n  显示匹配的所在的行及其前n行
-C n  显示匹配的所在的行及其前后各n行
复制代码

 

2 PATTERN部分

主要为基本正则表达式

 

2.1 基本字符组

.          匹配除换行符外的任意一个字符
.*         匹配所有内容
[abc]      匹配abc三个字符中的任意一个字符
[^abc]     匹配不包含abc三个字符中的任意一个字符(与[abc]相反)

 

2.2 特殊字符组

[A-Za-z] 等价于 [[:alpha:]]       匹配任意字母字符,不管大小写
[0-9] 等价于 [[:digit:]]          匹配任意数字字符
[A-Za-z0-9] 等价于 [[:alnum:]]    匹配任意字母数字字符
tab,space 等空白字符 [[:space:]]   匹配任意空格符
[A-Z] 等价于 [[:upper:]]          匹配任意大写字目字符
[a-z] 等价于 [[:lower:]]          匹配任意小写字母字符
[[:punct:]]                      匹配标点符号

 

2.3 出现次数

*        前面的字符出现任意次,包括0次
\?       前面的字符出现0次或1次,\为转义符
\+       前面的字符至少出现一次
\{m\}    前面的字符出现m次,\为转义符
\{m,\}   前面的字符至少出现m次,\为转义符
\{m,n\}  前面的字符至少出现m次,至多n次,\为转义符

 

2.4 位置锚定

^    锚定行首,即以什么开头
$    锚定行尾,即以什么结尾
^$   空白行
\b   锚定词首或词尾,前面为词首,如"\bwho"匹配到whoami,后面为词尾,如"who\b"会匹配到iswho
\<   锚定单词的词首
\>   锚定单词的词尾
\B   与\b作用相反

 

2.5 ()分组引用

\(str\)  用()将str作为一个整体方便后面引用,第一个()为$1,以此类推
\1          引用第1个左括号及其对应的右括号所匹配的内容
\n          引用第n个左括号及其对应的右括号所匹配的内容

 

3 扩展的正则表达式 

即OPTIONS的-E选项

复制代码
字符组和特殊字符组与基本正则表达式一样

次数和位置锚定 没有转义符,其他的和基本正则表达式一样
分组引用 (string) \
1 \n
复制代码

 

二、sed 

非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作
支持正则表达式

 

用法

sed OPTIONS sed命令 FILE

sed OPTIONS -f 包含sed命令的FILE FILE

 

1 OPTIONS

-e  用于进行多重编辑,即同时有多个sed命令时使用,即sed -e sed命令 -e sed命令 FILE
-f  后接包含sed命令的FILE
-i  直接修改FILE内容,不加-i时只是预览,不会修改FILE内容
-n  取消默认的输出,只显示处理过的行,sed默认输出FILE的所有内容
-r  使用扩展正则表达式,默认只识别基本正则表达式

 

2 sed命令

a   新增,指定行后方加入新行
i   新增,指定行前方加入新行
c   替换行,将指定行的内容全部替换
d   删除
p   将指定内容打印到终端上,通常与OPTIONS -n 一起用
s   替换指定字符串

 

3 基本使用

3.1 显示

若str包含变量,请使用双引号("")

sed -n 'Np;Mp;Xp' FILE 显示行号为N,M,X的多行 sed -n '$p' FILE 显示最后一行 sed -n '/str/p'FILE 显示包括str的所有行 sed -n 'N,Mp' FILE 显示第N行到第M行

 

3.2 删除

以下命令只是预览,不会真正修改文件内容,若下行要修改文件内容,请使用sed -i 
若str包含变量,请使用双引号("") sed
'N,Md' FILE 显示删除第N行到第M行剩下的内容 sed '/str1/,/str2/d’ FILE 显示删除包含str1的行到包含str2的行剩下内容 sed '/str/,Nd' FILE 显示删除包含strt的行到第N行剩下的内容 sed '/str/d' FILE 显示删除包含str的行剩下的内容 sed '/^$/d' FILE 显示删除空白行剩下的内容

 

3.3 增加

复制代码
以下命令会真正修改文件内容,请谨慎使用
若str包含变量,请使用双引号("") sed
-i 'Na str' FILE 第N行后增加一行字符 sed -i 'Na str1\nstr2' FILE 第N行后增加二行字符 sed -i 'N,Ma str' FILE 第N行到第M行的每行后都增加一行字符 sed -i 'Ni str' FILE 第N行前增加一行字符 sed -i 'Ni str1\nstr2' FILE 第N行前增加二行字符 sed -i 'N,Mi str' FILE 第N行到第M行的每行前都增加一行字符
复制代码

 

3.4 替换

以下命令会真正修改文件内容,请谨慎使用
若str包含变量,请使用双引号("")
sed
-i 'Nc str' FILE 将第N行的内容替换为str sed -i 'N,Mc str' FILE 将第N行到第M行的内容替换为str sed -i 's/str1/newstr/g' FILE 将所有的str1替换为newstr sed -i 's/str1/newstr2/gw FILE1' FILE2 将处理过的行另存到文件1 sed -i 's/str1/newstr/g' FILE2 >FILE1 将处理后的内容重定向至文件1

 

 

 

三、awk
文本处理工具,以字段为单位进行处理
支持正则表达式

 

用法

awk [OPTIONS] '[pattern] {action}' FILE

cat FILE |awk [OPTIONS] '[pattern] {action}'

 

1 awk内置变量

1.1 字段和分隔符变量

复制代码
$0  满足条件的所有文本内容
$1  以FS分隔符隔开的第一列内容
$2  以分隔符隔开的第二列内容
$n  以分隔符隔开的第n列内容

FS     指定字段(列)分隔符,默认空格 
RS     指定处理时的行分隔符,遇到该符号就是一行,默认换行符
OFS    指定输出的字段(列)分隔符,默认空格
ORS    指定输出的行分隔符,行以该符号结尾,默认换行符
复制代码

 

1.2 数据变量

复制代码
ARGC  命令行的参数个数
ARGV  命令行所有参数组成的数组
ARGIND  被处理文件在ARGV中的位置

NF    当前行的字段个数,即列数
NR    当前行的行号
FNR    处理多个文件时,当前行在本文件中的行号

FIELNAME 被处理的文件名

IGNORECASE    如果为真,则进行忽略大小写的匹配
CONVFMT    数字转换格式 %.6g
ENVIRON    UNIX环境变量
ERRNO    UNIX系统错误消息
FIELDWIDTHS    输入字段宽度的空白分隔字符串
OFMT    数字的输出格式 %.6g
RSTART    被匹配函数匹配的字符串首
RLENGTH    被匹配函数匹配的字符串长度
SUBSEP    \034
复制代码

 

2 OPTIONS

-F  指定分隔符,默认为空格,包括一个或多个空格键或tab键
-v  定义变量和初始值,可以在 pattern {action}使用
-f  后接包含pattern {action}的文件

 

3 [pattern] {action}

3.1 pattern

1) BEGIN和END

复制代码
BEGIN    在awk尚未读取任何数据之前执行,只执行一次
END        在awk处理完文本所有数据后执行,只执行一次

其中
BEGIN中定义的变量只能在当前的BEGIN中使用
END中定义的变量只能在当前的END中使用


示例 awk
'BEGIN {print "ready start!"} /a/{print $0}' FILE 先输出ready start!,再输出包含字符'a'的整行内容 awk '/a/{print $0} END {print "ready start!"}' FILE 先输出包含字符'a'的整行内容,再输出ready start!
复制代码

 

2) 关系运算符

复制代码
>
<
>=
<=
==
!=

示例
awk 'NR>2 {print $0 }' FILE
输出行号大于2的所有行

awk 'NR<2 {print $0 }' FILE
输出行号小于2的所有行

awk 'NR>=2 {print $0 }' FILE
输出行号大于等于2的所有行

awk 'NR<=2 {print $0 }' FILE
输出行号小于等于2的所有行

awk 'NR==2 {print $0 }' FILE
输出行号等于2的行

awk 'NR!=2 {print $0 }' FILE
输出行号不等于2得所有行

awk -F ',' '$1==10 && $2==9 {print $0 }' FILE
输出第一列为10,第二列为9的行的内容

awk -F ',' '$1==10 || $2==9 {print $0 }' FILE
输出第一列为10或者第二列为9的行的内容
复制代码

 

3) 匹配操作符

复制代码
匹配操作符
str1 ~ /str2/ 
str1 !~ /str2/

其中
str2可以是正则表达式

示例 
awk -F ',' '$1 ~ /^asd/ {print $0 }'  FILE
输出第一列以asd开头的行的内容

awk -F ',' '$1 !~ /^asd/ {print $0 }'  FILE
排除第一列以asd开头的行

复制代码

 

4) 正则表达式

/str/  匹配含有str的内容

示例
awk -F ',' '/^asd/ {print $0 }'  FILE
输出以asd开头所有行的内容

 

3.2 {action}

1) 格式化输出printf

复制代码
基本很少使用,使用print频率极高

c   以ASCII码显示
d   以整数显示
i   以整数显示
e   以科学计数法显示
f   以浮点数显示
g   以科学计数法或浮点数显示
o   以八进制显示
s   以字符串显示
x   以十六进制显示
X   以十六进制显示,但用大写字母A~F

awk -F ',' '$1 ~ /^[0-9][0-9]*/ {printf "%e,%f\n",$1,$3 }'  FILE
输出第一列全是数字的第一列,第三列,并以科学计数法显示第一列,浮点数显示第三列

注意:
prtinf必须有\n,否则不会换行
复制代码

 

2) 结构化流程控制

A if语句

awk -F ',' '{if(NR==2 || $1 ~ /a/) print $0}' FILE
输出第二行或者第一个字段包含字符a的行

awk -F ',' '{if(NR==2 || $1 ~ /a/) print $0;else print NR,$1}' FILE
输出第二行或者第一个字段包含字符a的行,以及不满足条件的行号和第一列

 

B wihle语句

awk -F ',' '{total=0;i=1; while (i<4){total+=$i;i++} avg=total/3;print avg }'  FILE
输出前三列的平均值

其中
$i表示第几列数据

 

C do-while语句

awk -F ',' '{total=0;i=1; do {total+=$i;i++} while (i<5);print total }'  FILE
输出前四列之和

其中
$i表示第几列数据

 

D for语句

awk -F ',' '{total=0; for(i=1;i<5;i++) {total+=$i};print total }'  FILE
输出前四列之和

其中
$i表示第几列数据

 

posted @   junffzhou  阅读(577)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示