shell 中的grep sed awk命令

目录

一、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

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值