shell 编程

test和[]:测试

  • 判断文件
     test 
            -e  #判断是否存在
            -d  #判断是否为目录
            -f  #判断是否为文件
            -r
            -w
            -x
            
    test -f /usr/local/mongodb/etc/mongod.conf
    echo $?
    
  • 判断整数
    test 
        -gt
        -ge
        -lt
        -le
        -eq
        -ne
        
    test 9 -gt 6
    echo $?
    
  • 判断字符串
    test
        ===
        !=
        -z 是否为空
        -n 是否不为空
        -e 判断变量是否存在
     
    a=''
    test -z $a
    echo $?
    
  • 组合条件组合条件 -a test 9 -gt 7 -a 5 -gt 3 [ 9 -gt 7 -a 5 -gt 3 ] [[ 9 -gt 7 && 5 -gt 3 ]] echo $? -o test 9 -gt 7 -o 5 -gt 3 [ 9 -gt 7 -o 5 -gt 3 ] [[ 9 -gt 7 || 5 -gt 3 ]] echo $?
  • 取反:!
     [ ! 9 -gt 7 ]
     echo $?
    

数值操作

字符串操作

  • 字符串截取
    • sbustr
      data_date='2018-06-05 15:46:34'
      year=`expr substr "$data_date" 1 4`
      
    • cut
      data_date='2018-06-05 15:46:34'
      month=`echo "$data_date" | cut -c 6-7`
      
      day=`echo "$data_date" | cut -d '-' -f 3 | cut -d ' ' -f 1`
      
    • ${::}
      data_date='2018-06-05 15:46:34'
      year=${data_date:0:4}  year=${data_date::4}
      month=${data_date:5:2}
      
  • 字符串替换
    • ${//}
      data_date='2018-06-05 15:46:34'
      re=`echo ${data_date/-/#}`
      re2=`echo ${data_date//-/#}`
      
    • tr单个字符替换
      astr="hello world"
      echo $astr | tr 'heo'  'ZXY'
      echo $astr | tr -d 'heo'
      
  • 获取随机字符串
     echo $RANDOM | md5sum | cut -c 1-8
     uuidgen | md5sum | cut -c 1-8
     head -1 /dev/urandom| md5sum | cut -c 1-8
    
  • shell识别路径和文件名
    • dirname
      dirname '/home/hadoop/tmp/1.txt'
      
    • basename
      basename '/home/hadoop/tmp/1.txt'
      

重定向

  • 输入重定向
  • 输出重定向
    • 标准输出
      • 覆盖
         ll /tmp > /home/hadoop/tmp/1 
          
         ll /tmp 1> /home/hadoop/tmp/1
        
      • 追加
        ll /tmp >> /home/hadoop/tmp/1 
         
        ll /tmp 1>> /home/hadoop/tmp/1
        
    • 错误输出
      • 覆盖
        lld /tmp > /home/hadoop/tmp/2 
         
        lld /tmp 2> /home/hadoop/tmp/2
        
      • 追加
        lld /tmp >> /home/hadoop/tmp/2 
         
        lld /tmp 2>> /home/hadoop/tmp/2
        
    • 混合输出
      • 覆盖
        ll /tmp 1> /home/hadoop/tmp/11 2> /home/hadoop/tmp/22
        ll /tmp &> /home/hadoop/tmp/33
        
      • 追加
        ll /tmp 1>> /home/hadoop/tmp/11 2>> /home/hadoop/tmp/22
        ll /tmp &>> /home/hadoop/tmp/33
        

逻辑分割符

  • &&
    make && make install
    
  • ||
    id user1 || useradd user1
    
  • && || 组合使用
    AA && BB || CC          //如果AA成功,则执行BB,否则执行CC;相当与if三目运算符,但如果BB执行失败了,CC还会执行
    

shell变量

  • 环境变量
    • env:列出所有环境变量
    • set:列出所有变量
  • 位置变量
    • shell 保存shell脚本参数的变量:$1、$2...
  • 预定义变量
    • bash内置的特殊变量,可以调用但不能赋值:$? $# $*等
  • 自定义变量
    • 全局变量
      • export修饰的变量,当前shell和子shell可以访问
    • 局部变量
      • 当前shell可以访问,但子shell不可以访问
    • 删除变量
      • 删除局部变量
        a=12
        unset a
        
      • 删除出全局变量
        export B=12
        export -n B     并非删除,而是取消B的全局属性
        

正则表达式

  • 基本元字符
    ^       #匹配行首
    $       #匹配行尾
    .       #单个个字符
    +       #最少匹配一次
    ?       #最多匹配一次
    *       #匹配任意次
    {}      
        {n}     #匹配n
        {n,m}   #匹配n~m
        {n,}    #匹配至少n
    []
        [a-z]   #匹配任意的小写字母
        [^abc]  #匹配除abc的任意字符
    
  • 其他元字符
    ()          #组合为整体
    |           #或者
    \b          #匹配单词边界
    \<          #匹配单词开头
    \>          #匹配单词结尾
    

awk

  • wak执行脚本
    awk -f xxx.zak
    
  • awk格式:
    awk [选项] '[条件]{编辑指令}' file
    awk -F ':' '{print $1,$2,$3}' passwd
    
  • awk条件表示
    • 正则表达式
      • ~ #匹配
      • !~ #不匹配
      awk -F ':' '/^bin/ {print $0}' passwd
      awk -F ':' '$0 ~ /^bin/ {print $0}' passwd
      awk -F ':' '$0 !~ /^bin/ {print $0}' passwd
      
    • 数值/字符串
      awk -F ':' '$3 > 1 {print $0}' passwd
      awk -F ':' '$1 == "bin" {print $0}' passwd
      
    • 逻辑比较
      awk -F ':' '$3>1 && $1=="mail" {print $0}' passwd
      
    • 运算符
      awk -F ':' 'BEGIN{i=0}{i+=NF}END{print i}'  passwd
      
  • awk内置变量
    FS          #保存或设置分隔符
    $n·         #n个字段
    $0          #当前读取的整行文本
    NF          #当前行的字段个数
    NR          #当前已读入行的行号
    FNR         #原文本中的行号
    FILENAME    #当前处理文件的文件名
    ENVIRON     #调用shell环境变量
    
  • BEGIN和END
    awk -F ':' 'BEGIN{print"welcome to wak"}{print $1,$1,$2,$3}END{print "this program is end"}' passwd
    
  • awk流程控制
    awk流程控制关键字:
    brak
    continue
    next        #跳过当前行,读入下一行开始处理
    exit        #结束文本读入,转入执行END{}
    
    • if
       awk -F ':' '
           BEGIN{i=0;j=0}
           {
              if($3<10){
                  i++
              }else if($3>100){
                  j++
              }
           }
           END{print i,j}
       '  passwd
      
      • while
      awk -F ':' '
           BEGIN{sum=0}
           {
              i=1
              while(i<NF){
                  if($i ~ /root/){
                      sum++
                  }
                  i++
              }
           }
           END{print sum}
       '  passwd
      
    • for
      awk -F ':' '
           BEGIN{sum=0}
           {
              for(i=1;i<NF;i++){
                  if($i ~ /root/){
                      sum++
                  }
              }
           }
           END{print sum}
       '  passwd
      
  • awk数组
    • 定义、使用
      awk 'BEGIN{a[0]=1;a[1]=2;print a[0],a[1]}'
      awk 'BEGIN{a["ss"]=1;a["tt"]=2;print a["ss"],a["tt"]}'
      awk 'BEGIN{a[0]=1;a[1]=2;for(i in a){print a[i]}}'
      awk 'BEGIN{a["ss"]=1;a["tt"]=2;for(i in a){print a[i]}}'
      
    • 用法
      awk '!a[$0]++' passwd           #去掉重复的行
      awk -F ':' '{a[$7]++}END{for(i in a){print i,a[i]}}' passwd | sort -nr -k2      #统计字段出现的次数,并按次数倒序
      

sed

  • sed格式:
    sed [选项] '编辑指令' file
    sed -n '1,7p' passwd
    
  • sed命令选项
    -n          #屏蔽默认输出
    -i          #直接修改文件内容
    -f          #使用sed脚本
    -e          #可指定多个处理动作
    -r          #启用扩展的正则表达式,放到第一个选项
    -{}         #可组合多个命令,以逗号分隔
    
  • 定址符
    • 正则表达式
      sed -n '/nologin/p' passwd
      
    • 行号
      sed -n '1,4p' passwd
      
  • 基本动作
    • p 打印

      sed  -n '4,+10p' passwd         #输出第4行和其后10
      sed  -n 'p;n' passwd            #输出奇数行
      sed  -n 'n;p' passwd            #输出偶数行
      sed  -n '$=' passwd             #输出文件行数
      sed  -n '10,${n;p}' passwd      #输出10行后的所有偶数行
      sed  -n '4p;7p' passwd          #输出第4行和第10
      
    • d 删除

      sed '4,5d' passwd
      sed '4,5!d' passwd              #保留4~5
      sed '$d' passwd                 #删除最后一行
      sed '/^$/d' passwd              #删除所有空行
      sed '/^$/{n;/^$/d}' passwd      #长处重复空行
      
    • s 替换(分割符:/ 或 # 或 &)

      sed  '/nologin/s/g/#####/' passwd           #替换第1
      sed  '/nologin/s/g/#####/5' passwd          #替换第5
      sed  '/nologin/s/g/#####/g' passwd          #全部替换
      sed  '/nologin/s#g#?????????#g' passwd      #全部替换(替换)
      sed  '/nologin/s/&#####/g' passwd           #把所有的's'替换为's#####'
      sed  '/nologin/s//g' passwd                 #把所有的's'删除
      sed  's/^/#/g' passwd                       #把所有行开头添加'#''
      sed  's/^#//g' passwd                       #把所有行开头的'#'去掉
      sed  's/nologin/&XXXXXXXXXXX/g' passwd      #把所有的nologin替换为'nologinXXXXXXXXXXX'
      
    • i 行前插入

      sed '2iHELLO WORLD' passwd                   #在第2行前插入HELLO WORLD
      
    • a 行后插入

      sed '4,7aHELLO WORLD' passwd                 #在第4~7行后插入HELLO WORLD
      
    • c 替换当前行

      sed '5cHELLO WORLD' passwd                  #把第5行替换为HELLO WORLD
      
    • r 读入文件并插入到指定行后

      sed '1r/etc/sysconfig/network' passwd
      
    • w 把指定的行写入文件

      sed -n '5,7w./xxx' passwd
      
    • h/H;g/G 复制粘贴(小写为覆盖,大写为粘贴)

      sed '1h;2,3H;$G' passwd                   #5~7复制到文件结尾

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值