shell 中的grep sed awk命令

news2024/9/20 0:56:50

目录

一、grep命令

1.基本格式

 2.常用命令

3. sort 命令

3.1  格式

 3.2  常用选项

 4. uniq  快捷去重

 4.1 格式

 5. tr 命令

 5.1 格式

5.2 常用选项

练习:

 二、sed 命令

1. sed基本概念    

 2. 基本操作格式

 3. 常用选项

 4. 应用

5. 文本模式过滤行内容

6. sed 的删除操作

7.sed 命令替换

7.1 格式

 7.2 标记说明

 7.3 示例

总结:

 三、awk 命令

1.awk 命令基本概念

 2. 基本结构

 3.工作过程

 4.工作原理

 5.常用选项

6.内置变量

7. 示例


一、grep命令

1.基本格式

grep [选项]… 查找条件 目标文件

 2.常用命令

选项功能
-m [ x ]匹配x次 后停止,x为具体数字
-v取反
-i忽略字符大小写
-n显示匹配的 行号
-c统计匹配的行数
-o仅显示匹配到的字符串
-q静默模式,不输出任何信息
-A # after匹配内容的后#行
-B # before前#行
-C # context前后各#行
-e实现多个选项间的逻辑or关系
-w匹配 整个单词
-E使用扩展正则表达式,相当于egrep
-F不支持正则表达式,相当于fgrep
-r递归目录,但不处理软链接
-R递归目录,但处理软链接
-f filefile 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件
-color=auto对匹配到的文本着色显示
#grep -m :匹配多少次后结束
grep -m 1 root /etc/passwd
root:x:0:0:root:/root:/bin/bash


# grep -E 拓展正则 
grep -Ev '^[[:space:]]*#|^$' /etc/fstab
# ^:行的开始
# [[:space:]]*: 匹配任意数量的空白字符  * 表示前面的元素可以出现零次或多次。
# #: 紧接着空白字符之后,匹配注释符号 
# ^$: 匹配完全空白的行
UUID=9f85ffd8-d116-4d93-b305-98254c7fb344 /        xfs     defaults        0 0
UUID=b5f61360-55f4-4f26-bbb7-3dbacfebc1f1 /boot    xfs     defaults        0 0
UUID=ed944890-6c21-44ac-8f62-22cfc3cda1a9 /home    xfs     defaults        0 0
UUID=8d6683ac-4d68-40b6-83b2-1ee1a2e0dc14 swap     swap    defaults        0 0
cat 123.txt |grep -v '^$' >test.txt  #将非空行写入到test.txt文件
grep "^b" 123.txt                    #过滤已b开头
grep '/$'  123.txt                   #过滤已/结尾

3. sort 命令

以行为单位对文件内容进行排序,可以根据不同的数据类型来排序 【就是一个排序命令】

3.1  格式

sort 选项 参数
cat file | sort 选项

 3.2  常用选项
选项说明
-f忽略大小写,默认会大写字母排在前面
-b忽略每行前面的空格
-n按照数字进行排序
-r反向排序
-u等同uniq,表示相同的数据仅显示一行,去重
-t指定字段分隔符,默认使用tab键分隔
-k指定排序字段
-o<输出文件>将排序后的结果转存至指定文件
sort -n test.txt        #按数字大小进行排序
sort -n -r test.txt     #按数字大小倒叙排列
sort -u test.txt        #重复的数据只展示一次,相当于去重

 4. uniq  快捷去重

uniq命令用于报告或者忽略文件中连续的重复行,常与sort命令结合使用。

 4.1 格式

uniq [选项] 参数  ​
cat 文件| uniq 选项

选项说明
-c统计连续重复的行的次数,并且合并重复的行
-u显示仅出现一次的行(包括不连续的重复行)
-d仅显示重复出现的行(必须是连续的重复行)
uniq -u test.txt              #只显示出现一次的行
uniq -d test.txt              #只显示连续重复的行
sort -n test.txt | uniq -c    #对重复的数据行计数,并且去重输出
sort -n test.txt | uniq -u    #只展示不重复的数据行
sort -n test.txt | uniq -d    #只展示重复的数据行

 5. tr 命令

常用于对来自标准输入的字符进行替换、压缩和删除

 5.1 格式

tr 选项 参数

5.2 常用选项
选项

