Shell编程之正则表达式与文本处理器

目录

引言

一、正则表达式

1、正则表达式定义

2、基础正则表达式(BRE)

3、扩展正则表达式(ERE)

二、文件处理器

1、grep

2、sed

3.awk

三、常用的文件工具

1、cut

2、sort 

3、uniq

4、tr

总结


引言

当学会了使用循环语句和函数的时候,灵活运用正则表达式,可以更快速、更高效的使用循环语句和函数,方便管理人员的操作。

一、正则表达式

1、正则表达式定义

(1)正则表达式,又称正规表达式、常规表达式。

(2)通常被用来检索、替换那些符合某个模式(规则)的文本。

(3)正则表达式不只有一种,而且LINUX中不同的程序可能会使用不同的正则表达式,如:grep sed awk egrep。

(4)使用字符串来描述、匹配一系列符合某个规则的字符串。

(5)正则表达式组成:

①普通字符:大小写字母、数字、标点符号及一些其他字符;

②元字符:在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式

2、基础正则表达式(BRE)

(1)基础正则表达式是常用的正则表达式部分。

(2)除了普通字符外,常用到以下元字符:

①\:转义符,将特殊字符进行转义,忽略其特殊意义a\.b匹配a.b,但不能匹配ajb,.被转义为特殊意义。

②^:匹配行首,^则是匹配字符串的开始^tux匹配以tux开头的行。

③$:匹配行尾,$则是匹配字符串的结尾tux$匹配以tux结尾的行。

④.:匹配除换行符\n之外的任意单个字符,awk则中可以ab.匹配abc或bad,不可匹配abcd或abde,只能匹配单字符。

⑤[]:匹配列表中的一个字符 例: go[ola]d,[abc]、[a-z]、[a-z0-9]。

⑥[^]:匹配任意不在列表中的一个字符 例: [^a-z]、[^0-9]、[^A-Z0-9]。

⑦*:匹配前面子表达式0次或者多次,例:goo*d、go.*d。

⑧\{n\} :匹配前面的子表达式n次,例:go\{2\}d、'[O-9]\{2\}'匹配两位数字。

⑨\{n,\}:匹配前面的子表达式不少于n次,例: go\{2,\}d、' [0-9]\{2,\}'匹配两位及两位以上数宁。

⑩\{n,m\}﹔匹配前面的子表达式n到m次,例: go\{2,3\)d、'[0-9]\{2,3\}'匹配两位到三位数字。

3、扩展正则表达式(ERE)

(1)扩展正则表达式是对基础正则表达式的扩充深化。

(2)扩展元字符:

①+的作用:重复一个或者一个以上的前一个字符。

示例:执行“egrep -n 'wo+d' test.txt”命令,即可查询"wood" "woood" "woooooood"等字符串。

②?的作用:零个或者一个的前一个字符。

示例:执行“egrep -n 'bes?t' test.txt”命令,即可查询“bet”“best”这两个字符串。

③|的作用:使用或者(or)的方式找出多个字符。

示例:执行“egrep -n 'of|is|on' test.txt”命令即可查询"of"或者"if"或者"on"字符串。

④()的作用:查找“组”字符串。

示例:“egrep -n 't(a|e)st' test.txt”。“tast”与“test”因为这两个单词的“t”与“st”是重复的,所以将“a”与“e”。列于“()”符号当中,并以“|”分隔,即可查询"tast"或者"test"字符串

⑤()的+作用:辨别多个重复的组。

示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思。

二、文件处理器

1、grep

(1)grep命令是文本搜索命令,它可以正则表达式搜索文本,也可从一个文件中的内容作为搜索关键字。

(2)grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。

(3)常用选项:

-a :将 binary 文件以 text 文件的方式搜寻数据;

-c :计算找到 '搜寻字符串' 的次数;

-i :忽略大小写的不同,所以大小写视为相同;

-n :顺便输出行号;

-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行;

