Linux Shell入门(二)--正则表达式以及常用的查找命令

正则表达式

  • 基本语法
    • 字符类
语法含义举例
.匹配任意一个字符abc. 可以匹配abcd,abc9等
[]匹配括号中的任意一个字符[abc]d可以匹配ad、bd或cd
-在[]括号内表示字符范围[0-9a-fA-F]可以匹配以为十六进制数字
^位于[]括号内的开头,匹配除括号中的字符之外的任意一个字符[^xy]匹配除xy之外的任一字符,因此[^xy]1可以匹配a1,b1但不匹配x1,y1
[[:xxx:]]grep工具预定义的一些命名字符类[[:alpha:]]匹配字母,[[:digit:]] 匹配一个数字
  • 数量限定符
语法含义举例
?紧跟在它前面的单元应匹配零次或一次[0-9]?.[0-9]匹配0.0,2.3 .5等,.由于正则表达式中是一个特殊字符,所以需要用转义字符\转义一下
+紧跟在它前面的单元应匹配一次或多次[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+.[a-zA-Z0-9_.-]+匹配email地址
*紧跟在它前面的单元应匹配零次或多次[0-9][0-9]*匹配至少一位数字,等价于[0-9]+,[a-zA-Z_]+[a-zA-Z_0-9]*匹配C语言的标识符
{N}紧跟在它前面的单元应精确匹配N次[1-9][0-9]{2}匹配从100到999整数
{N,}紧跟在它其前面的单元应匹配至少N次[1-9][0-9]{2,} 匹配三位以上(含三位)的整数
{,M}紧跟在它前面的单元应匹配至多M次[0-9]{,1}相当于[0-9]?
{N,M}紧跟在它前面的单元应匹配至少N次,最多M次[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} 匹配IP地址
//匹配test.regex中IP地址
egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' test.regex
  • 再次注意grep找的是包含某一模式的行,而不是完全匹配某一模式的行。
  • 位置限定符
语法含义举例
^匹配首行的位置^Content匹配位于一行开头的Content
$匹配行末的位置;$ 匹配位于一行的结尾的逗号,^$ 匹配空行
\<匹配单词开头的位置\<th 匹配 this,但不匹配 ethernet、 tenth
\>匹配单词结尾的位置th\>匹配以th结尾的单词
\b匹配单词开头或结尾的位置\b放在开头匹配以xx开头,\b放结尾匹配以xx结尾,\bxx\b 只能匹配xx本身
\B匹配非单词开头和结尾的位置即\Bxx 匹配非xx开头;xx\B匹配非xx结尾。 \Bat\B匹配battery,但不匹配 attend、hat…
// 匹配IP地址的正则表达式简化为:
 egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}$' test.regex
  • 其他的特殊字符
语法含义举例
\转义字符,普通的字符转义为特殊字符,特殊字符转义为普通字符普通字符< 写成 < 表示以单词开头的位置,特殊字符 . 写成 . 以及 \ 写成 \ 来匹配
()将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符([0-9]{1,3}.){3}[0-9]{1,3}来匹配IP地址
|连接两个子表达式,表示或的关系n(o|either)匹配no或者neither

Basic正则和Extended正则区别

以上介绍的是grep正则表达式的Extended规范,Basic规范也有这些语法,只是字符 ?+{}|() 应该解释为普通字符。要表示上述特殊含义的正则需要加 \ 转义。如果用grep而不是egrep,并且不加-E参数,则应该遵照Basic正则表达式。

  • 如果使用Basic正则则上述匹配IP的正则应该改为:
 //Basic正则
 grep '^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}' test.regex
 // Extend正则
  grep -E '^([0-9]{1,3}\.){3}[0-9]{1,3}' test.regex
  egrep '^([0-9]{1,3}\.){3}[0-9]{1,3}' test.regex
 

