• shell基本语法


    作业一:整理博客,内容包含awk、变量、运算符、if多分支

    一、AWK

    语法

    awk [options] 'commands' files
    option
    -F 定义字段分隔符,默认的分隔符是连续的空格或制表符
    使用option中的-F参数定义间隔符号
    用$1,$2,$3等的顺序表示files中每行以间隔符号分隔的各列不同域
    NF变量表示当前记录的字段数
    -v定义变量并赋值 也可以借用次方式从shell变量中引入
    

    command处理 

    1.读前处理 BEGIN{awk_cmd1;awk_cmd2}
    2.行处理:定址 命令
    定址方法:正则,变量,比较和关系运算
    正则需要用//包围起来
    ^行首
    $行尾
    .除了换行符以外的任意单个字符
    *前导字符的零个或多个
    .*所有字符
    []字符组内的任一字符
    [^]对字符组内的每个字符取反(不匹配字符组内的每个字符)
    ^[^]非字符组内的字符开头的行
    [a-z]小写字母
    [A-Z]大写字母
    [a-Z]小写和大写字母
    [0-9]数字
    <单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词
    >单词尾
    

    扩展正则 加 -r 参数 或转义

    sed -n '/roo?/p' /etc/passwd 
    sed -rn '/roo?/p' /etc/passwd
    

    ? 前导字符零个或一个
    + 前导字符一个或多个
    abc|def abc或def
    a(bc|de)f abcf 或 adef
    x{m} x出现m次
    x{m,} x出现m次至多次(至少m次)
    x{m,n} x出现m次至n次

    NR变量定址
    NR 表示AWK读入的行数
    FNR表示读入行所在文件中的行数

    # awk '{print NR,FNR,$1}' file1 file2 
    1 1 aaaaa
    2 2 bbbbb
    3 3 ccccc
    4 1 dddddd
    5 2 eeeeee
    6 3 ffffff
    

    逻辑运算 可直接引用域进行运算

    == >= <= != > < ~ !~
    # awk 'NR==1 {print}' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    # 
    3.命令 {print $0}
    4.读后处理 END {awk_cmd1;awk_cmd2;}
    

    AWK变量

    NR 当前记录的个数(全部文件连接后的统计) 
    FNR 当前记录的个数(仅为当前文件的统计,非全部)
    FS 字段分隔符 默认为连续空格或制表符,可以使用多个不同的符号做分隔符 -F[:/]
    OFS 输出字符的分隔符 默认是空格
    # awk -F: 'OFS="=====" {print $1,$2}' /etc/passwd
    root=====x
    NF 当前读入行的字段个数
    ORS 输出记录分隔符 默认是换行
    # awk -F: 'ORS="=====" {print $1,$2}' /etc/passwd
    root x=====bin x=====
    FILENAME 当前文件名
    

    引用shell变量的方法

    # a=root
    # awk -v var=$a -F: '$1 == var {print $0}' /etc/passwd
    或者 把整个命令拆开传递,让shell变量外露,
    # awk -F: '$1 == "'$a'" {print $0}' /etc/passwd
    # a=NF
    # awk -F: '{print $'$a'}' /etc/passwd
    

    操作符
    赋值

    = += -= /= *= 
    逻辑与 逻辑或 逻辑非
    && || !
    匹配正则或不匹配,正则需要用 /正则/ 包围住
    ~ !~
    关系 比较字符串时要把字符串用双引号引起来
    < <= > >= != ==
    字段引用
    $ 字段引用需要加$,而变量引用直接用变量名取
    运算符
    + - * / % ++ --
    转义序列
    \ 自身
    $ 转义$
    	 制表符
     退格符
    
     回车符
    
     换行符
    c 取消换行
    

      

    作业二:awk文本处理

    1、打印uid在30~40范围内的用户名

    [root@nfs-server ~]# awk -F: '$3>=30 && $3<=40{print $1}' /etc/passwd
    rpc
    ntp
    

    2、打印第5-10行的行号和用户名

    [root@nfs-server ~]# awk -F: 'NR>=5 && NR<=10{print NR,"-------",$1}' /etc/passwd
    5 ------- lp
    6 ------- sync
    7 ------- shutdown
    8 ------- halt
    9 ------- mail
    10 ------- operator
    

    3、打印奇数行

    [root@nfs-server ~]# awk '(NR%2){print NR,"----",$0}' test 
    1 ---- root:x:0:0:root:/root:/bin/bash
    3 ---- nginx:x:991:547:Nginx web server:/var/lib/nginx:/sbin/nologin
    5 ---- abominate:x:1010:1011::/home/abominate:/bin/bash
    7 ---- atomize:x:1012:1013::/home/atomize:/bin/bash
    9 ---- Wpq2222b:x:1014:1015::/home/Wpq2222b:/bin/bash
    11 ---- egon666:x:1016:1017::/home/egon666:/bin/bash
    [root@nfs-server ~]# 
    

    4、打印偶数行

    [root@nfs-server ~]# awk '!(NR%2){print NR,"----",$0}' test
    2 ---- bin:x:1:1:bin:/bin:/sbin/nologin
    4 ---- abominable:x:1009:1010::/home/abominable:/bin/bash
    6 ---- anomie:x:1011:1012::/home/anomie:/bin/bash
    8 ---- Alex213sb:x:1013:1014::/home/Alex213sb:/bin/bash
    10 ---- yH438PIG:x:1015:1016::/home/yH438PIG:/bin/bash
    12 ---- egon:x:1017:1002::/home/egon:/bin/bash
    

    5、打印字段数大于5的行

    [root@nfs-server ~]# awk -F: 'NF>5{print $1,"-----",NF}' test
    root ----- 7
    bin ----- 7
    nginx ----- 7
    abominable ----- 7
    abominate ----- 7
    anomie ----- 7
    atomize ----- 7
    Alex213sb ----- 7
    Wpq2222b ----- 7
    yH438PIG ----- 7
    egon666 ----- 7
    egon ----- 7
    

    6、打印UID不等于GID的用户名

    [root@nfs-server ~]# awk -F: '$3!=$4{print $3,"----",$4}' test    
    991 ---- 547
    1009 ---- 1010
    1010 ---- 1011
    1011 ---- 1012
    1012 ---- 1013
    1013 ---- 1014
    1014 ---- 1015
    1015 ---- 1016
    1016 ---- 1017
    1017 ---- 1002
    

    7、打印没有指定shell的用户

    [root@nfs-server ~]# awk -F: '$NF!~/bash$/{print $0}' test
    bin:x:1:1:bin:/bin:/sbin/nologin
    nginx:x:991:547:Nginx web server:/var/lib/nginx:/sbin/nologin
    

    作业三:shell脚本编写

    1、自动部署、初始配置、并启动nginx反向代理服务

    #!/bin/sh
    
    ngxStatus=`ps aux | grep -v grep |grep -c nginx`
    
    if [ -e /usr/sbin/nginx ];then
        echo "nginx already installed"
        exit 110
    else
        yum install epel-release -y -q
        yum install gcc-* glibc-* openssl openssl-devel pcre pcre-devel zlib zlib-devel -y -q
        yum install nginx -y -q
        echo "install nginx successful"
    fi
    if [ -f /etc/nginx/nginx.conf ];then
        /bin/cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
        sed -i '/^http/a\t upstream luchuangao { 
    	 server web01;
    	 server web02;
    	 server web03;
    	 }' /etc/nginx/nginx.conf
        sed -i '/^        location / {/a\t	 proxy_pass http://luchuangao;' /etc/nginx/nginx.conf
        echo "Configuration successful"
    fi
    if [ $ngxStatus -lt 2 ];then
        systemctl start nginx
        echo "Start nginx successful"
    fi

    2、自动部署、初始配置、并启动三台web

    #!/bin/sh
    
    ngxStatus=`ps aux | grep -v grep |grep -c nginx`
    
    if [ -e /usr/sbin/nginx ];then
        echo "nginx already installed"
        exit 110
    else
        yum install epel-release -y -q
        yum install gcc-* glibc-* openssl openssl-devel pcre pcre-devel zlib zlib-devel -y -q
        yum install nginx -y -q
        echo "install nginx successful"
    fi
    if [ -f /etc/nginx/nginx.conf ];then
        /bin/cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
        sed  -i '/^        location / {/a\t	 root /data/www/html;
    		 index index.html;' /etc/nginx/nginx.conf
        mkdir -p /data/www/html
        echo `hostname` > /data/www/html/index.html
        echo "Configuration successful"     
    fi
    if [ $ngxStatus -lt 2 ];then
        systemctl start nginx
        echo "Start nginx successful"
    fi

    3、监控脚本:监控每台机器的内存使用率>70%,则输出报警信息

    #!/bin/sh
    
    mem_use=`free | awk 'NR==2{print $3}'` 
    mem_total=`free | awk 'NR==2{print $2}'`
    mem_per=`echo "scale=2;$mem_use/$mem_total"|bc -l |cut -d . -f2`
    
    if [ -e /usr/bin/bc ];then
        echo "bc already installed"
    else
        yum install bc -y -q
        echo "bc nginx successful"
    fi
    
    #if [ $mem_per -gt 70 ];then
    if (( $mem_per > 70 )); then
        echo "Warning free has not enough, now free is ${mem_per}%"
    else
        echo "Now free is ${mem_per}%"
    fi
    

    参考链接:http://www.cnblogs.com/linhaifeng/p/6596660.html
    参考链接:http://www.cnblogs.com/linhaifeng/p/6602149.html

  • 相关阅读:
    每日一道 LeetCode (11):外观数列
    每日一道 LeetCode (10):搜索插入位置
    每日一道 LeetCode (9):实现 strStr()
    每日一道 LeetCode (8):删除排序数组中的重复项和移除元素
    每日一道 LeetCode (7):合并两个有序链表
    每日一道 LeetCode (6):有效的括号
    Python 图像处理 OpenCV (16):图像直方图
    每日一道 LeetCode (5):最长公共前缀
    每日一道 LeetCode (4):罗马数字转整数
    每日一道 LeetCode (3):回文数
  • 原文地址:https://www.cnblogs.com/luchuangao/p/6606833.html
Copyright © 2020-2023  润新知