--color=auto :可以将找到的关键词部分加上颜色的显示喔。
[root@localhost ~]# grep -n 'the' test.txt   //刷选文件中包含the的行
[root@localhost ~]# grep -vn 'the' test.txt    //刷选文件中不包含the的行
[root@localhost ~]# grep -in 'the' test.txt   //刷选文件中包含the的行,不区分大小写
[root@localhost ~]# grep -n 'sh[io]rt' test.txt   //刷选出文件中包含shirt或short字符串的行
[root@localhost ~]# grep -n 'oo' test.txt   //筛选出字符串中包含两个oo的行
[root@localhost ~]# grep -n '[^w]oo' test.txt   //筛选出除了w开头后面有两个o的字符串的行
[root@localhost ~]# grep -n 'ooo' test.txt   //筛选出包含三个o的字符串的行
[root@localhost ~]# grep -n 'ooo*' test.txt   //筛选出有两个o以上字符串的行
[root@localhost ~]# grep -n 'woo*d' test.txt   //筛选出wd中间至少有一个o的字符串的行
[root@localhost ~]# grep -n '[0-9]*' test.txt   //筛选出包含0-9中数字的字符串的行
[root@localhost ~]# grep -n 'o\{2\}' test.txt   //筛选出有连续两个o的字符串的行
[root@localhost ~]# grep -n 'wo\{2,5\}d' test.txt
[root@localhost ~]# grep -n 'wo\{2,\}d' test.txt
[root@localhost ~]# egrep -n 'wo+d' test.txt   //查询文件中wd中间有一个或以上的字符串的行
[root@localhost ~]# egrep -n 'bes?t' test.txt   //查询文件中包含bet或best字符的行
[root@localhost ~]# egrep -n 'of|is|on' test.txt   //查询文件中包含of或者is或者on字符的行
[root@localhost ~]# egrep -n 't(a|e)st' test.txt   //查询文件中包含tast或者test字符的行
[root@localhost ~]# egrep -n 'A(xyz)+C' test.txt   //查询文件中以A开头C结尾中间有一个以上xyz字符的行

2、sed

(1)sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输出处理的某些行。sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用于 Shell 脚本中,用以完成各种自动化处理任务。

(2)sed 的工作流程主要包括读取、执行和显示三个过程。

读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。

执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。

显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

(3)sed 命令常见用法

通常情况下调用 sed 命令有两种格式,如下所示。其中,“参数”是指操作的目标文件, 当存在多个操作对象时用,文件之间用逗号“,”分隔;而 scriptfile 表示脚本文件,需要用“-f” 选项指定,当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。

sed:①将文件里面的内容逐行取出数据放进模式空间;②在模式空间下匹配条件进行数据处理;③处理完数据之后再从模式空间中取出数据到屏幕上。

sed [选项] '操作' 参数

sed [选项] -f scriptfile 参数

(4)常用选项

-e:执行多个命令时使用,执行一个时可以省略

-n:只输出处理后的行,读入时不显示

-r:表示使用扩展正则表达式

-i:直接编辑文件,不输出结果

-f:用指定的脚本来处理输入的文本文件

匹配模式

a:追加 ,向匹配行后面插入内容

c:更改,更改匹配行整行的内容

i:插入,向匹配行前插入内容/忽略大小写(写在后面)

d:删除,删除匹配的内容

s:替换 ,替换掉匹配的内容

p:打印 ,打印出匹配的内容,通常与-n选项和用

=:用来打印被匹配的行的行号

n:读取下一行,遇到n时会自动跳入下一行

r,w:读和写编辑命令,r用于将其他文件内容读入本文件,w用于将匹配内容写入到其他文件

g:全局操作

