shell 正则表达式与grep、sed、awk三剑客

正则表达式概述

1. 正则表达式

  1. 是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。正则表达式是由普通字符与元字符组成的文字模式。

2.正则表达式的用途

  1. 正在表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些事非常重要的,有些则只是告知的信息,身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户登录失败”等信息,这是可以通过正则表达式快速提取有问题的信息,如此一来,可以将运维工作变得更佳简单、方便。

3.正则表达式的分类

  1. 正则表达式的字符串表达方法根据不同的严谨程度与功能分为基本正则表达式与扩展正则表达式,基础正则表达式是常用正则表达式最基础的部分,再Linux系统中常见的文件处理工具中grep与sed支持基础正则表达式,而egrep与awk支持扩展正则表达式。

2.基础正则表达式

1.基础正则表达式元字符

^ :匹配输入字符串的开始位置。除非在方括号表达式中使用,代表不包含该字符集合。要匹配“^”字符本身,请使用“\”

$ :匹配输入字符串的结尾位置。如果设置了RegExp(正则表达式)对象的Multiline(多个)属性,则“$”也匹配‘\n’或‘\r’(换行)。
要匹配"$"字符本身,请使用“\$”

.:匹配除了“\n\r”之外的任何单个的字符

\:反斜杠,又叫转义字符,去除其紧跟的元字符或通配符的特殊意义。

*:匹配前面的子表达式零次或多次。要匹配“*”字符,请使用“\*”