说明

-c保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换
-d删除所有属于字符集1的字符
-s将重复出现的字符串压缩为一个字符串,用字符集2 替换 字符集1
-t字符集2 替换 字符集1,不加也行
echo 192.168.233.22 | tr '.' ' '         #把"." ,替换成空格
echo ABC | tr "A-Z" "a-z"                #大写替换成小写
echo abc | tr -c 'ab' 'a'                #保留了ab,替换了c,输出aa
echo abc | tr -d 'ab'                    #删除ab,打印c

练习:

1.使用grep和正则表达式,查找以“a”开头,以“z”结尾,且中间包含任意字符(包括0个字符)的行。 

 2.假设你有一个包含学生分数的文件,每行记录包含学生姓名和分数。请使用命令组合,找出分数最高的学生姓名和分数。

 3.编写一个管道命令序列,首先使用grep查找包含特定模式的行,然后使用tr进行大小写转换,接着使用sort进行排序,最后使用uniq去除重复行。

 二、sed 命令

1. sed基本概念    

   sed是行编辑器,sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
       接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等

sed最为核心的功能是增删改查

 2. 基本操作格式

sed -e '操作'  文件1   文件2  
sed -e '操作'   文件1   文件2
sed -f   脚本文件   文件1  文件2
sed -i -e '操作'  文件1  文件2

 3. 常用选项

选项说明
-e表示用指定命令来处理输入的文本文件
-f表示用指定的脚本文件来处理输入的文本文件。
-i直接修改目标文本文件 慎用
-n 仅显示script处理后的结果
s替换,替换指定字符
d删除,删除选定的行
a增加,在当前行下面插入一行指定内容
i插入,在选定行上面插入一行指定内容
c替换,将选定行替换为指定内容
y字符转换,转换前后的字符长度必须相同
p

打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容

如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。

=打印行号
l打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
r扩展正则表达式

 4. 应用

ifconfig ens33|sed -n 2p    #打印第二行
inet 20.0.0.111  netmask 255.255.255.0  broadcast 20.0.0.255
# 打印时对行号的操作

sed -n '=' test1.txt        #只显示行号
sed -n '=;p' test1.txt      # 显示行号和每行的内容
sed命令的寻址打印:
方式一:按照行号寻求内容
sed -n '1p' test1.txt            #打印第一行
sed -n '4p' test1.txt            #打印第四行
sed -n '$p' test1.txt            #打印最后一行
方式二:进行行号范围区间的打印
sed -n '1,3p' test1.txt          #打印1-3行
sed -n '5,$p' test1.txt          #打印第5行到最后一行
sed -n '2;+2p'   test1.txt      #打印第二行及后面第二行后面两行
sed -n '3p;5p' test1.txt         #输出第三行和第五行
方式三:指定间隔打印
sed -n -e '2p'-e'$p' test.txt    #打印第二行和最后一行
sed -n -e '2p'-e'3p' test.txt    #打印第二行和第三行
方式四:对奇数行和偶数行的打印
sed -n 'n;p' test.txt            #打印偶数行
sed -n 'p;n' test.txt            #打印奇数行
n在p前面,跳过一行,打印下一行,就是偶数行;在后面,就是打印第一行,然后跳过一行,形成奇数行

5. 文本模式过滤行内容

方式一:对包含的字符串进行过滤打印
sed -n '/o/p' test.txt        #包含o的所有行
sed -n '/th/p' test.txt       #包含th的所有行
方式二:应用基础正则表达式进行打印
sed -n '/^root/p' /etc/passwd        #以root为开头的所有内容,全文本搜索
sed -n '/bash$/p' /etc/passwd        #以bash结尾的所有内容,全文本搜索
sed -n '4,/bash$/p' /etc/passwd      #从第四行开始,一直打印到第一个以bash为结尾的所在行
方式三:使用扩展正则表达式进行打印
sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\ 。
sed -r -n '/(99:){2,}/p' /etc/passwd  #包含有两个99:的内容所在行
sed -r -n '^root|bash$/p' /etc/passwd #包换以root开头,或者以bsah结尾的内容所在行

6. sed 的删除操作

sed  -i 时会对文本进行实际操作(建议对目标文件先进行备份,再进行操作)。通过行号进行删除