q:退出
[root@localhost ~]# sed -n '3p' test.txt //显示第3行
[root@localhost ~]# sed -n 'p;n' test.txt //显示奇数行
[root@localhost ~]# sed -n 'n;p' test.txt //显示偶数行
[root@localhost ~]# sed -n '1,5{p;n}' test.txt //显示奇数行
[root@localhost ~]# sed -n '5,${p;n}' test.txt //显示奇数行
[root@localhost ~]# sed -n '6,${p;n}' test.txt //显示偶数行
[root@localhost ~]# sed -n '/the/p' test.txt //显示有the行
[root@localhost ~]# sed -n '4,/the/p' test.txt
[root@localhost ~]# sed -n '/the/=' test.txt
[root@localhost ~]# sed -n '/^PI/p' test.txt
[root@localhost ~]# sed -n '/\<wood\>/p' test.txt
[root@localhost ~]# sed -n -e 'p' 1.txt //显示打印所有内容
[root@localhost ~]# sed -n -e '=' 1.txt   //打印行号
[root@localhost ~]# sed -n -e 'l' 1.txt   //打印所有内容,包括非打印字符,以ASCII码输出
[root@localhost ~]# sed -n -e '=;p' 1.txt   //打印行号以及所有内容
[root@localhost ~]# sed -n -e '=' -e 'p' 1.txt

[root@localhost ~]# nl test.txt | sed '3d'		//删除第3行
[root@localhost ~]# nl test.txt | sed '3,5d'	//删除3-5行
[root@localhost ~]# nl test.txt | sed '/cross/d'	//删除包含cross的行
[root@localhost ~]# nl test.txt | sed '/cross/!d'	//删除不包含cross的行
[root@localhost ~]# sed  ‘/^[a-z]/d’  test.txt		//删除以小写字母开头的行
[root@localhost ~]# sed '/\.$/d' test.txt			//删除以.结尾的行
[root@localhost ~]# sed '/^$/d' test.txt			//删除空行

[root@localhost ~]# sed 's/the/THE/' test.txt		//将每行中的第一个the替换成THE
[root@localhost ~]# sed 's/l/L/2' test.txt			//将每行中的第2个l替换为L
[root@localhost ~]# sed 's/the/THE/g' test.txt		//将文件中的所有the替换为THE
[root@localhost ~]# sed 's/o//g' test.txt			//将文件中的所有o删除(替换为空串)
[root@localhost ~]# sed 's/^/#/' test.txt			//在每行行首插入#号
[root@localhost ~]# sed '/the/s/^/#/' test.txt		//在包含the的每行行首插入#号
[root@localhost ~]# sed 's/$/EOF/' test.txt			//在每行行尾插入字符串EOF
[root@localhost ~]# sed '3,5s/the/THE/g' test.txt	//将第3-5行中的所有the替换成THE
[root@localhost ~]# sed '/the/s/o/O/g' test.txt		//将包含the的所有行中的o都替换成O

[root@localhost ~]# sed '/the/{H;d};$G' test.txt	//将包含the的行迁移至文件末尾,{;}用于多个操作
[root@localhost ~]# sed '1,5{H;d};17G' test.txt		//将第1-5行内容转移到17行后
[root@localhost ~]# sed '/the/w out.file' test.txt	//将包含the的行另存为文件out.file
[root@localhost ~]# sed '/the/r /etc/hostname' test.txt		//将文件/etc/hostname的内容添加到包含the的每行以后
[root@localhost ~]# sed '3aNew' test.txt			//在第3行后插入一个新行,内容为New
[root@localhost ~]# sed '/the/aNew' test.txt		//在包含the的每行后插入一个新行,内容为New
[root@localhost ~]# sed '3aNew\nNew2' test.txt		//在第三行后插入多行内容,中间的\n表示换行
DNS脚本
[root@localhost ~]# vim BIND.sh

#!/bin/bash
rpm -q bind > /dev/null
if [ $? -ne 0 ];then
        yum install bind -y &> /dev/null
        systemctl start named
else
        systemctl start named
fi

sed -i '13s/127.0.0.1/192.168.32.128/' /etc/named.conf
sed -i '21s/localhost/any/' /etc/named.conf

sed -i '24azone "qaz.com" IN {\n        type master;\n        file "qaz.com.zone";\n        allow-update { none; };\n        };' /etc/named.rfc1912.zones 

