shell ——正则表达式三剑客+三个shell小工具

1.概述

正则表达式,又称规则表达式。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

1.1 基础元字符

 \  :转义字符,用于取消特殊符号的含义,如:\!\$
 ^ :匹配字符串开始的位置,如:^root 匹配以root开头的行,
 $ :匹配字符串结束的位置,如:world$匹配以world结尾的行
 . :匹配除\n外的任意一个字符
 * :匹配前面的子表达式0次或者多次
[  ] : 匹配[   ]中的一个字符,如:[0-9]匹配任意一个数字
[^] :匹配不在[  ]中的任意一个字符,如:[^0-9]匹配任意一个非数字字符
\{n\} :匹配前面子表达式n次,如:[0-9]\{2\}匹配两位数字
\{n,m\} :匹配前面的子表达式n到m次,如:[a-z]\{2,3\}表示匹配两到三位小写字母
\{n,\} :匹配前面的子表达式不少于n次,如:[0-9]\{2,\}表示两位及两位以上数字
\< : 匹配以……开头的行
\> : 匹配以……结尾的行
\<……\> : 匹配某一个单词的行

1.2 拓展元字符

 + :匹配前一个字符1个或多个,如:go+d,将匹配至少一个o
 ? :匹配0个或1个字符,如:go?d,将匹配到gd或god
 | :或
() : 将括号中的字符串作为一个整体
{n} : 前一个字符重复n次
{n,} : 前一个字符至少重复n次
{n,m} : 前一个字符出现n-m次

2.grep+egrep

grep是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep
linux使用GNU版本的grep。它功能更强,它也可以通过-E命令行选项来使用egrep功能

grep -v “text” :过滤掉包含text的内容查看剩下的文件内容
grep “text” :查看文件中包含text的行
grep “^q” :查看文件中以q开头的内容
grep “g$” :查看以g结尾的文件内容
grep “q*” :这里*代表前面一个字母出现0次或多次
grep -v “^$” :过滤掉文件里的空行
grep[rR]oot” :[]里表示R或r的字母,相当于查找包含root或Root的文件内容
grep -E “^root|Root$” 文件 :-E代表引入正则,这里的|代表或的意思,这条命令表示查找以root开头Root结尾的文件内容
grep -E也可以直接写egrep
grep -c :显示有几行
grep -w “text” :只找text这个单词的文件内容
grep -i  :忽略大小写查看文件内容
grep -o “text”  :只以行显示text这个字符

3. sed

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

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

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

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

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

常用选项:

-e	进行多次编辑
-n	取消默认输出
-f	指定sed文件名
-i	直接在源文件中修改
-r	使用扩展正则表达式

常用操作:

p	打印输出
d	删除指定行
c	替换指定行所有内容
s	搜索替换
g :表示只要符合条件,全部进行处理
r :可以将另一个文件内容读取到文件中
w :可以将另一个文件内容覆盖到文件中
i :插入,在当前行上面插入一行或多行
a :插入,在当前行后面插入一行或多行
y :字符转换

语法格式:
sed命令+选项 ‘定位+动作+内容’ 文件名

3.1 例如打印输出:

//单引号里不指定任何操作它会把文件从第一行打印到最后一行
[root@server ~]# sed '' passwd.txt 
//如果使用‘p’它会重复显示每一行,因为它默认会打印一遍,然后又得到你的指定是打印,它就又打印一遍
[root@server ~]# sed 'p' passwd.txt 
//一般是结合-n 一起使用没比较清晰
[root@server ~]# sed -n 'p' passwd.txt
[root@server ~]# sed -n '2p' passwd.txt //打印第二行
[root@server ~]# sed -n '1,4p' passwd.txt //打印1-4行
[root@server ~]# sed -n '1p' passwd.txt //打印第一行
[root@server ~]# sed -n '$p' passwd.txt //打印最后一行
[root@server ~]# sed -n '/root/p' passwd.txt //打印包含root的行
[root@server ~]# sed -n '/^root/p' passwd.txt //打印以root开头的行
[root@server ~]# sed -n '/nologin/!p' passwd.txt 
//打印不含有nologin的行
[root@server ~]# sed -n '/root/=;/root/p' passwd.txt
//打印root所在行的行号和内容,多个操作中间加分号隔开
[root@server ~]# sed -n '/^$/p' 文件名 //打印空行
[root@server ~]# sed -n '/ /p' 文件名  //打印有空格的行

3.2 例如添加内容:

[root@server ~]# sed -n '1a hello world' passwd.txt //在第一行后面添加一行为hello world
[root@server ~]# sed -n '3i hello' passwd.txt  //在第三行前面添加一行为hello

3.3 例如删除内容:

[root@localhost ~]# sed -n '3d' passwd.txt  //删除第三行
[root@localhost ~]# sed -n '2,4d' passwd.txt //删除第2到第4行
[root@localhost ~]# sed -n '$d' passwd.txt  //删除最后一行
[root@localhost ~]# sed -n '/root/!d' passwd.txt //删除不包含root的行
[root@localhost ~]# sed -n '/^root/d' passwd.txt //删除以root开头的行

