设为首页 收藏本站
查看: 1100|回复: 0

Shell中的正则表达式及字符串处理

[复制链接]

尚未签到

发表于 2018-8-19 12:26:45 | 显示全部楼层 |阅读模式
  shell里一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
  /
  将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'/n' 匹配一个换行符。序列 '//' 匹配 "/" 而 "/(" 则匹配 "("。
  ^
  匹配输入字符串的开始位置。
  $
  匹配输入字符串的结束位置。
  *
  匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
  +
  匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
  ?
  匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
  {n}
  n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
  {n,}
  n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
  {n,m}
  m 和 n 均为非负整数,其中n
  锚定单词的结束,如'grep/>'匹配包含以grep结尾的单词的行。
  x/{m/}
  重复字符x,m次,如:'0/{5/}'匹配包含5个o的行。
  x/{m,/}
  重复字符x,至少m次,如:'o/{5,/}'匹配至少有5个o的行。
  x/{m,n/}
  重复字符x,至少m次,不多于n次,如:'o/{5,10/}'匹配5--10个o的行。
  /w
  匹配文字和数字字符,也就是[A-Za-z0-9],如:'G/w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
  /W
  /w的反置形式,匹配一个或多个非单词字符,如点号句号等。
  /b
  单词锁定符,如: '/bgrepb/'只匹配grep。
  Shell字符串处理
  1. 构造字符串
  直接构造
  STR_ZERO=hello
  STR_FIRST="i am a string"
  STR_SECOND='success'
  重复多次
  #repeat the first parm($1) by $2 times
  strRepeat()
  {
  local x=$2
  if [ "$x" == "" ]; then
  x=0
  fi
  local STR_TEMP=""
  while [ $x -ge 1 ];
  do
  STR_TEMP=`printf "%s%s" "$STR_TEMP" "$1"`
  x=`expr $x - 1`
  done
  echo $STR_TEMP
  }
  举例:
  STR_REPEAT=`strRepeat "$USER_NAME" 3`
  echo "repeat = $STR_REPEAT"
  2. 赋值与拷贝
  直接赋值
  与构造字符串一样
  USER_NAME=terry
  从变量赋值
  ALIASE_NAME=$USER_NAME
  3. 联接
  直接联接两个字符串
  STR_TEMP=`printf "%s%s" "$STR_ZERO" "$USER_NAME"`
  使用printf可以进行更复杂的联接
  4. 求长
  求字符数(char)
  COUNT_CHAR=`echo "$STR_FIRST" | wc -m`
  echo $COUNT_CHAR
  求字节数(byte)
  COUNT_BYTE=`echo "$STR_FIRST" | wc -c`
  echo $COUNT_BYTE
  求字数(word)
  COUNT_WORD=`echo "$STR_FIRST" | wc -w`
  echo $COUNT_WORD
  5. 比较
  相等比较
  str1 = str2
  不等比较
  str1 != str2
  举例:
  if [ "$USER_NAME" = "terry" ]; then
  echo "I am terry"
  fi
  小于比较
  # return 0 if the two string is equal, return 1 if $1 < $2, else 2 strCompare() { local x=0 if [ &quot;$1&quot; != &quot;$2&quot; ]; then x=2 local TEMP=`printf &quot;%s/n%s&quot; &quot;$1&quot; &quot;$2&quot;` local TEMP2=`(echo &quot;$1&quot;; echo &quot;$2&quot;) | sort` if [ &quot;$TEMP&quot; = &quot;$TEMP2&quot; ]; then x=1 fi fi echo $x }
  6. 测试
  判空
  -z str
  判非空
  -n str
  是否为数字
  # return 0 if the string is num, otherwise 1
  strIsNum()
  {
  local RET=1
  if [ -n &quot;$1&quot; ]; then
  local STR_TEMP=`echo &quot;$1&quot; | sed 's/[0-9]//g'`
  if [ -z &quot;$STR_TEMP&quot; ]; then
  RET=0
  fi
  fi
  echo $RET
  }
  举例:
  if [ -n &quot;$USER_NAME&quot; ]; then
  echo &quot;my name is NOT empty&quot;
  fi
  echo `strIsNum &quot;9980&quot;`
  7. 分割
  以符号+为准,将字符分割为左右两部分
  使用sed
  举例:
  命令 date --rfc-3339 seconds 的输出为
  2007-04-14 15:09:47+08:00
  取其+左边的部分
  date --rfc-3339 seconds | sed 's/+[0-9][0-9]:[0-9][0-9]//g'
  输出为
  2007-04-14 15:09:47
  取+右边的部分
  date --rfc-3339 seconds | sed 's/.*+//g'
  输出为
  08:00
  以空格为分割符的字符串分割
  使用awk
  举例:
  STR_FRUIT=&quot;Banana 0.89 100&quot;
  取第3字段
  echo $STR_FRUIT | awk '{ print $3; }'
  8. 子字符串
  字符串1是否为字符串2的子字符串
  # return 0 is $1 is substring of $2, otherwise 1
  strIsSubstring()
  {
  local x=1
  case &quot;$2&quot; in
  *$1*) x=0;;
  esac
  echo $x
  }
  shell 编程中使用到得if语句内判断参数
  –b 当file存在并且是块文件时返回真
  -c 当file存在并且是字符文件时返回真
  -d 当pathname存在并且是一个目录时返回真
  -e 当pathname指定的文件或目录存在时返回真
  -f 当file存在并且是正规文件时返回真
  -g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
  -h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
  -k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
  -p 当file存在并且是命令管道时返回为真
  -r 当由pathname指定的文件或目录存在并且可读时返回为真
  -s 当file存在文件大小大于0时返回真
  -u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
  -w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
  -o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
  UNIX Shell 里面比较字符写法:
  -eq 等于
  -ne 不等于
  -gt 大于
  -lt 小于
  -le 小于等于
  -ge 大于等于
  -z 空串
  = 两个字符相等
  != 两个字符不等
  -n 非空串
  -------------------------------------------------------------------------
  更为详细的说明:
  运算符 描述 示例
  文件比较运算符
  -e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ]
  -d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]
  -f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]
  -L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ]
  -r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]
  -w filename 如果 filename 可写,则为真 [ -w /var/mytmp.txt ]
  -x filename 如果 filename 可执行,则为真 [ -L /usr/bin/grep ]
  filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
  filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
  字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
  -z string 如果 string 长度为零,则为真 [ -z $myvar ]
  -n string 如果 string 长度非零,则为真 [ -n $myvar ]
  string1 = string2 如果 string1 与 string2 相同,则为真 [ $myvar = one two three ]
  string1 != string2 如果 string1 与 string2 不同,则为真 [ $myvar != one two three ]
  算术比较运算符
  num1 -eq num2 等于 [ 3 -eq $mynum ]
  num1 -ne num2 不等于 [ 3 -ne $mynum ]
  num1 -lt num2 小于 [ 3 -lt $mynum ]
  num1 -le num2 小于或等于 [ 3 -le $mynum ]
  num1 -gt num2 大于 [ 3 -gt $mynum ]
  num1 -ge num2 大于或等于 [ 3 -ge $mynum ]
  脚本示例:
  #!/bin/bash
  # This script prints a message about your weight if you give it your
  # weight in kilos and hight in centimeters.
  if [ ! $# == 2 ]; then
  echo &quot;Usage: $0 weight_in_kilos length_in_centimeters&quot;
  exit
  fi
  weight=&quot;$1&quot;
  height=&quot;$2&quot;
  idealweight=$[$height - 110]
  if [ $weight -le $idealweight ] ; then
  echo &quot;You should eat a bit more fat.&quot;
  else
  echo &quot;You should eat a bit more fruit.&quot;
  fi
  # weight.sh 70 150
  You should eat a bit more fruit.
  # weight.sh 70 150 33
  Usage: ./weight.sh weight_in_kilos length_in_centimeters
  位置参数 $1, $2,..., $N,$#代表了命令行的参数数量, $0代表了脚本的名字,
  第一个参数代表$1,第二个参数代表$2,以此类推,参数数量的总数存在$#中,上面的例子显示了怎么改变脚本,如果参数少于或者多余2个来打印出一条消息。
  执行,并查看情况。
  # bash -x tijian.sh 60 170
  + weight=60

  +>
  +>  + '[' 60 -le 60 ']'
  + echo 'You should eat a bit more fat.'
  You should eat a bit more fat.
  其中-x用来检查脚本的执行情况


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-553854-1-1.html 上篇帖子: [实例]利用php+mysql完成shell脚本的授权验证 下篇帖子: mcollective插件(shell plugins)功能在Linux系统上无所不能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表