cd /var/named
cp -p named.localhost qaz.com.zone

sed -i '2s/@ rname.invalid./qaz.com. admin.qaz.com./' qaz.com.zone
sed -i '8s/@/qaz.com./' qaz.com.zone
sed -i '9s/127.0.0.1/192.168.32.128/' qaz.com.zone
sed -i '10d' qaz.com.zone
sed -i '9aIN MX 10 mail.qaz.com.\nwww IN A 192.168.32.128\nftp IN A 192.168.32.128' qaz.com.zone

systemctl stop firewalld.service
setenforce 0 &> /dev/null

systemctl restart named

echo "nameserver 192.168.32.128" > /etc/resolv.conf
:wq

[root@localhost ~]# nslookup www.qaz.com
Server:		192.168.32.128
Address:	192.168.32.128#53

Name:	www.qaz.com
Address: 192.168.32.128

[root@localhost ~]# nslookup ftp.qaz.com
Server:		192.168.32.128
Address:	192.168.32.128#53

Name:	ftp.qaz.com
Address: 192.168.32.128

3.awk

(1)概述

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作,数据可以来自标准输入也可以是管道或文件,20世纪70年代诞生于贝尔实验室,现在CentOS7用的是gawk,之所以叫 AWK 是因为其取了三位创始人Alfred Aho,Peter Weinberger,和Brian Kernighan的Family Name的首字符。

(2)工作原理

当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出,如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执行多少次。

(3)命令格式

awk 选项 '模式或条件{操作}' 文件1 文件2 ...
awk -f 脚本文件 文件1  文件2 ..

(4)内置变量

FS:指定每行文本的字段分隔符,默认为空格或制表位。
NF:当前处理的行的字段个数。
NR:当前处理的行的行号(序数)。
$0:当前处理的行的整行内容。
$n:当前处理行的第 n 个字段(第 n 列)。
FILENAME:被处理的文件名。
[root@localhost ~]# awk  ‘{print}’  test.txt      //输出所有内容,等同于cat  test.txt
[root@localhost ~]# awk  ‘{print  $0}’  test.txt     //输出所有内容
[root@localhost ~]# awk  ‘NR==1,NR==3{print}’  test.txt   //输出第1~3行内容
[root@localhost ~]# awk  ‘(NR>=1)&&(NR<=3){print}’  test.txt    //输出第1~3行内容
[root@localhost ~]# awk  ‘NR==1 || NR==3{print}’  test.txt    //输出第1行第3行内容
[root@localhost ~]# awk  ‘(NR%2)==1{print}’  test.txt      //输出奇数行内容
[root@localhost ~]# awk  ‘(NR%2)==0{print}’  test.txt      //输出偶数行内容
[root@localhost ~]# awk  ‘/^root/{print}’  /etc/passwd     //输出以root开头的行
[root@localhost ~]# awk  ‘/nologin$/{print}’  /etc/passwd      //输出以nologin结尾的行
[root@localhost ~]# awk  ‘BEGIN  {x=0};/\/bin\/bash$/{x++};END {printx}’  /etc/passwd   //统计以/bin/bash结尾的内容
[root@localhost ~]# awk  ‘BEGIN{RS=””};END{print NR}’  test.txt   //统计以空行分隔的文本段落数

[root@localhost ~]# awk  ‘{print  $3}’  test.txt      //输出每行的第3个字段
[root@localhost ~]# awk  ‘{print  $1,$3}’  test.txt     //输出每行的第1、3个字段
[root@localhost ~]# awk  -F:  ‘$2==””{print}’  /etc/shadow    //输出密码为空的用户
[root@localhost ~]# awk  ‘BEGIN  {FS=”:”};$2==””{print}’  /etc/shadow   //输出密码为空的用户
[root@localhost ~]# awk  -F:  ‘$7~”/bash”{print  $1}’  /etc/passwd     //输出以冒号分隔且第7个字段中包含/bash的行的第1个字段
[root@localhost ~]# awk  -F:  ‘($7!=”/bin/bash”)&&($7!=”/sbin/nologin”){print}}’  /etc/passwd  //输出第7个字段即不为/bin/bash,也不为/sbin/nologin的所有行
[root@localhost ~]# awk  ‘($1~”nfs”)&&(NF==8){print  $1,$2}’  /etc/services     //输出包含8个字段且第1个字段中包含nfs的行的第1、2个字段

