1.基础正则表达式

    1).正则表达式与通配符
        >正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep,awk,sed等命令可以支持正则表达式.
        >通配符用来匹配符合条件的文件名,通配符是完全匹配.ls,find,cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了.
    2).基础正则表达式
        * :前一个字符匹配0次或任意多次
        .  :匹配除了换行符外任意一个字符
        ^:匹配行首.例如:^hello会匹配以hello开头的行
        $:匹配行尾.例如:hello&会匹配以hello结尾的行
        []:匹配中括号中指定的任意一个字符,只匹配一个字符.例如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一位数字,[a-z][0-9]匹配小写字和一位数字结构的两位字符.
        [^]:匹配除中括号的字符以外的任意一个字符.例如:[^0-9]匹配任意一位非数字字符,[^a-z]表示任意一位非小写字母.
        \:转义符.用于取消将特殊符号的含义取消.
        \{n\}:表示其前面的字符恰好出现n次.例如:[0-9]\{4\}匹配4位数字,[1][3-8][0-9]\{9\}匹配手机号码.
        \{n,\}:表示其前面的字符出现不小于n次.例如:[0-9]\{2,\}表示两位及以上的数字.
        \{n,m\}:表示其前面的字符至少出现n次,最多出现m次.例如:[a-z]\{6,8\}匹配6到8位的小写字母.
    2.1).例子
        grep "a*" aaa.txt【匹配所有内容,包括空白行】
        grep "aa*" aaa.txt【匹配至少包含有一个a的行】
        grep "aaa*" aaa.txt【匹配最少包含两个连续a的字符串】
        grep "aaaaa*" aaa.txt【则会匹配最少包含四个连续a的字符串】
        grep "s..d" aaa.txt【"s..d"会匹配在s和d这两个字母之间一定有两个字符的单词】
        grep "s.*d" aaa.txt【匹配在s和d字母之间有任意字符】
        grep ".*" aaa.txt【匹配所有内容】
        grep "^M" aaa.txt【匹配以大写"M"开头的行】
        grep "n$" aaa.txt【匹配以小写"n"结尾的行】
        grep -n "^$" aaa.txt【会匹配空白行】
        grep "s[ao]id" aaa.txt【匹配s和i字母中,要么是a,要么是o】
        grep "[0-9]" aaa.txt【匹配任意一个数字】
        grep "^[a-z]" aaa.txt【匹配用小写字母开头的行】
        grep "^[^a-z]" aaa.txt【匹配不用小写字母开头的行】
        grep "^[^a-zA-Z]" aaa.txt【匹配不用字母开头的行】
        grep "\.$" aaa.txt【匹配使用"."结尾的行】
        grep "a\{3\}" aaa.txt【匹配a字母连续出现三次的字符串】
        grep "[0-9]\{3\}" aaa.txt【匹配包含连续的三个数字的字符串】
        grep "^[0-9]\{3,\}[a-z]" aaa.txt【匹配最少用连续三个数字开头的行】
        grep "sa\{1,3\}i" aaa.txt【匹配在字母s和字母i之间有最少一个a,最多三个a】