3.4 例如修改内容:

[root@server ~]# sed '/^root/ckgc' passwd.txt //把以root开头的行整行替换为kgc
[root@server ~]# sed '1,3ckgc' passwd.txt //把1-3行内容全部替换为kgc

3.5 例如查找替换

格式:sed 选项 ‘s/搜索的内容/替换的内容/动作’

[root@server ~]# sed -n 's/root/ROOT/p' passwd.txt //搜索root所在行把第一个出现的root换成ROOT
[root@server ~]# sed -n 's/root/ROOT/gp' passwd.txt //搜索root所在行,把所有出现的root都替换成ROOT
[root@server ~]# sed  -n '1,5s/^/#/gp' /etc/passwd//1-5行开头插入#号
[root@server ~]# sed -n 's/^#/hello world /gp' passwd.txt//把#号开头的行的#号换成hello world

//搜索以sync开头的行并且前面加#号,那就需要保留sync,那就要把搜索的字符写成&就会被保留不会一起替换,观察不加&的区别

[root@server ~]# sed -n 's/^sync/#&/gp' passwd.txt 
#sync:x:5:0:sync:/sbin:/bin/sync
[root@server ~]# sed -n 's/^sync/#/gp' passwd.txt 
#:x:5:0:sync:/sbin:/bin/sync

3.6 例如插入其他内容

H:复制到剪切板
g、G:将剪切板的数据覆盖/追加到指定行
w:保存为文件
r:读取指定文件
a:追加指定文件

[root@server ~]# sed '3r /etc/hosts' passwd.txt //将/etc/hosts文件插入到第三行后面
[root@server ~]# sed -n '1,5w 22.txt' passwd.txt //把1-5行内容写入到22.txt文件
[root@server ~]# sed = passwd.txt//显示行号

修改源文件的本质其实就是将-n换成-i,-i不要和‘p’同时使用,-n和-i也不要一起使用

3.7 sed脚本

要对一个文件进行多个操作,为了方便和效率,可以将要执行的sed命令逐行写进sed脚本里面,然后用sed -f来指定脚本名对指定的文件进行操作

[root@server ~]# vim test.sh

#!/bin/sed -f
s/root/ROOT/g
s/^#//g
s/\/sbin\/nologin/kgc/g

sed脚本文件第一行要声明#!/bin/sed -f
不要加单引号
每行的最后不能有空格等多余字符
#号开头为注释
一行有多个命令时用分号隔开

4. awk

awk本身是一种编程语言,主要用于unix/linux里对文本进行处理,也是一个工具。awk处理数据也是逐行扫描文件,从第一行到最后一行,寻找匹配特定模式的行,在这些行上进行你所要的操作,如果没有处理动作,它也会显示到标准输出(屏幕)如果没有指定模式,那么对所有的行进行处理。我们现在所用的awk其实是gawk

4.1 格式:

格式 :awk 选项 命令部分
awk '{print}' 文件名 :打印文件所有内容
awk '{print "'$变量名'"}'  :引入awk外部变量

4.2 内建变量:

NF :显示列数
NR :显示行号
$0 :处理整行内容
$n :这里n是一个数字,表示处理第n列内容
FS :指定分隔符
OFS :指定输出时文本列之间的连接符
RS :指定每行之间的分隔,如:RS : ,表示在冒号那里就会分行
ORS :指定每行之间连接型

RS是记录分割,默认是按换行符为一行内容的,而FS是以字段分割,注意区别!
RS意思是遇见谁就把它当做一行的分隔符,然后输出内容
ORS意思是本来每一行的分隔符是换行符,现在不想以换行符当做一行的分割,想以空格当每一行的间隔,那么ORS=“ ”就可以了

花括号里print后面要跟变量,如果不是变量其他任何字符都需要用双引号引起来,你想打印什么它就会输出什么花括号里print后面要跟变量,如果不是变量其他任何字符都需要用双引号引起来,你想打印什么它就会输出什么

[root@server ~]# awk -F: '{print $1}' passwd.txt //以冒号分隔,打印第一列内容
[root@server ~]# awk -F: '{print $1,$2}' passwd.txt //以冒号分隔,打印第一列和第二列内容
[root@localhost ~]# awk -F: '{print $1"hhh"$2}' passwd.txt //用引号引起可以输出常量
[root@server ~]# awk BEGIN'{FS=":";OFS="--"} {print $1,$2}' passwd.txt 
//以冒号分隔,字段输出符为–,打印第一列和第二列
[root@localhost ~]# awk -F: '{print NF}' passwd.txt //以冒号为分隔符查看每行有多少列
[root@localhost ~]# awk -F: '{print $NF}' passwd.txt   
// NF前加$表示显示最后一列,可以理解为先NF显示每行的列数,然后以这列数打印,就相当于打印每行的最后一列
[root@localhost ~]# awk -F: '{print NR}' passwd.txt //打印行数
[root@localhost ~]# awk -F: '{print NR,$0}' passwd.txt //显示行号打印所有内容
[root@localhost ~]# awk '(NR%2)==1{print}' passwd.txt //输出奇数行
[root@localhost opt]# awk 'BEGIN{RS=""};END{print NR}' passwd.txt
//统计以空行分隔的文本段落数
[root@server ~]# awk -F: '{printf "%-15s %-10s %-15s\n",$1,$2,$3}' passwd.txt //打印第一列第二列和第三列并对齐
 