sed 'd' test1.txt              #删除所有,什么也不打印
sed -n '3d;p' test1.txt        #删除第三行,打印剩余的所有内容 
sed -n '5,8d;p' test1.txt      #删除5到8行,打印剩余的所有内容 
sed -n '5,$d;p' test1.txt      #删除5到最后一行行,打印剩余的所有内容 
sed '4,6!d' test1.txt          #除了4-6行,其他的全部删除
如果要生效:sed -i -n 

匹配字符串内容删除
sed '/one/d' test1.txt         #删除包含one的行
sed '/one/,/six/d' test1.txt   #删除one-six的行
sed '/one/,/six/!d' test1.txt  #除了one-six的行,其余的全部删除,反向删除
sed '/six/!d' test1.txt        #除了six的行,其余的全部删除,反向删除
字符串搭配正则进行删除:
sed '/^$/d' test1.tx           #通过^$,来删除空行

删除空行的三种方法:
grep -v "^$" test1.txt     ----过滤出非空行
cat test1.txt |tr -s "\n"  ----压缩换行符
sed '/^$/d' test1.txt      ----删除空行

7.sed 命令替换

7.1 格式

行范围 s/旧字符串/新字符串/替换标记  ​

 7.2 标记说明
替换标记说明
数字表明新字符串将替换第几处匹配的地方  
g表面新字符串将会替换所有匹配的地方
p打印与替换命令匹配的行,与-n一起使用
w文件将替换的结果写入文件中
s替换字符串
c整行替换
y字符替换,替换前后的字符串长度必须相同
 7.3 示例
sed -n 's/root/test/2p'  /etc/passwd  #指定第二个root,替换为了test
sed -n 's/root/test/gp'  /etc/passwd  #所有的root都替换为test

sed 's/[A-Z]/\l&/g' test1.txt         #将大写全部转换为小写
l&是转换小写的一种特殊的符号,前面要加转义符“\”

sed 's/[a-z]/\u&/' test1.txt          #把首字母替换成大写
u&是转换首字母大写的一种特殊的符号,前面要加转义符“\”

总结:

  • sed命令是一种流编辑器读取文件会进行逐行读取加上指令操作,所以过大的文件一定要拆分后再交给sed处理
  • sed  -r  搭配扩展正则表达式使用,使用\{n\}    \{n,\}     \{n,m\}    不需要加“\”
  •  用 -i 时一定要先备份(尤其对重要文件的操作),或者时先实验好确定无误时,再使用 -i
  •  sed  命令 的重点在于增删改查四个功能,可以运用在脚本中对重要文件配置的修改,添加等作用尤其有效

 三、awk 命令

1.awk 命令基本概念

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。

以空格做为分隔符,多个空格他会自动压缩成一个

 2. 基本结构

awk '<pattern> <action>' <input-file>
           操作符    怎么干    处理对象

#命令格式#
awk [选项] '[模式匹配条件]{处理动作 }'  文件1 文件2..

 3.工作过程

  1. 执行BEGIN{action;… }语句块中的语句。
  2. 从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
  3.  当读至输入流末尾时,执行END{action;…}语句块

 4.工作原理

  1. 读取输入:AWK首先读取输入文件或从标准输入接收输入;
  2. 分割输入:AWK默认将输入行分割成字段,并使用空格或制表符作为字段分隔符;
  3. 匹配模式:AWK使用模式匹配来确定需要处理的行,可以使用正则表达式或其他条件来指定匹配的行。如果没有指定模式,AWK将默认匹配所有行;
  4. 执行动作:当输入行与模式匹配时,AWK执行相应的动作;
  5. 处理下一行:一旦完成当前行的处理,AWK继续处理下一行,重复上述步骤。

 5.常用选项

选项说明
-F指定分隔符,默认的分割符是若干个连续的空白符,
-vvar=value 变量赋值
 ‘  ’ 注意一定是单引号:'模式或条件 {操作}'
 {  }{ }外指定条件,{ }内指定操作。

6.内置变量

选项说明
$0当前处理的行的整行内容  打印所有
$n当前处理行的第n个字段(第n列)
NR当前处理的行的行号(序数)
NF当前处理的行的字段个数。$NF代表最后一个字段
FS列分割符。指定每行文本的字段分隔符,输入内容的分隔符,默认为空格或制表位。与"-F"作用相同 用-F可以不加单引号 -F:,用FS必须用=""
OFS输出内容的列分隔符
RS行分隔符