2.字符截取命令

    1).cut字段提取命令
        cut [选项] 文件名【-f 列号:提取第几列,-d 分隔符:按照指定分隔符分割列 -c 以字符的单位取出固定的字符区间】
          eg:1.-d -f
             ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428011651557-460547914.png)
             2.-c
             ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428011741784-269221192.png)

    2).printf命令 (格式化打印命令)
        printf '输出类型 输出格式' 输出内容
            输出类型:
                %ns:输出字符串.n是数字指代输出几个字符
                %ni:输出整数.n是数字指代输出几个数字
                %m.nf:位数和小数位数.如%8.2f代表共输出8位数,其中2位是小数,6位是整数
            输出格式:
                \a:输出警告声音
                \b:输出退格键,也就是Backpace键
                \f:清除屏幕
                \n:换行
                \r:回车,也就是Enter键
                \t:水平输出退格键,也就是Tab键
                \v:垂直输出退格键,也就是Tab键
            eg:
                ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428011811094-961112968.png)



    3).awk命令---【具体用法建议百度】
        ①.awk '条件1{动作1} 条件2{动作2}...' 文件名【awk '{printf $2 "\t" $6"\n"}' temp.txt】
            条件:
                一般使用关系表达式作为条件
                x>10        判断变量x是否大于10
                x>=10        大于等于
                x<=10        小于等于
            动作:
                格式化输出
                流程控制语句
        ②.awk 'BEGIN{printf "hello world\n"}{printf $2 "\t" $6"\n"}' temp.txt【BEGIN优先执行一段输出】
        ③.awk 'END{printf "hello world\n"}{printf $2 "\t" $6"\n"}' temp.txt【所有数据处理完之后,再执行end命令的输出】
        ④.cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"}{printf $2 "\t" $6"\n"}'【FS内置变量,指定分隔符,默认为空格和【tab】】
        ⑤.cat temp.txt | grep -v name | awk '$6>=87 {printf $2 "\n"}'【关系运算符】
         eg:
             1.
             ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428011844882-851878919.png)



             2. 查询分区使用率超过10%的分区名称 和 百分比数值
                命令:df -h | grep -v Filesystem | awk '{print $1"%"$5}' | awk 'BEGIN{FS="%"} BEGIN{print "is gt 10%"} END{print "the end"}     
                           $2>10{print $1 "\t" $2}'
                ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428011941821-210411539.png)



    4).sed命令
        ①.sed命令
            sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器.sed主要是用来将数据进行选取,替换,删除,新增的命令.
        ②.sed [选项] '[动作]' 文件名【sed -n '2p' temp.txt】
            选项:
                -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕.
                -e:允许对输入数据应用多条sed命令编辑.
                -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出.
            动作:
                a:追加,在当前行后添加一行或多行.添加多行时,除最后一行外,每行末尾需要用"\"代表数据未完结
                c:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用"\"代表数据未完结
                i:插入,在当期行前插入一行或多行.插入多行时,除最后一行外,每行末尾需要用"\"代表数据未完结
                d:删除,删除指定的行
                p:打印,输出指定的行
                s:字串替换,用一个字符串替换另外一个字符串.格式为"行范围s/旧字串/新字串/g"(和vim中的替换格式类似)

3.字符处理命令

    1).排序命令sort
        sort [选项] 文件名
            -f:忽略大小写
            -n:以数值型进行排序,默认使用字符串型排序
            -r:反向排序
            -t:指定分隔符,默认是分隔符是制表符
            -k n[,m]:按照指定的字段范围排序.从第n字段开始,m字段结束(默认到行尾)
        eg:
            1.
             ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428012127696-1360447368.png)



            2.
              ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428012142365-279478595.png)



    2).uniq
            -i:忽略大小写字符的不同
            -c:统计行数
             eg:
              ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428012207349-1677641988.png)



    3).统计命令wc
        wc [选项] 文件名
            -l:只统计行数
            -w:只统计单词数
            -m:只统计字符数
             eg:
                ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428012232137-405360159.png)

4.双向重定向tee

               语法:tee  [选项] 文件名
               -a 以追加的方式重定向到文件中
               eg:
                ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428012254009-1479246898.png)



               解释:tee会同时将数据流送与文件与屏幕

