Linux expr用法

'expr'支持模式匹配和字符串操作。字符串表达式的优先级高于数值表达式和逻辑关系表达式。
 
'STRING : REGEX'
     执行模式匹配。两端参数会转换为字符格式,且第二个参数被视为正则表达式(GUN基本正则),它默认会隐含前缀"^"。随后将第一个参数和正则模式做匹配。
 
     如果匹配成功,且REGEX使用了'\('和'\)',则此表达式返回匹配到的。
 
     如果匹配失败,如果REGEX中使用了'\('和'\)',则此表达式返回空字符串,否则返回为0。
 
     只有第一个'\(...\)'会引用返回的值;其余的'\(...\)'只在正则表达式分组时有意义。
 
     在正则表达式中,'\+','\?'和'\|'分表代表匹配一个或多个,0个或1个以及两端任选其一的意思。
 
'match STRING REGEX'
     等价于'STRING : REGEX'。
 
'substr STRING POSITION LENGTH'
     返回STRING字符串中从POSITION开始,长度最大为LENGTH的子串。如果POSITION或LENGTH为负数,0或非数值,则返回空字符串。
 
'index STRING CHARSET'
     CHARSET中任意单个字符在STRING中最前面的字符位置。如果在STRING中完全不存在CHARSET中的字符,则返回0。见后文示例。
    
'length STRING'
     返回STRING的字符长度。
 
'+ TOKEN'
     将TOKEN解析为普通字符串,即使TOKEN是像MATCH或操作符"/"一样的关键字。这使得'expr length + "$x"'或'expr + "$x" : '.*/\(.\)''可以正常被测试,即使"$x"的值可能是'/'或'index'关键字。这个操作符是一个GUN扩展。
     通用可移植版的应该使用'" $token" : ' \(.*\)''来代替'+ "$token"'。
 
   要让expr将关键字解析为普通的字符,必须使用引号包围。
 
16.4.2 算术表达式
--------------------------
 
'expr'支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。
 
'+ -'
     加减运算。两端参数会转换为整数,如果转换失败则报错。
 
'* / %'
     乘,除,取模运算。两端参数会转换为整数,如果转换失败则报错。
 
16.4.3 逻辑关系表达式
---------------------------
 
'expr'支持普通的逻辑连接和逻辑关系。它的优先级最低。
 
'|'
     如果第一个参数非空且非0,则返回第一个参数的值,否则返回第二个参数的值,但要求第二个参数的值也是非空或非0,否则返回0。如果第一个参数是非空或非0时,不会计算第二个参数。
    
     经过测试,以上手册内容是错误的。正确的应该是:如果第一个参数非0,则返回第一个参数的值,否则返回第二个参数。但如果任意一个参数为空,则报错。除非空字符串使用引号包围,此时将和0的处理方式一样。
 
'&'
     如果两个参数都非空且非0,则返回第一个参数,否则返回0。如果第一个参为0或为空,则不会计算第二个参数。
    
     经过测试,以上手册内容是错误的。正确的应该是:如果两个参数都非0,则返回第一个参数,否则返回0。但任意一个参数为空,则报错。除非空字符串使用引号包围,此时将和0的处理方式一样。
 
'< <= = == != >= >'
     比较两端的参数,如果为true,则返回1,否则返回0。"=="是"="的同义词。"expr"首先尝试将两端参数转换为整数,并做算术比较,如果转换失败,则按字符集排序规则做字符比较。
 
括号'()'可以改变优先级,但使用时需要使用反斜线对括号进行转义。
 
16.4.4 'expr'使用示例
-------------------------------
 
以下为expr的一些示例,其中有将shell的元字符使用引号包围的示例。
 
   将shell中变量'foo'的值增加1:
 
     foo=$(expr $foo + 1)
 
   输出变量路径变量'$fname'中不包含'/'的文件名部分:
 
     expr $fname : '.*/\(.*\)' '|' $fname
    
     解释:其中的'|'是expr中的连接符,只不过是被引号包围防止被shell解析。例如$fname=/etc/hosts,则此表达式返回hosts,如果$fname=/usr/share/,则此表达式'|'的左边为空,所以返回'|'右边的值,即$fname,即返回/usr/share/。
 
   An example showing that '\+' is an operator:
 
     expr aaa : 'a\+'    # 解释:因为REGEX部分没有使用\(\),所以返回匹配的字符数
     => 3
 
     expr abc : 'a\(.\)c'  # 解释:因为REGEX部分使用了\(\),所以返回匹配的字符
     => b
     expr index abcdef cz
     => 3
     expr index index a    # 解释:因为第二个index是关键字
     error-> expr: syntax error
     expr index + index a  # 解释:使用+将index关键字解析为普通字符串
     => 0

 

Shell代码 

  1. filename="thread1.20110325.log"  
  2. echo `expr "$filename" : '.*\([0-9]\{8\}\).*'`  

 

其中正则为    .*\([0-9]\{8\}\).*

 

注意两侧的 .* :

1. 如果左边没有 .* 则相当于有 ^ ,也就是相当于开头必须为数字

2. 如果右边没有 .* 则相当于有 $ ,也就是相当于结尾必须为数字

这两点与我们平常用的正则不一样,不注意就匹配不上

 

转义字符\:将字符的意思改变(不支持正则符号的,转变字符含义为正则,支持正则的转变为普通字符含义)

expr默认不支持正则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值