1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
      <output id="hzk7v"></output>
    2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
    3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

      shell脚本之正则表达式¡¢grep¡¢sed¡¢awk

       更新时间£º2019年04月15日 14:33:25   作者£ºomgasw   我要评论

      这篇文章主要介绍了shell脚本之正则表达式¡¢grep¡¢sed¡¢awk的相关知识£¬非常不错£¬具有一定的参考借鉴价值 ,需要的朋友可以参考下

      --正则--

      基础正则

      ^word     ##搜索以word开头的 vi/vim中 ^ 一行的开头
      word$     ##搜索以word结尾的 vi/vim中 $ 一行的结尾
      ^$        ##表示空行
      .         ##代表且只能代表?#25105;?#19968;个字符
      \         ##例£º\. 只代表点本身£¬转义符号£¬让有特殊身份意义的字符£¬脱掉马甲£¬还原
      \n        ##换行符
      \r        ##匹配回车
      \w         ##匹配?#25105;?#19968;个字符和数字
      *         ##重复0?#20301;?#22810;次前面的一个字符
      .*        ##匹配所有字符¡£例£º^.* 以?#25105;?#22810;个字符开头£¬.*$以?#25105;?#22810;个字符结尾
      [abc]     ##匹配字符集内的?#25105;?#19968;个字符
      [^abc]    ##匹配不包含 ^ 后的?#25105;?#23383;符的内容¡£中括号里的 ^ 为取反
      [1-9]     ##表示匹配括号内的范围内的?#25105;?#23383;符
      a\{n,m\}  ##重复n到m次前一个重复的字符¡£若用egrep¡¢sed -r可以去掉斜线
      \{n,\}    ##重复至少n 次前一个重复的字符¡£若用egrep¡¢sed -r可以去掉斜线
      \{n\}     ##重复n 次前一个重复的字符¡£若用egrep¡¢sed -r可以去掉斜线
      \{,m}\    ##重复少于m次

      注£ºegrep£¬grep ¨CE或sed ¨Cr 过滤一般特殊字符可以不转义

      扩展正则£¨egrep或grep -E£©

      +          ##重复一?#20301;?#19968;次以上前面的一个字符
      ?          ##重复0?#20301;?#19968;次前面的一个字符
      |          ##或者的意思£¬用或的方式查找多个符合的字符串
      ()         ##?#39029;?#25324;号内的字符串

      ^linux     ##以linux开始
      linux$     ##以linux结束
      linuxfan.   ##匹配linuxfans等
      coo[kl]    ##匹配cool或cook
      9[^5689]    ##匹配91,92等£¬但不匹配95,96,98,99
      [0-9]     ##匹配?#25105;?#19968;个所有的数字
      [a-z]|[A-Z]  ##匹配?#25105;?#19968;个所有大小写字母,|属于扩展正则grep -E支持
      colou?r    ##匹配color或colour£¬但是不能匹配colouur
      rollno-9+   ##匹配rollno-9¡¢rollno-99£¬rollno-999£¬但不匹配rollno-
      co*l      ##匹配cl£¬col£¬cool£¬coool等
      ma(tri)x    ##匹配matrix
      [0-9]{3}    ##匹配?#25105;?#19968;个三位数£¬等于[0-9][0-9][0-9]
      [0-9]{2,}   ##匹配?#25105;?#19968;个两位数或更多位的数字
      [0-9]{2,5}   ##匹配从两位数到五位数之间的?#25105;?#19968;个数字
      Oct (1st|2nd) ##匹配Oct 1st或Oct 2nd
      a\.b      ##匹配a.b£¬但不能匹配ajb
      [a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}       ##匹配一个邮箱地址
      [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ##匹配IP地址
      
      --grep--

      语法£ºgrep [选项] [条件表达式] 目标文件

      cat /proc/meminfo |grep -e Mem -e Cache -e Swap     ##查看系统内存¡¢缓存¡¢交换分区-e的作用是匹配多个表达式
      grep -R -o -n -E  '[a-z0-9_]+\@[a-z0-9_]+\.[a-z]{2,4}' /etc/     ##查找/etc目录下的所有文件中的邮件地址£»-R递归£¬-n表示匹配的行号£¬-o只输出匹配内容£¬-E支持扩展正则表达式£¬
      grep -R -c 'HOSTNAME' /etc/ |grep -v "0$"     ##查找/etc/目录下文件中包含¡°HOSTNAME¡±的次数£¬-c统计匹配次数£¬-v取反
      grep -R -l 'HOSTNAME' /etc/           ##查找包含¡°HOSTNAME¡±的文件名£¬-l显示匹配的文件名£¬-L显示不匹配的文件名
      dmesg | grep -n --color=auto 'eth'       ##查找内核日志中eth的行£¬显示颜色及行号
      dmesg | grep -n -A3 -B2 --color=auto 'eth'     ##用 dmesg 列出核心信息£¬再以 grep ?#39029;?#20869;含 eth 那行,在关键字所在行的前两行与后三行也一起?#39029;?#20986;来显示
      cat /etc/passwd |grep -c bash$         ##统计系统中能登录的用户的个数
      touch /tmp/{123,123123,456,1234567}.txt   ##创建测试文件£¬以下三条命令是一样的效果£¬匹配文件名123£¬可以包含1个到多个
      ls |grep -E '(123)+' 
      ls |grep '\(123\)\+'
      ls |egrep '(123)+'
      ps -ef |grep -c httpd             ##统计httpd进程数量
      grep -C 4 'games' --color /etc/passwd       ##显示games匹配的¡°-C¡±前后4行
      grep ^adm /etc/group             ##查看adm组的信息
      ip a |grep -E '^[0-9]' |awk -F : '{print $2}'     ##获取网卡名称
      ifconfig eth0 |grep -E -o 'inet addr:[^ ]*' |grep -o '[0-9.]*'   ##截取ip地址£¬[^ ]*表示以非空字符作为结束符£¬[0-9.]*表示数字和点的组合
      ip a |grep inet |grep eth0 |grep -o "inet[^/]*" |grep -o "[0-9.]*"  ##截取ip地址
      ifconfig eth0 |grep -i hwaddr |awk '{print $5}'   ##截取MAC地址
      ip a |grep -A 3 "eth0" |grep link/ether |grep -o "ether[^r]*" |grep -o -E "[0-9a-f:]+"|grep -E "[0-9a-f:]{2}$"      ##截取MAC地址
      
      grep "^m" oldboy.log       ##过滤输出以m开头的行
      grep "m$" oldboy.log 
      grep -vn "^$" oldboy.log       ##过滤空行
      grep -o "0*" oldboy.log 
      grep -o "oldb.y" oldboy.log 
      grep "\.$" oldboy.log       ##以.结尾的行
      grep "0\{3\}" oldboy.log       ##重复三次

      --sed--

      语法£ºsed [options] 'command' file(s)

      选项£º

      -n 抑制自动打印pattern space£¬sed默认输出全部£¬-n用于取消默认输出
      -i 编辑文件
      -r 支持扩展正则表达式

      1.改£º

      语法£ºsed '/正则匹配条件/s/old/new/g' 文件
      sed 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只是显示£¬不修改
      sed -i 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只修改£¬不显示
      sed -i 's/dhcp/static/g' ip ##将所有的dhcp替换为static
      sed -i '/^IP1/s/static/dhcp/g' ip ##将IP1开头的行替换
      sed -i '2s/static/dhcp/g' ip ##指定特定行号2行替换
      cat -n /etc/selinux/config ##查看并显示行号
      sed -i '7s/disabled/enforcing/g' /etc/selinux/config ##开启selinux

      2.删£º

      语法£ºsed '/表达式/d' 文件
      vim ip ##添加空行
      sed '/^$/d' ip ##删除空行并显示在屏幕上
      sed -i '/IP1/d' ip ##删除包含IP1的行
      sed -i '/^IP2/d' ip ##删除以IP2开头的行
      sed -i '2d' ip ##删除第二行

      3.增£º

      语法£ºsed ' /表达式/a "需要添加的文字"' 文件
      sed 'a IP3=static' ip ##每一行后都加上IP3=static
      sed '3a IP3=static' ip ##只在第3行后加上IP3=static£¬并显示不修改
      sed '3i IP3=static' ip ##只在第3行前加上IP3=static£¬显示不修改
      sed -i '3a IP3=static' ip ##修改£¬不显示
      sed -i '/^IP3/a "test add"' ip ##在以IP3开头的行后添加

      4.查£º

      语法£ºsed -n '/表达式/p' 文件
      sed -n '2p' /etc/hosts ##查看第二行
      sed -n '/www/p' /var/named/chroot/var/named/linuxfan.cn.zone ##查看包含www的解析记录
      sed -n '/.100$/p' /var/named/chroot/var/named/linuxfan.cn.zone ##查看以.100结尾的行
      sed -n '2~2p' ip ##从第二行£¬每隔两行显示
      
      ifconfig eth0|sed -n '2p'|sed 's#.*dr:##g'|sed 's# Bc.*##g'    ##注£º当sed命令处理的内容为多?#24515;?#23481;£¬则以/作为表达式的分隔£¬若sed命令处理的内容为单?#24515;?#23481;£¬作为截取的作用£¬以#号作为分隔符£»
      10.0.0.9 
      ifconfig eth0|sed -n '2p'|sed -r 's#(.*dr:)(.*)(Bc.*$)#\2#g'    ##-r支持扩展正则£¬\2将2转义£¬打印出第二个范围(.*)
      10.0.0.9 
      ifconfig eth0|sed -n '2p'|sed -r 's#.*dr:(.*) Bc.*$#\1#g'
      10.0.0.9 
      ifconfig eth0|sed -nr '2s#^.*dr:(.*) Bc.*$#\1#gp'
      10.0.0.9
      ifconfig eth0|sed -nr '1s#^.*dr (.*)#\1#gp'
      00:0C:29:33:C8:75 
      ifconfig eth0|sed -n '1p'|sed -r 's#(^.*dr )(.*)#\2#g'
      00:0C:29:33:C8:75
      ifconfig eth0|sed -n '1p'|sed 's#^.*dr ##g'      
      00:0C:29:33:C8:75
      ifconfig eth0|sed -nr '1s#^.*t (.*) 00.*$#\1#gp'
      HWaddr
      stat /etc/hosts|sed -n '4p'                
      Access: (0644/-rw-r--r--) Uid: (  0/  root)  Gid: (  0/  root)
      stat /etc/hosts|sed -n '4p'|sed 's#^.*ss: (##g'|sed 's#/-.*$##g'
      0644
      stat /etc/hosts|sed -n '4p'|sed -r 's#^.*s: \((.*)/-.*$#\1#g'
      0644
      stat /etc/hosts|sed -nr '4s#^.*s: \((.*)/-.*$#\1#gp'
      0644
      stat /etc/hosts|sed -nr '4s#(^.*s: \()(.*)(/-.*$)#\2#gp'
      0644
      
      --awk--

      语法£º
      awk [选项] '模式{动作£¨action£©}' 文件1 文件2 ...
      选项£º -F   指定输入分隔符£¬可以是字符串或正则表达式
      常用动作£º print¡¢printf

      chkconfig --list |grep 3:启用 |awk '{print $1}'
      tail -1 /etc/passwd |awk -F ':' 'BEGIN{OFS="---"}{print $1,$6,$7}'  ##OFS指定输出分隔符
      ifconfig eth1 |awk -F '[ :]+' 'NR==2 {print $4}'
      ifconfig eth1 |awk -F '[ :]+' 'NR==2 {print "eth1_ip="$4}' ##可以加入显示内容
      awk 'BEGIN {print "line one \nline two\nline three"}'

      匹配范围£¨ranges£©£º指定的匹配范围£¬格式为part1,part2

      awk -F : '$3==3,$3==10{print $1,$3,$7}' /etc/passwd
      awk -F : '$1=="root",$1=="adm"{print $1,$3,$7}' /etc/passwd
      awk -F : '/^r/,/^a/{print $1,$3,$7}' /etc/passwd

      awk区块原理£º

      区域构成£º

      BEGIN { 动作 } ##开始处理第一行文本之前的操作
      { 动作 } ##针对每一行文本的处理操作
      END { 动作 } ##处理完最后一行文本之后的操作
      执行流程£º
       首先执行 BEGIN { } 区块中的初始化操作£»
       然后从指定的数据文件中循?#33539;?#21462;一个数据行£¨自动更新 NF¡¢ NR¡¢ $0¡¢ $1¡­¡­ 等内建变量的值£©£¬并执行'模式或条件{ 动作 }'£»
       最后执行 END { } 区块中的后续处理操作¡£

      案例£º

      awk -F : 'BEGIN{printf "%-10s%-10s%-20s\n","UserName","ID","Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd ##在awk处理之前打印头部BEGIN{}
      ifconfig eth0 |awk -F':' 'NR==2{print $2,$4}'|awk 'BEGIN{OFS=" / "}{print "IP="$1,"MASK="$3}'

      awk的变量£º
      awk变量£º
      FS£º列分隔符£¬默认位空白
      RS£º行分隔符£¬默认位换行符
      OFS£º输出列分隔符
      ORS £º输出行分隔符
      awk内置变量£º
      NR£º处理中行数
      FNR£º单个文件的行数
      NF£º列的个数

      案例£º

      ifconfig eth1 |awk '{print NR}'
      ifconfig eth1 |awk '{print NF}'


      自定义变量案例£º

      awk 'BEGIN{test="www.linuxfan.cn";print test}'
      awk -v test="linuxfan.cn" 'BEGIN{print test}'

      printf的使用£º

      格式£ºprintf "格式",列表1,列表2 ...

      特征£º

      a.必须指定format(格式)£¬用于指定后面item£¨列表£©的输出格式

      b.printf语句不会自动打印换行符£º\n

      c.format格式以%加一个字符£¬如下£º

      %c:显示字符的ASCII码
      %d£¬%i:十进制整数
      %f:显示浮点数£¨小数£©
      %s:显示字符串
      %u:无符号整数
      %%:显示%

      d.修饰符£ºN:显示宽度£¬-£º左对齐£¬+?#21512;?#31034;数值符号£¬如%-c(左对齐)

      案例£º

      chkconfig --list |grep 3:启用 |awk '{printf "%-10s",$1}' ##在统一行显示
      awk -F : '{printf "%-15s %-10d %-10s\n",$1,$3,$7}' /etc/passwd

      awk的操作符£º

      算数操作符£º x^y¡¢x/y¡¢x+y¡¢x-y¡¢x%y
      比较操作符£º>¡¢<¡¢>=¡¢<=¡¢==¡¢!=
      逻辑操作符£º&&¡¢||¡¢£¡

      awk常见的模式类型

      正则表达式£¨regexp£©£ºawk -F : '/^u/{print $1}' /etc/passwd

      表达式£¨expression£©£º值位非0或位非空是满足条件£¬如$1 ~ /foo/或 $1 == "root"

      案例£º

      awk -F : '$3>=500{print $1,$3,$7}' /etc/passwd ##打印普通用户
      awk -F : '$3+1<=100&&$3+1>=10{print $1,$3,$7}' /etc/passwd ##UID在10-100之间的用户
      awk -F : '$2=="!!"{print $1,$2}' /etc/shadow ##检查未初始化密码的用户
      passwd -d u01 
      awk -F : '$2==""{print $1}' /etc/shadow ##打印密码为空的用户
      awk -F : '$7~"bash$"{print $1,$3,$7}' /etc/passwd ##匹配$7为bash结束行
      awk -F : '$7!~"bash$"{print $1,$3,$7}' /etc/passwd

      总结

      以上所述是小编给大家介绍的shell脚本之正则表达式¡¢grep¡¢sed¡¢awk £¬希望?#28304;?#23478;有所帮助£¬如果大家有任?#25105;?#38382;欢迎给我留言£¬小编会及时回复大家的£¡

      相关文章

      最新评论

      3dÊÔ»úºÅÖвÊÍø

        1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
          <output id="hzk7v"></output>
        2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
        3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

            1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
              <output id="hzk7v"></output>
            2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
            3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>