5.字符转换命令

              1)tr 可以用来删除一段信息当中的文字,或者是进行文字信息的替换
                 语法:tr [-ds] SET 1 ...
                                -d : 删除信息当中的SET1 这个字符串;
                                -s  : 替换掉重复的字符串 
                 eg:
                     1.
                     ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428012329449-719916874.png)



                     2.
                      ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428012337597-1775139146.png)



              2).paste 
                     解释:paste将两个文件的两行贴在一起,且中间以【tab】键隔开
                       eg:
                       ![](https://img2020.cnblogs.com/blog/1223444/202004/1223444-20200428012356388-553969515.png)

6.切割命令split

      解释:将一个大的文件依据文件大小或行数来切割成为小的文件

7.条件判断

    1).按照文件类型进行判断【[ -f /tmp/temp.txt ] && echo "yes" || echo "no"】
        判断方式:1.test  选项 文件或目录  2. [ 选项  文件或目录] 
        测试选项 |        作用
        ------------------------------------------------------------------------
        -b 文件  |判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
        -c 文件  |判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
        -d 文件  |判断该文件是否存在,并且是否为目录文件(是目录为真)
        -e 文件  |判断该文件是否存在(存在为真)
        -f 文件  |判断该文件是否存在,并且是否为普通文件(是普通文件为真)
        -L 文件  |判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
        -p 文件  |判断该文件是否存在,并且是否为管道文件(是管道文件为真)
        -s 文件  |判断该文件是否存在,并且是否为非空(非空为真)
        -S 文件  |判断该文件是否存在,并且是否为套接字文件(是套接字文件为真 )\
    2).按照文件权限进行判断【[ -r /tmp/temp.txt ] && echo "yes" || echo "no"】
        判断方式:1.test  选项 文件或目录  2. [ 选项  文件或目录]
        测试选项 |        作用
        ------------------------------------------------------------------------
        -r 文件  |判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
        -w 文件  |判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
        -x 文件  |判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
        -u 文件  |判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
        -g 文件  |判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
        -k 文件  |判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)
    3).两个文件之间进行比较【[ /tmp/temp.txt -nt /tmp/temp.txt ] && echo "yes" || echo "no"】
        测试选项        |        作用
        ------------------------------------------------------------------------
        文件1 -nt 文件2    |判断文件1的修改时间是否比文件2的新(如果新则为真)
        文件1 -ot 文件2    |判断文件1的修改时间是否比文件2的旧(如果旧则为真)
        文件1 -ef 文件2    |判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件.这个判断用于判断硬链接是很好的方法.
    4).两个整数之间比较【[ 22 -eq 23 ] && echo "yes" || echo "no"】
        测试选项        |        作用
        ------------------------------------------------------------------------
        整数1 -eq 整数2    |判断整数1是否和整数2相等(相等为真)
        整数1 -no 整数2    |判断整数1是否和整数2不相等(不相等为真)
        整数1 -gt 整数2    |判断整数1是否大于整数2(大于为真)
        整数1 -lt 整数2    |判断整数1是否小于整数2(小于为真)
        整数1 -ge 整数2    |判断整数1是否大于等于整数2(大于等于为真)
        整数1 -le 整数2    |判断整数1是否小于等于整数2(小于等于为真)
    5).字符串的判断【[ -z temp ] && echo "yes" || echo "no"】
        测试选项        |        作用
        ------------------------------------------------------------------------
        -z 字符串            |判断字符串是否为空(为空返回真)
        -n 字符串            |判断字符串是否为非空(非空返回真)
        字串1 == 字串2    |判断字符串1是否和字符串2相等(相等返回真)
        字串1 != 字串2    |判断字符串1是否和字符串2不相等(不相等返回真)
    6).多重条件判断【[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"】
        测试选项        |        作用
        ------------------------------------------------------------------------
        判断1 -a 判断2        |逻辑与,判断1和判断2都成立,最终的结果才为真
        判断1 -o 判断2        |逻辑或,判断1和判断2有一个成立,最终的结果就为真
        ! 判断                        |逻辑非,使原始的判断式取反

8.流程控制

    1).if语句
        ①.单分支if条件语句
            if [ 条件判断式 ];then
                程序
            fi
            或者
            if [ 条件判断式 ]
                then
                    程序
            fi
            -----------------------------------
            单分支条件语句需要注意几个点
                >if语句使用fi结尾,和一般语言使用大括号结尾不同
                >[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格.
                >then后面跟符合条件之后执行的程序,可以放在[]之后,用";"分割.也可以换行写入,就不需要";"了.
        ②.双分支if条件语句
            if [ 条件判断式 ]
                then
                    条件成立时,执行的程序
            else
                条件不成立时,执行的另一个程序
            fi
        ③.多分支if条件语句
            if [ 条件判断式1 ]
                then
                    条件成立时,执行的程序
                    exit 1
            elif [ 条件判断式2 ]
                then
                    条件成立时,执行的程序
            else
                    条件不成立时,执行的另一个程序
            fi
    2).case语句
        ①.多分支case条件语句
            >case语句和if...elif...slse语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系.
            case $变量名 in
                "值1")
                    如果变量的值等于值1,则执行程序1
                    ;;
                "值2")
                    如果变量的值等于值2,则执行程序2
                    ;;
                *)
                    如果变量的值都不是以上的值,则执行此程序
                    ;;
            esac    
    3).for循环
        ①.语法一
            for 变量 in 值1 值2 值3 ...
                do
                    程序:echo "hello"
                done
        ②.语法二
            for (( 初始值;循环控制条件;变量变化))
                do
                    程序
                done
    4).while循环
        ①.while循环
            >while循环是不定循环,也称作条件循环.只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止.这就和for的固定循环不太一样了.
            格式:
                while [ 条件判断式 ]
                    do
                        程序
                    done
        ②.until循环
            >until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序.一旦循环条件成立,则终止循环.
            格式:
                until [ 条件判断式 ]
                    do
                        程序
                    done
posted on 2020-04-28 01:25  whn051799  阅读(215)  评论(0编辑  收藏  举报