printf默认是不换行的,所以要加上\n
%s表示字符类型,%d表示数值类型,%f表示浮点型
%-15s表示字符输出宽度一共15个字符,不足用空格不足到15位。
-表示左对齐,默认不加是右对齐
这样做的方式是可以使格式对齐

4.3 进行条件匹配

[root@localhost ~]# awk -F: '/^bin/{print}' pp.bak          //打印以bin开头的
[root@localhost ~]# awk -F: '/bin/{print}' pp.bak           //打印包含bin的
[root@localhost ~]# awk -F: '$1~/bin/{print $NF}' pp.bak 
//模糊匹配第一列里含bin的行并打印其最后一列,在~前面加!表示不匹配含bin的行
[root@localhost ~]# awk 'NR<3 || NR>5{print NR,$0}' pp.bak        //打印行号小于3或大于5的行
[root@localhost ~]# awk 'NR>3 && NR<6{print NR,$0}' pp.bak         //打印行号大于3且小于6的行

[root@localhost ~]# awk -F: '{if($3<4){print $0}}' pp.bak    //如果第三列的uid小如4就打印

4.4 进行运算

[root@localhost ~]# awk 'BEGIN{print 1+1}'
2
[root@localhost ~]# awk 'BEGIN{print 2^3}'
8
[root@localhost ~]# awk 'BEGIN{print 2/3}'
0.666667
[root@localhost ~]# awk 'BEGIN{x=2;x++;print x}'
3

4.5 awk 与sed 的区别

sed操作指令置于’'中,awk比sed多一个{}

sed[选项] '操作' 参数
awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2

一般输出关于段,列的信息使用awk,其他的使用sed或grep更加方便

awk输出的奇偶行都使用绝对路径

sed输出的奇偶行都使用相对路径

使用awk调用shell命令,统计数量时,n是个变量,可自定义

若没有定义n的初始值,则n=0

awk判断条件中双引号之间的内容,如果有特殊符号不需要使用转义符

FS在{}中间使用,F在{}外面使用

5. sort 工具

sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序
格式:

sort [选项] 参数

参数:

-f:忽略大小写
-b:忽略每行前面的空格
-M:按照月份进行排序
-n:按照数字进行排序
-r:反向排序
-u:等同于 uniq,表示相同的数据仅显示一行
-t:指定分隔符,默认使用[Tab]键分隔
-o <输出文件>:将排序后的结果转存至指定文件
-k:指定排序区域

详细操作:

'将/etc/passwd 文件中的账号进行排序,根据行首字母顺序排序'
[root@localhost ~]# sort /etc/passwd
'将/etc/passwd 文件中第三列进行反向排序,根据第三列第一个字符的顺序排序'
[root@localhost ~]# sort -t ':' -rk 3 /etc/passwd 
'将/etc/passwd 文件中第三列进行排序,并将输出内容保存至user.txt 文件中'
[root@localhost ~]# sort -t ':' -k 3 /etc/passwd -o user.txt 
[root@localhost ~]# cat user.txt

6. uniq工具

Uniq 工具在 Linux 系统中通常与 sort 命令结合使用,用于报告或者忽略文件中的重复行
格式:

uniq [选项] 参数

参数:

-c	进行计数
-d	仅显示重复行
-u	仅显示出现一次的行

详细操作:

'删除 testfile 文件中的重复行'
[root@localhost ~]# uniq testfile 
'删除 testfile 文件中的重复行,并在行首显示该行重复出现的次数'
[root@localhost ~]# uniq -c testfile 
'查找 testfile 文件中的重复行'
[root@localhost ~]# uniq -d testfile 

7. tr工具

tr 命令常用来对来自标准输入的字符进行替换、压缩和删除,可以将一组字符替换之后变成另一组字符
格式:

tr [选项][参数]

参数:

-c:取代所有不属于第一字符集的字符
-d:删除所有属于第一字符集的字符
-s:把连续重复的字符以单独一个字符表示
-t:先删除第一字符集较第二字符集多出的字符

详细操作:

[root@localhost opt]# echo "ABC" | tr 'A-Z' 'a-z'//将大写的字母换成小写的字母
[root@localhost opt]# echo "ABC" | tr -d 'B'//删除某个字符
[root@localhost opt]# echo "ABBBBBBBBC" | tr -s 'B'
//压缩输入中的重复字符(将多个重复变成一个)
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值