grep命令

  • grep [option]
    • -c : 只输出匹配行的计数
    • -i : 不区分大小写
    • -h : 查询多文件时不显示文件名
    • -l : 查询多文件时只输出包含匹配字符的文件名
    • -n : 显示匹配行及行号
    • -s : 不显示不存或无匹配文本的错误信息
    • -v : 显示不包含匹配文本的所有行
    • –color=auto : 可以将找到的关键词部分加上颜色的显示
    • pattern正则表达上的重要参数
      • \ : 忽略正则表达式中的特殊字符的原有含义
      • ^ : 匹配正则表达式的开始行
      • $ : 匹配正则表达式的结束行
      • <:从匹配正则表达式的行开始
      • >:到匹配正则表达式的行结束
      • [ ]:单个字符,如[A]即A符合要求
      • . : 所有的单个字符
        • : 所有字符,长度可以为0
  • grep使用的简单实例
  //查找并显示所有d开头的文件中包含的test的行
  grep 'test' d*  
  //在dTest dTest1中查找并显示包含test的行
  grep 'test' dTest dTest1
  //在dTest1中查找并显示至少包含5个连续小写字符的字符串的行
  grep '[a-z]\{5\}' dTest1
  
  • grep -r : 明确要求搜索子目录
  • grep -d skip : 忽略子目录
// 很多输出,通过管道将其转到“less” 上阅读
grep magic /usr/src/Linux/Documentation/* | less
// 当前目录下及其子目录下搜寻包含 192.168.175.129 串的文件 后面加 -n 可显示行号
grep -r 192.168.175.129 ./   // 执行结果如下:
./test.regex:192.168.175.129 hadoop01   
./test.regex:hadoopǰ̨·Ďʵٖ·£ºhttp://192.168.175.129:50070   

find命令

  • -name:按照文件名查找文件 find /目录位置 参数 “匹配项” 如: find ./ -name “init”
  • -size:按照文件大小查找
find ./ -size +3M -size -7M
find ./ -size +20k -size -80k
find ./ -size +200 -size -500  (单位为512B,扇区大小0.5K)
  • type:按照文件的类型进行搜索,-d/-f/-p/-l/-s/-c/-b 如:find ./ -type f
  • maxdepth:指针搜索的层级 find ./ -maxdepth 1 -type f :在当前目录下查找所有文件
  • exec:对find查找结果执行某一命令,如:find ./ -maxdepth 1 -type f -exec ls -l {} ; 对find的结果执行ls -l命令。
  • ok:与exec相似,会执行动作之前会询问是否执行,交互版的exec,如:
[leyou@localhostCentOS6 test]$ find ./ -maxdepth 1 -type d -ok rm -rf {} \;
< rm ... ./ > ? n
< rm ... ./d4 > ? n
< rm ... ./d3 > ? n
< rm ... ./d5 > ? n
< rm ... ./d1 > ? y
< rm ... ./d2 > ? y
//其中d1  d2文件夹被删除,而d3,d4,d5保留
  • xargs : 通过管道将find的结果传给后面的命令执行,与exec区别在与,xargs会分批次进行处理,不容易造成内存泄露,用法:
 find ./ -maxdepth 1 -type d | xargs ls -ldh
  • print0:添加结束标记
//当某个文件夹下有 “test test.c”文件时,执行xargs 会出现报错的现象,即xargs 传递的参数是以空格区分的,而“test test.c”刚好包含空格,即认为是两个文件。
[leyou@localhostCentOS6 d3]$ find ./ -type f | xargs ls -lh
ls: 无法访问./test: 没有那个文件或目录
ls: 无法访问test.c: 没有那个文件或目录
// 使用exec命令执行正常
[leyou@localhostCentOS6 d3]$ find ./ -type f -exec ls -lh {} \;
-rw-rw-r--. 1 leyou leyou 0 10月 19 21:33 ./test test.c
//如果用xargs 需要指定find搜索结果的结束标记,并在xargs传参时指定该结束标记
[leyou@localhostCentOS6 d3]$ find ./ -type f -print0 | xargs -0 ls -lh
-rw-rw-r--. 1 leyou leyou 0 10月 19 21:33 ./test test.c
  • -atime/ctime/mtime:天为单位 -amin/cmin/mmin:分钟为单位
    • a :访问
    • c: 文件内容修改
    • m:文件属性被修改
// 超找5天外文件内容被修改以syslog开头的文件名的信息
find ./ -name "syslog*" -mtime +5 -exec ls -l {} \;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值