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

shell中的数组、正则表达式、sed、awk的使用

[复制链接]

尚未签到

发表于 2018-8-25 09:09:31 | 显示全部楼层 |阅读模式
  咱有什么说什么,说实在的,这部分我感觉是liunx中最乱的地方,也是最不好学的,也是能看出人最专业的地方,明白我的意思了吧,,,,自己体会。 DSC0000.gif
  数组 declare
  定义变量的类型
  declare 选项 变量名=值
  选项有
  -i  整形的变量
  -r  只读的变量  定义就不可以修改了
  -x  系统环境变量
  -a  数组变量  想把多个变量定义成一个组
  ---------
  [root@xu ~]# declare -i a=1 b=2
  [root@xu ~]# declare -i c=$a*$b
  [root@xu ~]# echo $c
  2
  ---------
  创建数组
  [root@xu ~]# declare -a teaname
  ----------
  查看数组
  [root@xu ~]# declare -a
  ------
  数组赋值 (添加信息)
  数组名 [元素下标]=值
  ----------
  给数组添加内容
  [root@xu ~]# teaname[0]=yzs
  [root@xu ~]# teaname[1]=xly
  [root@xu ~]# teaname[2]=lili
  [root@xu ~]# declare -a
  declare -a BASH_ARGC='()'
  declare -a BASH_ARGV='()'
  declare -a BASH_LINENO='()'
  declare -a BASH_SOURCE='()'
  declare -ar BASH_VERSINFO='([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")'
  declare -a DIRSTACK='()'
  declare -a FUNCNAME='()'
  declare -a GROUPS='()'
  declare -a PIPESTATUS='([0]="0")'
  declare -a teaname='([0]="yzs" [1]="xly" [2]="lili")'
  ------------
  [root@xu ~]# serip=(1.1.1.1 2.2.2.2 3.3.3.3)
  [root@xu ~]# declare -a |grep serip
  declare -a serip='([0]="1.1.1.1" [1]="2.2.2.2" [2]="3.3.3.3")'
  ---------------
  输出数组元素
  [root@xu ~]# echo ${serip[1]}
  2.2.2.2
  输出全部元素
  [root@xu ~]# echo ${serip[@]}
  1.1.1.1 2.2.2.2 3.3.3.3
  [root@xu ~]# echo ${serip
  • }
      1.1.1.1 2.2.2.2 3.3.3.3
      ----------
      统计数组元素的个数
      [root@xu ~]# echo ${#serip
  • }
      3
      --------
      统计模个元素值的长度 (第一个代表0  第二个代表1 1.1.1.1  是7位.也算)
      [root@xu ~]# echo ${#serip[0]}
      7
      ---------
      输出模个位置的元素  从所有的数组里选取第2个元素
      [root@xu ~]# echo ${serip[@]:2}
      3.3.3.3
      ------
      [root@xu ~]# hostname=(www.baidu.com www.sina.com www.uplooking.com)
      [root@xu ~]# echo ${hostname[2]}
      www.uplooking.com
      [root@xu ~]# echo ${hostname[2]:0}
      www.uplooking.com
      [root@xu ~]# echo ${hostname[2]:4}
      uplooking.com
      [root@xu ~]# echo ${hostname[2]:4:9}  从第几个开始输出 输出几位
      uplooking
      --------
      把从屏幕输入的三次IP 地址 存放到数组serip里
      把数组色日跑得三个元素值输出到屏幕上
      1 #!/bin/bash
      2 read -p "请输入第一个IP地址" a[0]
      3 read -p "请输入第二个IP地址" a[1]
      4 read -p "请输入第三个IP地址" a[2]
      5
      6 echo ${a[@]}
      用循环的方式给数组赋值
      1 #!/bin/bash
      2 read -p "清输入监控主机的台数:" a
      3 i=0
      4 while [ $i -lt $a ]
      5   do
      6 read -p "清输入第一台主机ip:" serip[$i]
      7     let i++
      8     done
      9
      10
      11     echo ${serip[@]}
      用循环的方式输出数组元素
      1 #!/bin/bash
      2 read -p "清输入监控主机的台数:" a
      3 i=0
      4 while [ $i -lt $a ]
      5   do
      6 read -p "清输入第一台主机ip:" serip[$i]
      7     let i++
      8     done
      9     echo "-------------------------------------------"
      10 for i in `echo ${serip[@]}`
      11   do
      12     echo $i
      13     done
      14 echo "----------------------------------------"
      15 for ((i=0;i=o  o个到多个
      + >= 1   1 个到多个
      \?  是0次或1
      ***************************************************
      用grep 的时候 下面的这几个必须要转意
      ^ $ . []  * \? \+ \{ \} \< >/ \| \( \)
      ****************************************************
      () 保存 匹配的模式
      (ab) 一个整体
      ^pac*j$   c出现0此或者无穷次
      ^p(ac)*j$ *前面的ac出现0此或者无穷次
      [ ] 匹配范围内的也就是任意一个
      [afb] 包括 afb里任意一个都匹配
      [a-d]只要里面的有任意一个都匹配
      [a-Z]所有的字母
      .*   表示所有字符
      [^a-c] ^在[]表示取反  没有a到c的都匹配
      ^[a-c] 以abc开头的
      ^[^a-c] 不以abc开头的行
      | 或
      (abc|def)* abc出现o到无穷此 或者 def出现0次或者无穷
      w(abc|def)x 表示wabcx 或者是wbefx 都匹配
      匹配次数
      \{ \}指定前面的表达式出现的次数
      g\(oo\)\{1\}d   =good
      g\(oo\)\{2\}d   =gooood 俩个oo 出现2次
      {2,} >=2
      {2,4} >=2 and /  匹配行里以a为结尾的
      正则选项
      -v  取反
      -i  不分大小写
      -n  显示匹配文件的行号
      -c 显示正则表达式匹配的行数
      -q 不显示输出的信息
      去掉前面有空格 和#的 只要有效行
      [root@xu opt]# grep -v "^$\|^#" /etc/httpd/conf/httpd.conf
      面试的时候肯能出现的匹配
      匹配出make地址HWADDR
      [root@xu opt]# grep "\([0-9a-fA-F]\{2\}:\)\{5\}[0-9a-fA-F]\{2\}" /etc/sysconfig/network-scripts/ifcfg-eth0
      HWADDR=54:E6:FC:71:17:45
      ip地址
      域名                         www   .  baidu     . com
      [root@xu opt]# grep "[a-z0-9]\{1,\}\.[a-z0-9]\{1,\}\.[a-z]\{2,3\}" ifcfg-eth0 aaawww.baidu.com
      主机名
      url 地址 论坛上贴网址的
      邮箱
      ---------------------------------------------------
      sed  交换式的流编辑器
      打印 删除 替换 复制 剪切  粘贴  导入  导出
      处理的时候以行为单位 对文件进行逐行处理
      用法
      sed [ 选项] “动作” 文件名字
      命令 | sed [ 选项] “动作” 文件名字
      打印  “p”
      会显示两行 一个是原数据 一个是处理完以后的数据
      sed "p" /etc/passwd  有两行
      sed "p;p" /etc/passwd  多次动作用;间隔
      sed "p;=" /etc/passwd   = 显示行号
      root:x:0:0:root:/root:/bin/bash     p打印的内容
      1                                  =显示的内容
      root:x:0:0:root:/root:/bin/bash  原数据
      bin:x:1:1:bin:/bin:/sbin/nologin
      2
      bin:x:1:1:bin:/bin:/sbin/nologin
      -n 不显示原数据 只显示输出后的结果
      [root@xu opt]# sed -n "p" /etc/passwd
      打印模几行
      [root@xu opt]# sed -n "2,5p" /etc/passwd
      [root@xu opt]# sed -n "1p;3p;5p" /etc/passwd
      ---------------------
      删除 d
      只删除第一行的显示内容
      [root@xu opt]# sed "1d" /etc/passwd
      [root@xu opt]# sed "1d;3d" /etc/passwd
      起始行 结果行
      [root@xu opt]# sed "1,3d" /etc/passwd
      加 -i 选项 是操作原文件(慎用)
      [root@xu opt]# sed -i "1d" /etc/passwd
      ------------------------------
      用正则表达式来删除 必须要用 / / d 格式匹配
      [root@xu opt]# sed -n "/xly/,/abc/d" /etc/passwd
      从第 2行开始(包括第2行)在往下删去2行
      [root@xu ~]# sed "2,+2d" /etc/passwd
      从2开始 删掉第一个是5的倍数行之间的行
      [root@xu ~]# sed "2,~5d" /etc/passwd
      删除偶数行(能除2的) 每2行删去第1行
      [root@xu ~]# sed "1~2d" /etc/passwd
      --------------------------------
      替换 s   “ s / / /gi“   g全局   i忽略大小写
      [root@xu ~]# sed -n "s/a/b/gi" /etc/passwd
      替换多个范围的 1行到3行
      [root@xu ~]# sed -n "1,3s/a/b/gi" /etc/passwd
      ------
      用正则 修改  用// 圈起来
      把所有的数字改成字母
      [root@xu ~]# sed -n "s/[0-9]/b/g" /etc/passwd
      把包含有字母都删除
      [root@xu ~]# sed -n "s/[a-z]//g" /etc/passwd
      修改运行级别到3
      [root@xu ~]# grep initdefault /etc/inittab
      #  0 - halt (Do NOT set initdefault to this)
      #  6 - reboot (Do NOT set initdefault to this)
      id:5:initdefault:
      [root@xu ~]# sed "/id/s/[0-6]/3/" /etc/inittab
      #
      在sed 的正则表达式里
      -r
      在正则表达式里 不用转意符 可以用-r 解决
      [root@xu ~]# sed -r "/id/s/[0-6]{2}/3/" /etc/inittab
      把/etc/passwd 文件里 没一行的第一个字符删掉
      [root@xu ~]# sed -n "s/.//" /etc/passwd
      把/etc/passwd 文件里 每一行的第一个和最后一个字符删掉
      () 保存所匹配的字符   & 代替你查找的所有字符
      每一个模式 是\1 \2 ...\9  每个模式对应前面的第几个()里的内容
      出现在第一个 是开头 第二个是去掉最后一个的所有内容 的三个是最后一个内容
      [root@xu ~]# sed -n -r "s/(.)(.*)(.)/\2/" /etc/passwd
      修改ip最后的地址为254
      [root@xu opt]# sed -r "s/(192.168.1.)(.*)/\1254/" ip.txt
      192.168.1.254
      192.168.1.254
      192.168.1.254
      192.168.1.254
      192.168.1.254
      192.168.1.254
      192.168.1.254
      把一个文件所有的大写 字母加上个小括号
      [root@xu opt]# sed "s/[A-Z]/(&)/g" /etc/passwd
      -----------------------
      添加 a         默认的是每一行都添加一个
      [root@xu opt]# sed -r "aGATEWAY=192.168.1.254" ifcfg-eth0
      指定位置添加
      [root@xu opt]# sed -r "1aGATEWAY=192.168.1.254" ifcfg-eth0
      插入 i  插入到上面
      [root@xu opt]# sed -r "1iGATEWAY=192.168.1.254" ifcfg-eth0
      替换 c
      第一行替换成GATEWAY....
      [root@xu opt]# sed -r "1cGATEWAY=192.168.1.254" ifcfg-eth0
      导入 r
      把有a里的内容 导入到搜索出来1这行的内容的下面
      把只要有1的行导入到a.txt里去
      什么内容到导入到那里原文件
      [root@xu opt]# sed -r "/1/r a.txt" 1.txt
      导出 w
      把有a的内容写到 1.txt里去 会覆盖之前的内容
      把只要有a的导出到1.txt里
      [root@xu opt]# sed -r "/a /w 1.txt" a.txt
      ------------
      命令组
      root@xu opt]# sed -n "2=;2p" a.txt
      [root@xu opt]# sed -n "2{=;p}" a.txt
      -e  如果有多个命令要执行的时候 可以加多个 -e 连起来 作成一个命令组
      [root@xu opt]# sed -n -e "2=" -e "2p" a.txt、
      除了第一行剩下的内容 取反
      [root@xu opt]# sed -n "1 ! p" 2.txt
      -------------------------
      删出 d
      [root@xu opt]# sed "d" a.txt
      4n 把当前行 读出下一行 也就是 第4行不读 其他的 都读
      [root@xu opt]# sed "4n;d" a.txt
      -----------------
      sed 复制
      有俩个空间  sed的缓存
      一个是模式空间 里面不存数据
      当sed 处理一个流的时候 他会把他放到 里买 处理的时候拿进来 处理完了拿出去
      二个是保持空间
      默认情况下什么都没有 只有一个换行符\n
      俩个选项
      剪贴
      H 追加导入到保持空间
      h 覆盖导入到保持空间
      [root@xu opt]# sed "1h;1d;5G" 2.txt
      粘贴
      G 追加粘贴到模式空间
      g 覆盖粘贴到模式空间
      [root@xu opt]# sed "1H;5G" 2.txt
      [root@xu opt]# sed "1,3h;5G" 2.txt
      -------------------------------------
      awk  单独的一门语言  也是逐行处理
      awk 的格式
      awk [选项] “动作” 文件名
      命令 | awk [选项] “动作” 文件名
      awk -F":" '{print FILENAME}'
      位置变量 第一列的值就是$1
      $1 。。。$n 分割
      $0 代表整个行的信息
      位置变量
      [root@xu opt]# awk -F":" '{print $1,$2}' /etc/passwd
      [root@xu opt]# head /etc/passwd | awk -F":" '{print $1,$2}'
      打印当前文件名  FILENAME
      [root@xu opt]# awk -F":" '{print FILENAME}' /etc/passwd
      打印分割类的个数 NF
      [root@xu opt]# awk -F":" '{print NF}' /etc/passwd
      当前处理行的行数 NR
      [root@xu opt]# awk -F":" '{print NR}' /etc/passwd
      处理当前行在文件内的行数FNR
      [root@xu opt]# awk -F":" '{print FNR}' /etc/passwd
      AWK的默认分隔符 为空格 和 tab键默认时可以省略 -F
      [root@xu opt]# head -3 /etc/passwd | awk -F":" '{print $1,$3,$4}'
      root 0 0
      bin 1 1
      daemon 2 2
      -------------
      awk 处理数据的时候顺序是三个   行前 行中 行后
      行前
      BEGIN{}
      [root@xu opt]# awk -F":" 'BEGIN{print NR}' /etc/passwd
      0
      行中
      {}
      [root@xu opt]# awk -F":" '{print NR}' /etc/passwd
      行后的
      END{}
      [root@xu opt]# awk -F":" 'END{print NR}' /etc/passwd
      73
      -------------------
      用正则
      awk '条件{print NR}'
      ~ 匹配
      !~ 不匹配
      匹配是root的
      [root@xu opt]# awk -F ":" '$1~/root/{print $1}' /etc/passwd
      root
      比较符号
      =  ==   !=  > >=  <

  • 运维网声明 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.yunweiku.com/thread-556210-1-1.html 上篇帖子: 使用shell脚本实现自动化部署hadoop集群 下篇帖子: shell 脚本自动配置发送qq邮件
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

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

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

    扫描微信二维码查看详情

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


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


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


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



    合作伙伴: 青云cloud

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