7. 示例

awk 'NR==3{print}' test1.txt                #指定打印出第三行的内容
awk 'NR==3,NR==5{print}' test1.txt          #打印3-5行的内容
awk 'NR==3;NR==5{print}' test1.txt          #打印第三行和第五行
awk '(NR>=3)&&(NR<=5){print}' test1.txt     #正则的表达方式,打印3-5行的内容

奇偶行打印:
awk 'NR%2==0{print}' test1.txt     #打印偶数行
awk 'NR%2==1{print}' test1.txt     #打印奇数行

awk运算:
awk 'BEGIN{print 100+200}'
300
awk 'BEGIN{print 10.2+20.3}' 
30.5
awk 'BEGIN{print 10.2*20.3}' 
207.06
awk 'BEGIN{print 10.2/20.3}'
0.502463

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2108853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#自定义控件的放置与拖动

1、自定义控件 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace PartA…

【mysql】mysql修改sql_mode之后无法启动

现象&#xff1a;修改后mysql无法启动&#xff0c;不报错 原因&#xff1a;MySQL在8以后sql_mode已经取消了NO_AUTO_CREATE_USER这个关键字。去掉这个关键字后&#xff0c;启动就可以了 修改前&#xff1a; sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR…

jenkins 工具使用

使用方式 替代手动&#xff0c;自动化拉取、集成、构建、测试&#xff1b;是CI/CD持续集成、持续部署主流开发模式中重要的环节&#xff1b;必须组件 jenkins-gitlab&#xff0c;代码公共仓库服务器&#xff08;至少6G内存&#xff09;&#xff1b;jenkins-server&#xff0c;…

查看当前主机的硬盘是固态硬盘还是机械硬盘

windows主机下查看硬盘类型方法&#xff1a; 打开dos界面&#xff0c;输入 powershell进入powershell界面 在PowerShell窗口中&#xff0c;输入 Get-PhysicalDisk 命令并按回车。 发现MediaType下面的值为HDD,即为机械硬盘&#xff0c;如果是固态硬盘&#xff0c;则为SSD

什么是CDN及其如何影响SEO?

有没有想过&#xff0c;为什么你的网站在谷歌搜索结果的后几页徘徊&#xff0c;即使你已经优化了每一个网页&#xff1f; 有时候&#xff0c; 慢速的网站性能可能是罪魁祸首。 如果这个问题引起了你的共鸣&#xff0c;那么你可能想要探索一下内容分发网络&#xff08;Content…

Android平台通过RTSP服务实现摄像头麦克风共享

技术背景 前些年&#xff0c;我们在完成Android平台RTMP直播推送模块后&#xff0c;遇到这样的技术需求&#xff0c;好多开发者希望在Android平台&#xff0c;实现摄像头和麦克风音视频数据采集编码打包后&#xff0c;对外提供RTSP&#xff08;Real Time Streaming Protocol&a…

【DEV工具-IDEA】新建springboot项目,无法选择java8?

问题&#xff1a;新建springboot项目&#xff0c;无法选择java8。 #解决&#xff1a; 替换为 &#xff1a;https://start.aliyun.com

基于蜣螂优化最小二乘支持向量机的数据分类预测Matlab程序DBO-LSSVM 多特征输入多类别输出 含基础程序

基于蜣螂优化最小二乘支持向量机的数据分类预测Matlab程序DBO-LSSVM 多特征输入多类别输出 含基础程序 文章目录 一、基本原理DBO&#xff08;Dung Beetle Optimization&#xff09;算法原理LSSVM&#xff08;Least Squares Support Vector Machine&#xff09;模型原理DBO-LSS…

【C#跨平台开发详解】C#跨平台开发技术之.NET Core基础学习及快速入门

1. C#与.NET的发展历程 C#是由Microsoft开发的现代编程语言&#xff0c;最初伴随着.NET Framework发布。随着技术的进步&#xff0c;特别是针对跨平台开发的需求&#xff0c;Microsoft推出了.NET Core&#xff0c;这是一个开源且跨平台的框架&#xff0c;支持Windows、macOS和…

微信小程序手写签名