[root@localhost ~]# awk  -F:  ‘/bash$/{print  |  “wc  -l”}’  /etc/passwd     //调用wc  -l命令统计使用bash的个数,等同于grep  -c  “bash$”  /etc/passwd
[root@localhost ~]# awk  ‘BEGIN  {while  (“w”  |  getline)n++;{print  n-2}}’    //调用w命令,并用来统计在线用户数
[root@localhost ~]# awk  ‘BEGIN  {“hostname”  |  getline;print  $0}’    //调用hostname,并输出当前的主机名
[root@localhost /]# vim FW1.sh
#!/bin/bash
x=`awk '/Failed password/{ip[$11]++}END{for(i in ip){print i ","ip[1]}}' /var/log/secure`
for j in $x
do
        ip=`echo $j | awk -F "," '{print $1}'`
        num=`echo $j | awk-F "," '{print $2]'`

        if [ $num -ge 3 ] ; then
                echo "敬告!$ip访问本机失败了$num次,请尽快处理!"
        fi
done

三、常用的文件工具

1、cut

(1)使用说明:cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一,cut只擅长于处理单个字符为间隔的文本。

(2)选项

-b:按字节截取;
-c:按字符截取,常用于中文;
-d:指定以什么为分隔符截取,默认为制表符;
-f:通常和-d一起。
[root@localhost ~]# cat /etc/passwd | cut -d':' -f 1
root
bin
daemon
adm
lp

[root@localhost ~]# cat /etc/passwd | cut -d':' -f 3
0
1
2
3
4

[root@localhost ~]# cat /etc/passwd | cut -d':' -f1,3
root:0
bin:1
daemon:2
adm:3
lp:4

[root@localhost ~]# who | cut -b 3
o

[root@localhost ~]# who | cut -c 3
o

2、sort 

(1)是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序。例如数据和字符的排序就不一样。

(2)语法:sort [选项] 参数

(3)常用选项

-t:指定分隔符,默认使用[Tab]键或空格分隔
-k:指定排序区域,哪个区间排序
-n:按照数字进行排序,默认是以文字形式排序
-u:等同于 uniq,表示相同的数据仅显示一行,注意:如果行尾有空格去重就不成功
-r:反向排序,默认是升序,-r就是降序
-o:将排序后的结果转存至指定文件
[root@localhost etc]# sort passwd    //不加任何选项默认按第一列升序,字母的话就是从a到z由上而下显示
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologi
nbin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:993:988::/var/lib/chrony:/sbin/nologin
colord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin

[root@localhost etc]# sort -n -t: -k3 passwd     //以冒号为分隔符,以数字大小对第三列排序(升序)
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@localhost etc]# sort -nr -t: -k3 passwd   //以冒号为分隔符,以数字大小对第三列排序(降序)
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:995:daemon account for libstoragemgmt:/var/run/lsm:
/sbin/nologincolord:x:997:994:User for colord:/var/lib/colord:/sbin/nologin
gluster:x:996:993:GlusterFS daemons:/run/gluster:/sbin/nologin

[root@localhost etc]# sort -u passwd   //去掉文件中重复的行(重复的行可以是不连续的)

3、uniq

(1)主要用于去除连续的重复行

注意:是连续的行,所以通常和sort结合使用先排序使之变成连续的行再执行去重操作,否则不连续的重复行他不能去重。

(2)语法:uniq [选项] 参数

(3)常用选项

-c:对重复的行进行计数;
-d:仅显示重复行;
-u:仅显示出现一次的行
[root@localhost /]# cat fruit | uniq -c    //统计重复行的次数,不连续的重复行他不算做重复行
      2 apple
      1 peache
      1 pear
      1 banana
      2 cherry
      1 banana
      1 orange

