shell三剑客(grep,sed,awk)

目录

一.正则表达式

1.概述

2.正则表达式基本元字符

3. 正则表达式拓展元字符

 二.grep和egrep

1.基本实例

三.sed(流文本编辑器 )

sed流编辑器用法及解析

四.awk文本编辑器工具

awk常用内置变量

实例


一.正则表达式

1.概述

正则表达式(Regular Expression, RE)是一种字符模式, 用于在查找过程中匹配指定的字符. 在大多数程序里, 正则表达式都被置于两个正斜杠之间; 正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
 

2.正则表达式基本元字符

BRE和ERE的区别

基本正则表达式(BRE)和扩展正则表达式(ERE)的区别仅仅是元字符(meta charactor)的区别而已。
BRE: 只有^$.*[]是元字符
ERE: ^$.[]*+(){}?|都是元字符

^     :行首定位符,如:^root 匹配以root开头的行
$     :行尾定位符,如:world$匹配以world结尾的行
.     :匹配单个字符,如:r..t
*     :匹配前导符0到多次    全部匹配 grep "o*" /etc/passwd (o出现0次或多次)
.*     :匹配任意多个字符  (贪婪匹配
[]    :匹配方括号中任意一个字符
[^]    :匹配不在指定组里的字符    [^0-9]匹配除过0-9的字符
\      :转义字符,用于取消特殊符号的含义,如:\!、\$
\<     :词首定位符 #由数字或字母组成的    \<root
\>     : 词尾定位符      
\(\)    :匹配后的标签   # 在vim中测试
:%s@\(张三\) \(李四\) \(王五\)@ \3 \1 \2@g

3. 正则表达式拓展元字符

= 等于 != 不等于  =~  匹配
+    :匹配一个或多个前导字符   [a-z]+oot
?    :匹配零个或一个前导字符   
a|b    匹配a或b
()     :小括号可以将正则表达式的一部分括起来组成一个单元(也就是一个组),可以对整个单元使用数量限定符    如:(oo)+ 两个oo出现一次或者多个
x{m}    :字符x重复m次
o{,3}    :字符最多出现3次
x{m,}    :字符x重复至少m次
x{m,n}    :字符x重复m到n次

 二.grep和egrep

egrep 支持正则表达式的拓展元字符 (或grep  -E)

grep常用选项

-E:使grep支持扩展正则表达式,扩展选项为正则表达式,grep -E相当于egrep
-n:显示匹配的行的行号
-q:安静模式,也就是静默输出,不打印任何标准输出,如果有匹配的内容则立即返回状态值0
-v:取反(反向过滤)
-w:用于精确匹配
-R:搜索子目录
-i:不区分大小写针对单个字符
-o:只打印匹配到的字符
-c:显示有多少行被匹配到

1.基本实例

 * 0或多个    
[root@slave2 ~]# grep 'ro*' passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin

 \< 词首定位符号 \>词尾定位符号 
[root@newrain ~]# cat jack.txt 
Jack JACK JAck jackly
:% s/\<[Jj]ack\>/123/g

$以什么结尾
[root@newrain ~]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
confluence:x:1000:1000:Atlassian Confluence:/home/confluence:/bin/bash 
to:x:1003:1003::/home/to:/bin/bash

. 匹配单个字符
[root@newrain ~]# grep 'r..t' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 

[] 匹配方括号中的任意一个字符
[root@newrain ~]# grep 'Root' /etc/passwd
[root@newrain ~]# grep '[Rr]oot' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin

            扩展正则

1、+ 匹配一个或多个前导字符
[root@newrain ~]# egrep 'ro+t' /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin
2、? 匹配零个或一个前导字符
[root@newrain ~]# egrep 'ro?t' /etc/passwd 
abrt:x:1041:1041::/home/abrt:/bin/bash

3、a|b    匹配a或b
[root@newrain ~]# netstat -anlp|egrep ':80|:22'
[root@newrain ~]# egrep 'root|alice' 
/etc/passwd root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin 
dockerroot:x:998:995:Docker User:/var/lib/docker:/sbin/nologin

4、x{m} 字符x重复m次 
[root@newrain ~]# cat a.txt
love
love.
loove
looooove 
[root@newrain ~]# egrep 'o{2}' a.txt
loove
looooove 
[root@newrain ~]# egrep 'o{2,}' a.txt
loove
looooove 
[root@newrain ~]# egrep 'o{6,7}' a.txt

三.sed(流文本编辑器 )

sed是一种流编辑器,它是文本处理中非常适中的工具,能够完美的配合正则表达式使用,功能不同凡响。

sed   "参数"    '模式'   文件

参数:

        -e使用指定脚本来处理输入的文本文件
        -f指定一个规则文件 需求复杂的时候,需要匹配的内容多
        -i直接修改文件内容,而不输出到终端。使用时-i.bak备份原文件。
        -r扩展正则,将匹配不到的现在可以匹配到了
        -n阻止输入行输出,仅显示脚本处理后的结果

模式 :

1 s 替换  2 g 整行(也可以是数字,替换第几个) 3 d 删除 4 p 打印 5 a 追加 6 i 是插入

[root@web-server ~]# cat rule.sed 
/root/d
[root@web-server ~]# sed -f rule.sed  passwd                #-f指定规则文件

sed流编辑器用法及解析

1.删除   模式 d

删除sshd配置文件的注释和空行

sed '/^#.*/d;/^$/d' /etc/ssh/sshd_config
sed '1d' passwd     //删除文件的第1行
sed '1,2d' passwd   //删除文件的第1到2行
sed '2,$d' passwd       //删除第2行到最后一行
sed '/root/d' passwd    //匹配到root,删除此行
sed '/root/,2d' passwd  //匹配到root行,到某一行
sed '1~2d' passwd   //删除奇数行
sed '0~2d' passwd    //删除偶数行
 sed '/root/d' passwd    ##删除匹配到root的行
sed '1d;2d' passwd     ##删除第一行和第二行

2.添加     模式 a(在下一行加入)  i(在上一行加入)

[root@web-server ~]# sed  4a\hello  passwd    //在第四行后添加hello
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
hello
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

[root@web-server ~]# cat -n passwd | sed -e '2a hello nginx \    //添加多行
> nginx \
> mysql'
     1	root:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
hello nginx 
nginx 
mysql

3.替换  (s/aaa/bbb/g)

[root@web-server ~]# sed 's/root/ROOT/g' passwd  ##替换全部的root为ROOT
ROOT:x:0:0:ROOT:/ROOT:/bin/bash

[root@web-server ~]# sed 's/pattern/replace_string/gi' filename //忽略大小写替换

sed中的分隔符可以替换成别的字符, 因为s标识会认为后面的字符为分隔符

sed 's:text:replace_text:'
sed 's|text|replace_text|'

4.打印        参数 -n   模式 p

如果不加-n参数,就会将流入和流出的都打印。

[root@web-server ~]# sed -n '1p' passwd   ## 打印第一行
root:x:0:0:root:/root:/bin/bash

[root@web-server ~]# sed -n '1,4p' passwd        ##打印1到4行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

5.插入  -i(直接修改文件内容,而不输出到终端)

[root@web-server ~]# sed -i  '1a hello shell ' passwd   ##在第一行后文件中插入
[root@web-server ~]# head -5 passwd
root:x:0:0:root:/root:/bin/bash
hello shell 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

由于在使用 -i 参数时比较危险, 所以我们在使用i参数时在后面加上.bak就会产生一个备份的文件,以防后悔   

sed -i.bak 's/pattern/replace_string/' filename

四.awk文本编辑器工具

简介:
awk是行处理器,相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息。

awk 参数  'BEGIN{处理之前要做的} {处理内容} END{处理之后的内容}'
BEGIN{} {}     行处理前
END{}            行处理 行处理后

BEGIN{}          在处理文本之前做的事情,只执行一次
{}          在处理文本是做的事情,有多少次执行多少次
awk 'BEGIN{i=1}{print i++}' /etc/passwd
END{}          在处理文之后做的事情,只执行一次

awk工作原理
awk -F":" '{print $1,$3}' /etc/passwd 
(1)awk使用一行作为输入,并将这一行赋给变量$0,每一行可称作为一个记录,以换行符结束
(2)然后,行被:分解成字段,每个字段存储在已编号的变量中,从$1开始 
(3)awk如何知道空格来分隔字段的呢?因为有一个内部变量FS来确定字段分隔符,初始时,FS赋为空格或者是tab 
(4)awk打印字段时,将以设置的方法,使用print函数打印,awk在打印的字段间加上空格,因为$1,$3间有一个,逗号。逗 号比较特殊,映射为另一个变量,成为输出字段分隔符OFS,OFS默认为空格 
(5)awk打印字段时,将从文件中获取每一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程持续到处理文件结束。

awk常用内置变量
NF浏览记录域的个数(表示字段数量, 当awk将行为记录时, 该变量相当于当前列号)
FS(输入字段分隔符)   # 以什么符号去分割
OFS(输出字段分隔符)  # 以什么分隔符显示
NR已读的记录数(行数)
FNR浏览文件的记录数
RS输入记录分隔符
ORS输出记录分隔符
实例
FS(输入字段分隔符)
awk 'BEGIN{FS=":"}{print $1,$2}' passwd             ##以:为分隔符打印第一和第二列数据
root x
hello shell

OFS(输出字段分隔符)
awk 'BEGIN{FS=":";OFS="##"}{print $1,$2}' passwd    ##以##为分隔符打印第一和第二列数据
root##x
hello shell ##
bin##x
daemon##x

NR 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号
awk -F: '{print NR,$0}' passwd
1 root:x:0:0:root:/root:/bin/bash
2 hello shell 
3 bin:x:1:1:bin:/bin:/sbin/nologin

FNR 表示记录编号, 当awk将行为记录时, 该变量相当于当前行号(不同文件分开)
awk '{print FNR,$0}' passwd aaa
1 root:x:0:0:root:/root:/bin/bash
2 hello shell 
3 bin:x:1:1:bin:/bin:/sbin/nologin
4 daemon:x:2:2:daemon:/sbin:/sbin/nologin
5 adm:x:3:4:adm:/var/adm:/sbin/nologin
1 lisi
2  wangwu
3  zhangsan 


ORS(输出记录分隔符)
[root@web-server ~]# cat passwd
root:x:0:0:root:/root:/bin/bash
hello shell 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@web-server ~]# awk 'BEGIN{ORS=""}{print $0}' passwd
root:x:0:0:root:/root:/bin/bashhello shell bin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologin





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"Shell三剑客"指的是在Linux/Unix系统下使用最广泛的三个命令行工具:grepsedawk。它们都是文本处理工具,可以用于快速搜索、替换和处理大量文本数据。 1. grep:用于在文件中搜索指定的文本模式,并将匹配的行打印出来。常用的选项包括: - -i:忽略大小写。 - -r:递归地搜索目录中的所有文件。 - -v:输出未匹配的行。 - -w:只匹配整个单词,而不是部分匹配。 示例:搜索包含特定单词的行,例如:`grep "hello" file.txt` 2. sed:用于在文件中进行文本替换和编辑操作。它可以通过正则表达式来查找和替换文本,并且可以将修改后的内容输出到屏幕或保存到文件中。常用的选项包括: - -i:直接修改文件,而不是输出到屏幕。 - -e:在命令行中指定多个编辑命令。 - -n:不输出模式空间的内容。 示例:将文件中所有的"foo"替换为"bar",并将修改后的内容保存回原文件中:`sed -i 's/foo/bar/g' file.txt` 3. awk:用于处理文本文件的数据,可以将文件的内容分割成多个字段,并可以对每个字段进行操作。它使用类似于C语言的语法,并且可以通过条件和循环来过滤和处理数据。常用的选项包括: - -F:指定分隔符。 - -v:定义变量。 - -f:指定脚本文件。 示例:将文件中第一列数字相加,并输出总和:`awk '{sum += $1} END {print sum}' file.txt` 这些命令通常被组合使用,以便快速处理文本数据。例如,使用grep查找文件中特定的文本模式,然后使用sed对文本进行替换,最后使用awk对数据进行分析和汇总。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值