微信小程序手写签名组件 该组件基于signature_pad封装&#xff0c;signature_pad本身是web端的插件&#xff0c;此处将插件代码修改为小程序端可用。 signature_pad.js /*!* Signature Pad v5.0.3 | https://github.com/szimek/signature_pad* (c) 2024 Szymon Nowak | Releas…

Windows10 安全加固之禁止光驱、U盘等自动播放

在使用Windows10系统的电脑中插入插入光盘或者U盘时,默认是自动播放的,这样会引入一些可能不安全的因素。因此,为了系统安全,有必要禁止光驱、U盘等自动播放。具体方法如下: 方法一:通过设置页面关闭 第1步:单击win10系统的“开始”菜单->“设置”,打开“windows设…

算法:区间dp

文章目录 一、适用场景二、基本思路步骤时间复杂度&#xff1a; 三、例题 区间动态规划&#xff08;Interval DP&#xff09;是一种用于解决某些需要处理区间或子段问题的动态规划方法&#xff0c;特别适合于问题的解可以通过子区间的解进行组合的情况。该方法的核心思想是在子…

pico手柄和人物模型手部旋转同步,实现手柄控制手臂手部位置移动、手部旋转和手指的操作了

这里的主要内容就是下述代码&#xff1b; // 获取左手控制器的旋转&#xff08;四元数表示&#xff09;Quaternion aRotationQuaternion leftHandController.rotation;// 计算旋转差值&#xff08;四元数表示&#xff09;Quaternion rotationDifference Quaternion.Euler(0, …

Qt创建项目及相关问题

文章目录 1. Qt项目创建2. 认识项目代码main.cppwidget.hwidget.cppwidget.ui.pro构建过程生成的中间文件 3. Hello World程序图形化方式创建代码方式创建内存泄漏问题编辑框方式创建按钮方式创建 4. 对象树引入对象树原因对象树自动释放对象实验演示 5. 乱码问题 1. Qt项目创建…

Databend 产品月报(2024年8月)

很高兴为您带来 Databend 2024 年 8 月的最新更新、新功能和改进&#xff01;我们希望这些增强功能对您有所帮助&#xff0c;并期待您的反馈。 Kafka Connect Sink Connector 插件 我们推出了一种将 Kafka 连接到 Databend 的新方式&#xff1a;databend-kafka-connect&#…

2023Idea版本无法下载通义灵码插件以及无法登录问题

进入下载插件处 在插件主页安装时&#xff0c;通常会根据当前自己访问的IDEA版本推荐合适的插件版本&#xff0c;所以最终会安装成功 idea中通义灵码插件无法登录问题

书客、松下、飞利浦护眼台灯怎么样?测评寻找护眼台灯天花板!

大家好&#xff0c;我是专注在护眼领域的一名评测师&#xff0c;长期以来&#xff0c;我致力于探索并体验各类能保护视力健康的护眼产品。今天&#xff0c;我来和大家分享我对护眼台灯的深入评测。护眼台灯作为日常学习生活的一部分&#xff0c;视觉体验的好坏往往取决于所选用…

Pygame中获取鼠标按键状态的方法

在《Pygame中获取鼠标位置的方法》中提到&#xff0c;可以通过鼠标事件和mouse模块中的函数获取鼠标位置&#xff0c;这两种方法同样适用于获取鼠标按键状态。 1 通过鼠标点击事件获取鼠标按键状态 通过鼠标点击事件获取鼠标按键状态的代码如图1所示。 图1 鼠标点击事件获取鼠…

HRGraph: 利用大型语言模型(LLMs)构建基于信息传播的HR数据知识图谱与职位推荐

知识图谱&#xff08;KGs&#xff09;作为语义网络&#xff0c;在管理不同领域复杂互联数据方面表现出极高的有效性&#xff0c;通过提供统一、上下文化和结构化的表示&#xff0c;具有灵活性&#xff0c;能够轻松适应不断发展的知识。在处理复杂的人力资源&#xff08;HR&…

RP2040 C SDK RTC功能使用

RP2040 C SDK RTC功能使用 &#x1f4cd;《RP2040 C SDK串口功能使用》&#x1f955;RP2040 RTC API官方文档说明&#xff1a;https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_rtc&#x1f955;官方例程参考&#xff1a;https://github.com/…