[root@localhost /]# cat fruit | sort | uniq -c   //结合sort使用就是我们想要的效果
      2 apple
      2 banana
      2 cherry
      1 orange
      1 peache
      1 pear

[root@localhost /]# cat fruit | sort | uniq -d    //结合sort使用,过滤出重复行
apple
banana
cherry

[root@localhost /]# cat fruit | sort | uniq -u   //结合sort使用,过滤出不重复的行
orange
peache
pear

[root@localhost /]# cat fruit | sort | uniq    //结合sort使用,去重
apple
banana
cherry
orange
peache
pear

[root@localhost /]# cat fruit | sort -u    //也可以直接用sort -u
apple
banana
cherry
orange
peache
pear

4、tr

(1)它可以用一个字符来替换另一个字符,或者可以完全除去一些字符,也可以用它来除去重复字符。

(2)语法:tr [选项]… SET1 [SET2]

从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。

(3)常用选项

-d 删除字符
-s 删除所有重复出现的字符,只保留第一个
[root@localhost /]# cat fruit | tr 'apple' 'APPLE'    //替换是一一对应的字母的替换
APPLE
APPLE
PEAchE
PEAr
bAnAnA
chErry
chErry
bAnAnA
orAngE

[root@localhost /]# cat fruit | tr 'a' ' '   //把替换的字符用单引号引起来,包括特殊字符
 pple
 pple
pe che
pe r
b n n 
cherry
cherry
b n n 
or nge

[root@localhost /]# cat fruit | tr 'a' '/'
/pple
/pple
pe/che
pe/r
b/n/n/
cherry
cherry
b/n/n/
or/nge

[root@localhost /]# cat fruit | tr 'ap' '/'   //多个字符替换成一个
///le
///le
/e/che
/e/r
b/n/n/
cherry
cherry
b/n/n/
or/nge

[root@localhost /]# cat fruit | tr 'apple' 'star'   //a替换成s,p替换成a,le替换成r
saarr
saarr
arschr
arsr
bsnsns
chrrry
chrrry
bsnsns
orsngr

[root@localhost /]# cat fruit | tr "'" '/'   //如果想替换单引号则需要用双引号把单引号引起来,反斜杠转义也不行
apple
apple
peache
pear
banana
cherry
cherry
banana
orange

[root@localhost /]# cat fruit | tr -d 'a'   //删除所有a
pple
pple
peche
per
bnn
cherry
cherry
bnn
ornge

[root@localhost /]# cat fruit | tr -d 'apple'   //把所有含有这5个字母的都删除


ch
r
bnn
chrry
chrry
bnn
orng
[root@localhost /]# cat fruit | tr -d '\n'   //删除换行符
appleapplepeachepearbananacherrycherrybananaorange[root@localhost /]# 

[root@localhost /]# cat fruit | tr -s 'p'    //对p字符去重,只保留第一个
aple
aple
peache
pear
banana
cherry
cherry
banana
orange

[root@localhost /]# cat fruit | tr -s '\n'   //遇到多个回车只保留一个回车,相当于去除空行
apple
apple
peache
pear
banana
cherry
cherry
banana
orange

总结

1、正则表达式,又称正规表达式、常规表达式;用来检索、替换那些符合某个模式(规则)的文本,分为基础正则表达式(BRE)和扩展正则表达式(ERE)。

2、grep命令是文本搜索命令,它可以正则表达式搜索文本,也可从一个文件中的内容作为搜索关键字。

3、sed是文本处理工具,可以读取文本内容,根据指定条件对数据进行删除、替换、添加、移动等操作,被广泛应用于Shell脚本。

4、awk是一个功能强大的编辑安装工具,用于在Linux下对文本和数据进行处理。

5、常用的文件排序工具:cut、sort、uniq、tr。

上一篇:Linux三剑客之-sed


下一篇:(转)通过几个例子看sed的模式空间与保持空间