[]:字符集合。匹配所包含的任意一个字符。例如,“[abc” 可以匹配“plain” 中的“a”

[^ ]:赋值字符集合。匹配未包含的一个任意字符。例如,“[^abc]”可以匹配“plain”中任何一个字母

[n1-n2]: 字符范围。匹配指定范围内的任意一个字符。例如,“[a-z]” 可以匹配“a”到“z”范围内的任意一个小写字母字符。

注意:只有连字符(-)在字符组内部,并且出现在两个字符之间时,才能表示子符的范围;如果出现在字符组的开头,则只能表示连字符本身

{n}: n是一个非负整数,匹配确定的n次。例如,“o{2}"不能匹配“Bob” 中的“o”,但是能匹配“food”中的“oo”

{n,}: n是一个非负整数,至少匹配n次。例如,“o{2,}”不能匹配“Bob” 中的“o”,但能匹配“fooood”中的所有o。

“o{1,}”等价于“o+”(至少出现1次)。“o{0,}”则等价于“o*"(至少出现0次)

{n,m}: m和n均为非负整数,其中n<=m, 最少匹配n次且最多匹配m次

1. grep

常用选项

-n             表示显示行号
-i             表示不区分大小写
-v             表示过滤
[ ]            查找集合字符
  1. 实例

    grep -n 'the' test.txt        查找包含the的字符
    grep -in 'the' test.txt       不区分大小写查找包含the的字符
    grep -vn 'the' test.txt       查找不包含the的字符
    grep -n 'sh[io]t' test.txt    利用中括号[ ]来查找集合字符
    grep -n 'oo' test.txt         查找包含重复单个字符oo时
    grep -n '[^w]oo' test.txt     查找oo前面不是w的字符串
    grep -n '[^a-z]oo' test.txt   查找oo前面不是小写字母的字符串
    grep -n '^[a-z]' test.txt     查询以小写字母开头的行
    grep -n '^[a-zA-Z]' text.txt  查询不以字母开头的行
    grep -n '.$' test.txt         查询以 . 结尾的行
    grep -n 'ooo*' test.txt       查找至少两个o的内容
    grep -n 'woo*d' test.txt      查询以w开头d结尾,中间至少一个o
    grep -n 'w.*d' test.txt       查询以w开头d结尾,中间字符可有可无
    grep -n 'o{2}' test.txt       查询两个o的字符
    grep -n 'wo{2,}d' test.txt    查询以w开头d结尾,中间包含两个及两个以上o
    

2. sed

sed [选项] ‘操作’ 参数
常用选项

   -e script :指定sed编辑命令
   -f scriptfile :指定的文件中是sed编辑命令
   -h :显示帮助
   -n :表示仅显示处理后的结果
   -i :直接编辑文本文件
   操作的基本命令如下:
   a :增加,在当前行下面增加一行指定内容
   c :替换,将选定行替换为指定内容
   d :删除,删除选定的行
   i :插入,在选定行上面插入一行指定内容
   p :打印
   s :替换,替换指定字符
   y :字符转换
   H :复制到剪切板
   g、G :将剪贴板中的数据覆盖/追加到指定行
   w :保存为文件
   r :读取指定文件
  1. 实例

    sed -n '3p' test.txt                 输出第三行
    sed -n '3,5p' test.txt               输出第3-5行
    sed -n 'p:n' test.txt                输出所有奇数行
    sed -n 'n:p' test.txt                输出所有偶数行
    sed -n '1,5{p:n}' test.txt           输出第1-5行之间的奇数行
    sed -n '10,${n:p}' test.txt          输出第10行之后的偶数行
    sed -n '/the/p' test.txt             输出包含the的行
    sed -n '4,/the/p' test.txt           输出从第4行的第一个包含the的行
    sed -n '/^PI/p' test.txt             输出以PI开头的行
    sed -n '/[0-9]$/p' test.txt          输出以数字结尾的行
    sed -n '/<wood>/p' test.txt          输出包含wood的行
    sed '3d' test.txt                    删除第3行
    sed '3,5d' test.txt                  删除第3-5行
    sed '/^[a-z]/d' test.txt             删除以小写字母开头的行
    sed 's/the/THE/' test.txt            将每行中的第一个the替换为THE
    sed 's/l/L/2' test.txt               将每行中的第2个l替换为L
    sed '/the/s//#/' test.txt            在包含the的每行行首插入#号
    sed 's/$/EOF/' test.txt              在每行行尾插入字符串EOF
    sed '3,5s/the/THE/g' test.txt        将第3-5行中的所有the替换为THE
    sed '/the/s/o/O/g' test.txt          将包含the的所有行中的o替换为O
    sed 's/o//g' test.txt                将文件中所有的o删除
    sed '/the/{H;d};$G' test.txt         将包含the的行迁移至文件末尾
    sed '1,5{H’d};17G' test.txt          将第1-5行内容转移至第17行后
    sed '/the/w out.file' test.txt       将包含the的行号另存为文件out.file
    sed '/the/r /etc/hostname' test.txt  将文件/etc/hostname的内容添加到包含the的每行以后
    sed '/the/3aNEW' test.txt            在第3行后插入一个新行,内容为NEW
    sed '/the/aNEW' test.txt             在包含the的每行后插入一个新行,内容为NEW
    sed '3aNEW1\nNEW3' test.txt          在第3行后插入多行内容,中间的\n表示换行
    

3.扩展正则表达式

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

1.扩展元字符

+:匹配前面子表达式1次以上
例如:go+d,将匹配至少一个o(如god,good,goood...)

?:匹配前面子表达式0次或者1次
例如:go?d,将匹配gd或god

():括号中的字符串作为一个整体
例如:(xyz)+,将匹配xyz整体1次以上,如xyzxyz

|:以或的方式匹配字条串
例如1:good|food,将匹配good或者food
例如2:g(oo|la)d,将匹配good或者glad
(g|f)ood  good或者food

2. egrep

egrep执行效果与"grep-E"相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。

  1. 用法示例

    匹配o至少出现一次或者以上次数的内容
    egrep -n 'o+' test.txt
    匹配以be为开头,t为结尾,中间可以是s或者为空的内容
    egrep -n 'bes?t' test.txt
    匹配以sh为开头,rt为结尾,中间可以是i或者o的内容
    egrep -n 'sh(i|o)rt' test.txt 
    egrep -n sh'(i|o)'rt test.txt
    匹配包含oo出现一次,或者一次以上的内容
    egrep -n '(oo)+' test.txt
    

3.awk

  1. awk 选项 ‘模式或条件{编辑命令}’ 文件1 文件2…. //过滤并输出文件中符合条件的内容

  2. awk -f 脚本文件 文件1 文件2… //从脚本中调用的编辑指令,过滤并输出内容

    awk包含几个特殊的内建变量(可直接用)如下所示:
    FS:指定每行文本的字段分隔符,默认为空格或制表位
    NF:当前处理的行的字段个数
    NR:当前处理的行的行号(序数)
    $0:当前处理的行的整行内容
    $n:当前处理的行的第n个字段(第n列)
    FILENAME:被处理的文件名
    RS:数据记录分隔,默认为\n,即每行为一条记录
    
  3. 用法示例

    输出所有内容,等同于cat test.txt
    awk '{print}' test.txt
    输出所有内容,等同于cat test.txt
    awk '{print $0}' test.txt
    输出第1~3行内容
    awk 'NR1,NR3{print}' test.txt
    输出第1~3行内容
    awk '(NR>=1)&&(NR<=3){print}' test.txt
    输出第1行,第3行的内容
    awk 'NR1||NR3{print}' test.txt
    输出所有奇数行的内容
    awk '(NR%2)==1{print}' test.txt
    输出所有偶数行的内容
    awk '(NR%2)==0{print}' test.txt
    输出以root开头的行
    awk '/^root/{print}' /etc/passwd
    输出以nologin结尾的行
    awk '/nologin$/{print}' /etc/passwd
    统计以/bin/bash结尾的行数,等同于`grep –c “/bin/bash$” /etc/passwd`
    awk 'BEGIN {x=0};//bin/bash$/{x++};END {print x}' /etc/passwd
    统计以空行分隔的文本段落数
    awk 'BEGIN {RS=""} ;END{print NR}' test.txt
    输出每行中(以空格或制表符分隔)的第三个字段
    awk '{print $3}' test.txt
    输出每行中第1,3个字段
    awk '{print $1,$3}' test.txt
    输出密码为空的用户的shadow记录
    awk -F ":" '$2==""{print}' /etc/shadow
    输出密码为空的用户的shadow记录
    awk 'BEGIN {FS=":"} ; $2==""{print}" /etc/shadow
    输出以冒号分隔且第7个字段中包含/bash的行的第一个字段
    awk -F ":" '$7~"/bash"{print $1}' /etc/shadow
    输出包含8个字段且第一个字段中包含nfs的行的第1,2个字段
    awk '($1~"nfs")&&(NF==8){print $1,$2}' /etc/services
    输出第七个字段既不为/bin/bash也不为/sbin/nologin的所有行
    awk -F ":" '($7 != "/bin/bash")&&($7 != "/sbin/nologin"){print}' /etc/passwd
    调用wc –l命令统计使用bash的用户的个数,等同于`grep –c “bash$ ” /etc/passwd`
    awk -F: '/bash $/{print | "wc -l"}' /etc/passwd
    调用w命令,并用来统计在线用户数
    awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'
    调用hostname,并输出当前主机名
    awk 'BEGIN {"hostname" | getline ; print $0}'
    

4.sort

  1. sort是一种以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排序
    sort [选项] 参数
    常用选项

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

5.uniq

  1. uniq工具在Linux系统中通常与sort命令结合使用,用于报告或者忽略文件中的重复行
    常用选项

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

6.tr

  1. tr命令常用来对来自标准输入的字符进行替换、压缩和删除
    tr [选项] [参数]
    常用选项

    -c:取代所有不属于第一字符集的字符
    -d:删除所有属于第一字符集的字符
    -s:把连续重复的字符以单独一个字符表示
    -t:先删除第一字符集较第二字符集多出的字符,做替换
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值