shell汇总

0)、字符串

    %d %s %c %f 格式替代符详解:

    d: Decimal 十进制整数 -- 对应位置参数必须是十进制整数,否则报错!

    s: String 字符串 -- 对应位置参数必须是字符串或者字符型,否则报错!

    c: Char 字符 -- 对应位置参数必须是字符串或者字符型,否则报错!

    f: Float 浮点 -- 对应位置参数必须是数字型,否则报错!

    如:其中最后一个参数是 "def",%c 自动截取字符串的第一个字符作为结果输出。

    $  printf "%d %s %c\n" 1 "abc" "def"
    1 abc d


    假设有变量 var=http://www.aaa.com/123.htm
    1. # 号截取,删除左边字符,保留右边字符。

    echo ${var#*//}
    其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符

    即删除 http://

    结果是 :www.aaa.com/123.htm

    2. ## 号截取,删除左边字符,保留右边字符。

    echo ${var##*/}
    ##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符

    即删除 http://www.aaa.com/

    结果是 123.htm

    3. %号截取,删除右边字符,保留左边字符

    echo ${var%/*}
    %/* 表示从右边开始,删除第一个 / 号及右边的字符

    结果是:http://www.aaa.com

    4. %% 号截取,删除右边字符,保留左边字符

    echo ${var%%/*}
    %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符

    结果是:http:

    5. 从左边第几个字符开始,及字符的个数

    echo ${var:0:5}
    其中的 0 表示左边第一个字符开始,5 表示字符的总个数。

    结果是:http:

    6. 从左边第几个字符开始,一直到结束。

    echo ${var:7}
    其中的 7 表示左边第8个字符开始,一直到结束。

    结果是 :www.aaa.com/123.htm

    7. 从右边第几个字符开始,及字符的个数

    echo ${var:0-7:3}
    其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。

    结果是:123

    8. 从右边第几个字符开始,一直到结束。

    echo ${var:0-7}
    表示从右边第七个字符开始,一直到结束。

    结果是:123.htm

    注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)


    9. #、## 表示从左边开始删除。
       一个 # 表示从左边删除到第一个指定的字符;
       两个 # 表示从左边删除到最后一个指定的字符。

    10. %、%% 表示从右边开始删除。
       一个 % 表示从右边删除到第一个指定的字符;
       两个 % 表示从左边删除到最后一个指定的字符。
字符串截取
7)、sort+uniq
              1.sort -u #去除重复的行
              2.uniq #只能去除连续重复的行
              3.uniq -c #打印每行文本中重复出现的次数
              4.uniq -d #只显示有重复的记录,每个重复记录只出现一次
              5.uniq -u #只显示没有重复的记录            


9)、抽取字串
        #{string:position} #从名称为$string的字符串的第$position个位置开始抽取字串
        #{string:position:length} #基于第一种固定长度
        例如:
        string="abcdefg"
        echo ${string:3} #从标号3开始抽取字串

        #{string: -position} #冒号和横杆符号之间有一个空格符
        #{string:(position)} #冒号和左括号之间未必要有空格符
        例如:string="abcdefghijklhadoop"
        echo ${string:-6} #没有空格,表示抽取整个字符串

        echo ${string:(-6)} #用圆括号将数字括起,从右边抽取整个字符串

        echo ${string: -6} #冒号和横杆之间有空格,从右边开始抽取长度为6的字符串
        ---------------------------------------------------------------
        expr substr "$string" 1 8  #从位置1开始向后截取8个字符串
        echo ${string:1:8} #起始位置为0;次数表示从起始位置为1向后截取8个字符

        expr match $string '\($substring\)'
        expr $string : '\($substring\)'  #冒号前后都有一个空格


10)、grep
              -c 只输出匹配行的数量
              -i 搜索时候忽略大小写
              -n 显示行号和内容
              -v 取反
              -h 多文件搜索时候不显示搜索的名称
              ---------------------
              grep ^[^"#;"]  /etc/samba/smb.conf  查看取消注释的所有文件
              grep -rn vm /etc/ #在/etc目录下找含有vm的字符串。
sort,uniq,grep,{var#},${var%}

 

1)、find相关
        0. find /etc -type f -name "rc" | xargs -I {} cp -ar {} /home  #查找到的复制到/home目录下
        1. find /etc -type f -name "rc*" -exec ls -l {} \;  #花括号和斜杠中间有空格
        2. find /etc -type f -name "rc*" -ok rm -rf {} \;  #每删除一项都有提示
        3. find . -name "pass*" | xargs chmod a=rwx  #查找后授权限
find

 

2)、yum相关
        0.yum whatprovides libACE_SSL-5.7.2.so #查询那个软件包有这种软件yum
        1.yum provides nslookup  #查询nslookup命令属于哪个软件包
yum

 

3)、sed篇
     3.1)sed基础
        p 打印匹配行

        = 打印文件行号

        a\ 在指定的文件后追加文本 例如:sed '/root/a\hello' passwd

        i\ 在定位行号之前插入内容信息(insert)

        d  删除文本

        -i.bak   源文件自动备份为“源文件名.bak”

        c\ 用新文本替换匹配的行  eg sed '/nologin/c\hello' /etc/passwd #以nologin的行替换为hello

        n或--quiet  #安装模式

        e   #多个模式同时匹配 例如: sed -n -e '/root/p' -e '/root/=' /etc/passwd

        $   #在正则表达式中表示行尾,在sed中表示最后一行 例如:sed -n '$p' passwd

        !   #表示取反 例如: sed -n '1,10!p' passwd #打印非1-10行

        /pattern/,x 和 x,/pattern/ #定义行号与关键字匹配行之间的范围 例如:sed -n '/root/,$p' passwd #匹配/root/到最后一行内容

        r   从一个文件中读文件

        w   将文本写入到一个文件

        [root@localhost home]# aa="(:0.0)"
        [root@localhost home]# echo $aa | sed -e 's/[()]//g' 
        :0.0

        [root@class14 ~]# sed -n '1p' /etc/passwd  #加了-n选项不打印所有行
        root:x:0:0:root:/root:/bin/bash

        [root@class14 ~]# sed -n '1,3p' /etc/passwd 
        root:x:0:0:root:/root:/bin/bash
        bin:x:1:1:bin:/bin:/sbin/nologin
        daemon:x:2:2:daemon:/sbin:/sbin/nologin

        [root@class14 ~]# sed -n '/root/p' /etc/passwd
        root:x:0:0:root:/root:/bin/bash
        operator:x:11:0:operator:/root:/sbin/nologin

        [root@class14 ~]# sed -n '/root/=' /etc/passwd #打印匹配行的行号
        1
        11

        [root@class14 ~]# sed  -n -e '/root/=' -e '/root/p' /etc/passwd 
        1
        root:x:0:0:root:/root:/bin/bash
        11
        operator:x:11:0:operator:/root:/sbin/nologin

        sed带多个编辑命令需要携带-e选项
        sed [选项] -e 编辑命令1 -e 编辑命令2 -e 编辑命令3  输入文件

        [root@class14 ~]# sed -n '$p' pass #打印最后一行
        adm:x:3:4:adm:/var/adm:/sbin/nologin

        sed '1,10d' pass  #删除pass文件中的1-10行

        @@@@@@@@@@@@
        -n 与 -p 相结合使用只打印匹配行
        @@@@@@@@@@@@
        [root@class16 ~]# sed  -n 's/root/JACK/gp' passwd 
        JACK:x:0:0:JACK:/JACK:/bin/bash
        [root@class16 ~]#
        ++++++++++++++++++++++++++++++++++++++++++++++++++++++

        [root@class16 ~]# sed -n 's/root/ROOT/gw aab' passwd 
        [root@class16 ~]# more aab
        ROOT:x:0:0:ROOT:/ROOT:/bin/bash
        [root@class16 ~]# 
        ++++++++++++++++++++++++++++++++++++++++++++++++++
         &符号可用来保存被替换的字符串以供调用.
        sed -n 's/root/(&)/pg' pass
        sed -n 's/root/(root)/pg' pass

        [root@class16 ~]# sed -n 's/root/(&)/pg' passwd 
        (root):x:0:0:(root):/(root):/bin/bash
        [root@class16 ~]# 
        [root@class16 ~]# 
        [root@class16 ~]# sed -n 's/root/(root)/pg' passwd 
        (root):x:0:0:(root):/(root):/bin/bash
        ##################################################
        利用sed写入到一个新文件
        sed -n '1,5 w /root/ab' /etc/passwd  #将/etc/passwd前5行写入到/root/ab

        sed '/root/r ab' passwd #将ab文件读入到passwd的root行前.
        ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
        sed -n -e '/root/p' -e '/root/=' /etc/passwd
        等价于
        sed -n  '/root/{p;=}' /etc/passwd
        等价于
        sed -n '/root/p;/root/=' /etc/passwd
        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

        处理匹配行的下一行:
        sed '/root/{n;s/x/jack/;}' /etc/passwd

        sed缓冲区的处理:
        sed -e '/root/h' -e '/root/x' -e '$G' /etc/passwd

        h和H: 模式缓冲区内容替换保持缓冲区内容,
              h是将保持缓冲区的旧内容覆盖掉副本,
            H是追加,在保持缓冲区旧内容上增加新内容

        g和G: 保持缓冲区内容替换模式缓冲区内容,G是追加,
               g是副本

        ###########################################
        如何在shell下切换用户执行命令?

        [plain] view plaincopy在CODE上查看代码片派生到我的代码片
        su - dev -c "ls"  
        ?
        "su -"切换用户,并且当前目录页切换到相应用户的根目录。
        "dev"是用户名
        "-c"后面接需要执行的shell comman
        例如:
        su - oracle -c "cat >>/etc/profile<<!export ORACLE_HOME=/u01/app/oracle!"

        +++++++++++++++++++++++++++++++++++++++++
        sed利用变量上下文
        案例一:匹配含有listen的行
        #!/bin/bash
        aa=listen
        sed -n '/'"$aa"'/p' /root/named.conf
        使用变量只用加上一个双引号就行.
        sed -i.bak '8 s/@/'"$aa"'/g'


        例如:
        sed -i.bak '/root/p' passwd #将源文件重命名为.bak文件结尾,生成一个以源文件命名的文件

        sed '36 r a.txt' named.conf #在36行插入文本a.txt内容
        sed -n 's/root/ROOT/p' /etc/passwd #将root替换为ROOT并且显示到屏幕


        cat passwd
        aaaaaaJACKccccccddddee
        aa = 5
        sdgalgdl
        bb = 6

        将空格使用[[:spance:]]来代替
        sed -i "s#aa[[:space:]]=[[:space:]]5#abc = 50#g" passwd

        zoer@ubuntu:~$ cat data  
        here is a   
        test naughty loves cc  
        and so on....  
          
        zoer@ubuntu:~$ cat dd  
        testline1  
        testline2  

        zoer@ubuntu:~$ sed '/naughty/r dd' data  
        here is a   
        test naughty loves cc  
        testline1  
        testline2  
        and so on....  
        上面的命令匹配naughty这个单词并且在该行的下一行开始插入dd文件的内容。

     3.2)sed变量
       1、sed命令使用双引号的情况下,可以使用$var(变量)直接引用:
           echo | sed "s/^/$RANDOM.rmvb_/g"
           13562.rmvb_

       2、sed命令使用单引号的情况下,可以使用'"$var"'引用(单引号,然后双引号,变量):
           echo | sed 's/^/'"$RANDOM"'.rmvb_/g'
           2442.rmvb_
         
       3、sed中执行外部命令。
         sed命令使用单引号的情况下使用'`shell command`'或者'$(shell command)'引用命令执行的结果:
           echo | sed 's/^/'`echo $RANDOM`'.rmvb_/g'
           7700.rmvb_# 结果

         # 上面的命令使用了旧式的命令替换,也可以采用新式的命令替换方法,如下:
           echo | sed 's/^/'$(echo $RANDOM)'.rmvb_/g'
           13856.rmvb_# 结果

         # 下面例子取用当前日期作为结果的一部分,如下:
           echo | sed 's/^/'$(date +"%Y%m%d")'.rmvb_/g'
           20130401.rmvb_ # 结果
         
       2、sed命令中使用双引号的情况下,直接`shell command`或者$(shell command)引用命令执行。
           echo | sed "s/^/$(date +"%Y%m%d").rmvb_/g"
           20130401.rmvb_# 结果

         # 使用环境变量$RANDOM以及旧式命令替换的例子:
           echo | sed "s/^/`echo $RANDOM`.rmvb_/g"
           29484.rmvb_# 结果
sed用法

 

4)、EOF文件描述符
            shell将分界符delimiter之后直至下一个delimiter之前的所有内容作为输入,

            EOF名称可以自定义,一个脚本中多个EOF不要重名,可以EOFA,EOFB,EOFC....

            例如: 'EOF' =>传入内容为源代码
            cat >>aa.txt<<'EOF'
            export PATH=${ORACLE_HOME}:/bin:$PATH
            EOF

            例如: EOF=>传入内容为真实路径
            cat >>aa.txt<<'EOF'
            export PATH=${ORACLE_HOME}:/bin:$PATH
            EOF
EOF,'eof' 文件描述符

 

5)、 AWK汇总:
  5.1)AWK篇一

        语法:awk 模式  动作
        ------------------
        注意事项:
        1.确保用花括号括起来动作语句,用圆括号括起来条件语句.
        2.确保整个awk命令用单引号括起来

        1.将文件aa打印屏幕并另存为ab
        awk '{print $0}' aa | tee ab  #此命令没有模式部分,动作部分必须使用花括号{}括起来

        2.打印"起始部分","动作部分","结束部分"
            awk 'BEGIN {print "Name\n----------"}{print $1}END{"end-of-report"}' aa

        3.awk -F ":" 'BEGIN{print "用户名\t用户ID\n--------------"}{print $1 "\t" $3}' aa
            用户名    用户ID
            --------------
            root       0
            bin        1
            daemon     2

        4.条件匹配,搜索$1为/root的行
            awk '{if($1~/root/)print $0}' aa

        5.匹配第一列为root
            [root@class16 ~]# awk -F ":" '{if($1~/root/)print $0}' aa
            root:x:0:0:root:/root:/bin/bash
            或者是
            [root@class16 ~]# awk -F ":" '$1=="root" {print $0}' aa
            root:x:0:0:root:/root:/bin/bash

        6.$4列比$3列数字大的现实出来
            [root@class16 ~]# awk -F ":" '{if($4>$3) print $0}' aa
            bin:x:1:21:bin:/bin:/sbin/nologin
            adm:x:3:4:adm:/var/adm:/sbin/nologin
            adm:x:3:4:adm:/var/adm:/sbin/nologin
            lp:x:4:27:lp:root:/var/spool/lpd:/sbin/nologin

        7.查询大小写字母
            [root@class16 ~]# awk '/[rR]oot/' aa
            root:x:0:0:root:/root:/bin/bash
            daemon:xroot:2:2:daemon:/sbin:/sbin/nologin
            lp:x:4:27:lp:root:/var/spool/lpd:/sbin/nologin
            Rootadm:x:23:4:adm:/var/adm:/sbin/nologin

        8.抽取任意字母;从aa文件中抽取第一列为四个字符串,最后一个字符为a
            awk '{$1 ~^...a}'  aa

        9.或关系抽取
            [root@class16 ~]# awk '$0 ~/(root|ROOT)/' aa
            root:x:0:0:root:/root:/bin/bash
            daemon:xroot:2:2:daemon:/sbin:/sbin/nologin
            lp:x:4:27:lp:root:/var/spool/lpd:/sbin/nologin
            或者是
            [root@class16 ~]# awk '$0 ~/(root|ROOT)/' aa
            root:x:0:0:root:/root:/bin/bash
            daemon:xroot:2:2:daemon:/sbin:/sbin/nologin
            lp:x:4:27:lp:root:/var/spool/lpd:/sbin/nologin
            [root@class16 ~]# 

        10.AWK内置变量
            ARGC   命令行参数个数
            ARGV   命令行参数排列
            NR     已读的记录数
            NF     浏览记录的域个数

        [root@class16 ~]# awk '{print NF,NR,$0}END{print FILENAME}' aa
            1 1 root:x:0:0:root:/root:/bin/bash
            1 2 bin:x:1:21:bin:/bin:/sbin/nologin
            1 3 daemon:xroot:2:2:daemon:/sbin:/sbin/nologin
            aa
            [root@class16 ~]# 

        11.如果aa文件的记录数大于0,并且第一列匹配root后才打印$0
            [root@class16 ~]# awk '{if(NR>0 && $1~/root/)print $0}' aa
            root:x:0:0:root:/root:/bin/bash
            daemon:xroot:2:2:daemon:/sbin:/sbin/nologin
            lp:x:4:27:lp:root:/var/spool/lpd:/sbin/nologin
            [root@class16 ~]# 

        12.使用NF打印当前目录的最后一个位置
            [root@class16 network-scripts]# pwd
            /etc/sysconfig/network-scripts
            [root@class16 network-scripts]# echo $PWD| awk -F "/" '{print $NF}'
            network-scripts
            [root@class16 network-scripts]# 

        13.使用名称替换打印
            [root@class16 ~]# awk -F ":" '{name=$1;login=$7;if(login~/\/sbin\/nologin/) print name "  is not login system"}' aa
            bin is not login system
            daemon is not login system
            adm is not login system
            adm is not login system
            bin is not login system
            daemon is not login system

        14.定义一个变量BASELINE;当第七列等价于BASELINE时候,打印$0
            [root@class16 ~]# awk -F ":" 'BEGIN {BASELINE="/bin/bash"} {if($7==BASELINE)print $0}' aa
            root:x:0:0:root:/root:/bin/bash

        15.如果$1为root,则将$1改为"root_jack";打印所有行
            [root@class16 ~]# awk -F ":" '{if($1=="root")($1="root_jack");print $1}' aa  #注意条件后面的分号
            root_jack
            bin
            daemon
            [root@class16 ~]# 

        16.如果$1为root,则将$1改为"root_jack";打印修改的行
            [root@class16 ~]# awk -F ":" '{if($1=="root"){$1="root_jack";print $1}}' aa
            root_jack
            [root@class16 ~]# 

        17.打印指定行,并且创建一个新域$8
        [root@class16 ~]# awk -F ":" 'BEGIN{print "用户名\t\tID\n-------- ----"}{if($3<=$4){$8=$4-$3} print $1"\t\t"$8}' aa 
              用户名     ID
              -----------------------
              root      0
              bin       20
              daemon    0
              [root@class16 ~]# 

        18.定义过滤的值
            [root@class16 ~]# df -k | awk '($4~/^[0-9]/)   {if($4<Tr) print $6"\t"$4}' Tr=56000 
            /mnt  0  #次行为显示结果
            [root@class16 ~]#

        19. 定义变量过滤
            [root@class16 ~]# who | awk '{if($1==user)print $1 " you are connected to "$2}' user=$LOGNAME
            root you are connected to tty1


        20.使用脚本方式编写
        [root@class16 ~]# cat au.awk 
            #!/bin/awk -f
            BEGIN{FS=":"}
            {print $1,"\t",$5}
            [root@class16 ~]# 

        21.去除file文件中重复的内容,并统计个数:
            awk '{a[$0]++}  END{for(i in a)print i,a[i]}' file | sort
         
  5.2)AWK篇二

        !~  不匹配正则表达式
        ~   匹配正则表达式
        ++x  #在返回x值之前,x变量加1
        x++  #在返回x值之后,x变量加1
       
        

        一: awk中使用shell中的变量 "'$var'"

             例如:
              var="test"
              awk 'BEGIN{print "'$var'"}'

              将双括号变为单括号的常量,传递给了awk.

              如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:

              var="this is a test"
              awk 'BEGIN{print "'"$var"'"}'


        二: export 变量,使用ENVIRON["var"]形式,获取环境变量的值

              例如:
              var="this is a test"; export var;awk 'BEGIN{print ENVIRON["var"]}'
        

        三: 可以使用awk的-v选项  (如果变量个数不多,个人偏向于这种写法)

              例如:
              var="this is a test"
              awk -v awk_var="$var" 'BEGIN {print awk_var}’

              这样便把系统变量var传递给了awk变量awk_var.      


        四:awk向shell变量传递值

            "由awk向shell传递变量",其思想无非是用awk(sed/perl等也是一样)输出若干条shell命令,然后再用shell去执行这些命令。

            eval $(awk 'BEGIN{print "var1='str1';var2='str2'"}')
            或
            eval $(awk '{printf("var1=%s; var2=%s; var3=%s;",$1,$2,$3)}’ abc.txt)

            之后可以在当前shell中使用var1,var2等变量了。

            echo "var1=$var1 —– var2=$var2"


        五: 模式匹配

            使用正则表达式~符合
                awk 'BEGIN {FS=":"} $1~/root/' /etc/passwd
                     -------------- ----------
                             模式匹配     动作部分
            --------------------------------------------------------
              1.gsub(r,s)  #在输入文件中用s替换r            
              例如:awk 'gsub(/root/,"AAA"){print $0}' /etc/passwd
                  AAA:x:0:0:AAA:/AAA:/bin/bash
                  operator:x:11:0:operator:/AAA:/sbin/nologin

              2.gsub(r,s,t) #在t中用s替换r
              例如:awk 'BEGIN{FS=":";OFS=":"} gsub(/root/,"JACK",$1)' /etc/passwd
                  JACK:x:0:0:root:/root:/bin/bash

              3.index(s,t) #返回s中字符串第一个t的位置
              例如:awk 'BEGIN{print index("abcdefgfasdgsdgsgdf","f")}'              

              4.length() #返回字符串长度
              例如:awk 'BEGIN{print index("hello")}'           

              5.match(s,t) #测试s是否包含匹配t的字符串,返回匹配的位置
              例如:awk 'BEGIN{print match("aaarootbbbbbb",/root/)}'

              6.sub(r,s,t) #将t中第1次出现的r替换为s,r可以为正则表达式.
              例如:awk 'BEGIN{str="aaaaaabbccccccddddee";sub(/bb/,"JACK",str); printf("%s\n",str)}'
              aaaaaaJACKccccccddddee

              7.substr(str,起始位置,结束位置)
              awk 'BEGIN{str="192.168.1.10 Bacast";print substr(str,0,12)}'
              192.168.1.10
              或
              substr(str,起始位置)
              例如:awk 'BEGIN{str="192.168.1.10 Bacast";print substr(str,10)}'                

              8.判断元素是否在数组中
              index in array
              例如:awk 'BEGIN{data[10.15]="12";if("10.15" in data)print "hello"}'

              9.split函数
              split(r,s,t)  #将字符串以t为分隔符,将r字符串拆分成字符串数组,并存放在t中.split函数返回值是数组的大小
              例如:awk 'BEGIN{print split("abc/def/xyz",str,"/")}'
              3

              10.  如果要对Shell命令结果进行处理,必须将结果通过管道传给getline函数,如果结果多的话,需要使用循环
                    awk 'BEGIN{while(  ("ls /usr" | getline d)  >0)   print d}'
           
    5.3)awk高级篇

            #文件去重:
              awk '!a[$0]++' file

            #输出重复的行
              awk 'a[$0]++' file

            分析:
            如果是第一次出现a[$0]++的值为0(假),而!a[$0]++的值就为1(真),之后就执行print $0
            第二次或者两次以上的出现a[$0]++的值就为大于0的整数值(真),
            例如1,2,3...,而!a[$0]++的值就为0(假),之后就不执行print $0操作

            #pattern为!($0 in a),Action为{a[$0];print $0}
              awk '!($0 in a)  {a[$0];print $0}'

            分析:
            1.执行第一行时的a的数组为空,($0 in a)为假,!($0 in a)为真。执行Action,a[$0]就存在了a[row1],打印第一行
            2.执行第二行时的a的数组为a[row1],如果a[row2] 是a[$0]中的元素,!($0 in a)为真为假,不执行Ation。
              如果a[row2]不是a[$0]中的元素,执行Action,a[$0]中增加元素(a[row1],a[row2]),打印第二行。
            3.重复执行类似的第二步骤。达到的去重的效果。

 
awk用法

 

6)、正则表达式篇
              1.[] #方括号匹配字符集合
              例如:[1-9]或[0123456789]

              2.[^] #方括号中的^,表示取反操作
              例如:[^b-d] #表示不匹配b-d范围内容
              例如:[a-zA-Z][a-zA-Z]*

              3.\{\}系列符号
              \{n\}  #匹配前面字符出现n次
              \{n,\} #匹配前面字符至少出现n次
              \{n,m\} #匹配前面字符出现n-m次
              例如:[a-z]\{5\} #精确匹配5个小写字母

              4.()和[]和|
              例如: re(a|e|o)d 等价于re[a|e|o]d
              例如:[a-h]*.[^awk]* #以a-h范围内字母开头且句号后不是以.awk结尾的文件
              \<\>    精确匹配符号
              \{n\}   匹配前面字符出现n次
              \{n,\}  匹配前面字符至少出现n次
              \{n,m\} 匹配前面字符出现n-m次
              ab\{3\}cd 重复"b" 3次
              ab\{3,\}cd 重复"b" 至少3次
              ab\{3,6\}cd 重复"b" 至少3-6次
              re(a|b|c|d)e等价于re[abcd]e

              5. ^ [^]
              ^d与[^d]
              ^d表示查找匹配以d开头的字符串
              [^d] 匹配除了d以外的任意字符
正则表达式

 

8)、括号(),{},$(()),$(),[],[[]],``退出状态:
        0  表示
        1~125  表示运行失败,脚本命令,系统命令错误或参数传递错误
        126    找到了命令但无法执行
        127    未找到要运行的命令
        >128   命令被系统强行结束

        $#    传递到脚本的参数个数
        $*    以一个单字符串显示所有向脚本传递的参数
        $$    脚本运行的当前进程ID号
        $!    后台运行的最后一个进程的ID号
        $@    与$*相同,但是使用时加引号,并在引号中返回每个参数。
        $-    显示Shell使用的当前选项,与set命令功能相同。
        $?    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
        "$*"  #当$*被引号引起来的时候,位置参数被当做一个整体.
        "$@"  #引起来也不会当做一个整体
        $(seq 1 2 100)  #其中1表示起始数,2表示跳跃步数,100表示结束值
        $(( $i+$j)) 在括号中可以直接计算$(( ))
        
        ``等价于$()
        $(($aa+$bb))等于 expr $aa + $bb    $(( )) 在此括号内可以直接执行计算

        【 -e file -a -x file 】             判断file文件存在,有执行权限

        [[ -e file && -x file ]]           判断file文件存在,有执行权限

        ()分组执行  (du -sh /etc;du -sh /home;du -sh /root;) #()为开启子shell执行

        {}分组执行  { du -sh /etc;du -sh /home;du -sh /root;} #{}为当前shell执行,左边大括号{后有一个空格,右大括号前有一个分号

        $()是执行里面的代码得到的结果,相当于命令执行符号"` `"

        ${ }是参数,{}是为了避免后面的影响到了,主要强调于边界

        比如参数${a}a这样连着使用。如果不用{},系统就会识别成$aa了
符号(()),(),[],[[]],$()

 

11)、数组:

          #--关联数组1
              aa=(a b c d e f g)
              echo "ArrayLength:"${#aa[@]} #打印数组aa的长度
              echo "ArrayContent:"${aa[@]} #打印数组aa的内容
              echo "ArrayIndex:"${!aa[@]}

          #--关联数组2
              #!/bin/bash
              #定义关联数组
              declare -A pkgname=(
              [gcc-9.3.0.tar.gz]="http://www.gcc.9.3.0.tar.gz"
              [make-9.3.0.tar.gz]="http://www.make.9.3.0.tar.gz"
              [go-9.3.0.tar.gz]="http://www.g0.9.3.0.tar.gz"
              )
              for key in ${!pkgname[*]}
              do
                  echo $key "=>" ${pkgname[$key]}
              done

          #--关联数组3

              #!/bin/bash
              red="-e \033[31m"
              green="-e \033[32m"
              yellow="-e \033[33m"
              blue="-e \033[34m" 
              reset="\033[0m"

              #当前路径和上一层路径
              CDIR="$(cd "$(dirname "$0")";pwd -P)"
              NDIR="$CDIR/.."

              declare -A downloadlist
              downloadlist=(
                      [gcc-9.3.0.tar.gz]="https://ftp.gnu.org/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz"
                      [gmp-6.1.0.tar.bz2]="https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2"
                      [mpfr-3.1.4.tar.bz2]="http://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2"
                      [mpc-1.0.3.tar.gz]="http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz"
                      [isl-0.18.tar.bz2]="http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2"
              )

              #所有包的总数
              total_pkg=${#downloadlist[*]}
              test -d $CDIR/src || mkdir -p $CDIR/src
              for key in ${!downloadlist[*]}
              do
                 if [ ! -e $key ];then
                    if (wget -P ./ ${downloadlist[$key]} --no-check-certificate && echo  ${green}${downloadlist[$key]}  download successful! ${reset}) then
                        let total_pkg--
                    else
                        echo  ${yellow} ${downloadlist[$key]}  ${key} download faild ${reset}
                    fi
                 else
                    echo  ${green} ${downloadlist[$key]} is exist! ${reset}
                    if [ "${key:0-6}" == "tar.gz" -o "${key:0-7}" == "tar.bz2" ];then
                        if [[ ${key:0:2} == go ]];then
                            mkdir -p $CDIR/src/$(echo ${key:0:12} | cut -d . -f 1-3)
                            tar -xf ${key} -C $CDIR/src/$(echo ${key:0:12} | cut -d . -f 1-3)
                        else
                          tar -xf ${key} -C $CDIR/src
                        fi
                    else
                        unzip ${key} -d $CDIR/src
                    fi
                    let total_pkg--
                 fi
              done
数组

 

      
12)、直接变量和间接变量
            
            1. 间接变量引用的两种方法
              (1) eval tempvar=\$$variable1
              (2) tempvar=${!variable1}
              
                #!/bin/bash
                s01_name="Liu"
                s01_dept=Computer
                s01_liu=11111111111111

                s02_name="Ling"
                s02_dept=classling
                s02_liu=22222222222222

                s03_name="Li Hao"
                s03_dept=books
                s03_liu=33333333333333

                PS3='psl.select the number of student:'
                select stunum in "s01" "s02" "s03"
                do
                   name=${stunum}_name
                   dept=${stunum}_dept
                   ID=${stunum}_liu

                   echo "Basic Information of NO.$stunum student:"
                   echo "NAME:${!name}"
                   echo "DEPT:${!dept}"
                   echo "ID:${!ID}"
                break
                done
eval间接引用

 

13)、其他

            1、怎么挂载windows的共享目录?
                mount.cifs //windowsIP(or linuxIP)/共享名  linux挂载目录  --verbose -o user=username,password=****
                #用户是windows下的用户--verbose这个参数可以不加,它是显示过程的

                例如mount.cifs //10.1.1.246/gongxiang /mnt --verbose -o user=username,password=****

                或者是mount -t cifs
                 umount /mnt  或
                 umount.cifs /mnt -l  <--取消挂载 

            2、vim ~/.vimrc  编辑vim默认打开的选项

            3、chvt 2 切换到终端2

            4、细粒度权限设置
                4.1).大范围的权限使用chmod与chown来设置
                4.2).细化权限使用acl进行控制
                setfacl -m u:用户名:权限 filename #设置权限
                例如:
                  setfacl -m u:liu:rw /file

                setfacl -x u:用户名 filename #取消权限
                例如:
                   setfacl -x u:liu /file

            5、export
                1.使用export输出的变量为环境变量,一般环境变量大写表示
                export AA="/user/local"

                2.使用env命令列出系统中所有的环境变量
                3.使用unset命令可以清除系统变量
                4.echo $PWD和echo $OLDPWD

            6、linux修改密码方法:
             echo 用户名:密码 | chpasswd
             
            redhat6/7/8关闭防火墙需要关闭此服务
            chkconfig libvirtd off
             

             &>/dev/null 等价于 >/dev/null 2>&1

                 ############################
                 gzexe teacher.sh #加密脚本
                 ############################

                 读文件的方法:
                 第一步: 将文件的内容通过管道(|)或重定向(<)的方式传给while
                 第二步: while中调用read将文件内容"一行一行"的读出来,并付值给read后跟随的变量。变量中就保存了当前行中的内容。

                 例如读取文件/sites/linuxpig.com.txt
                 1)管道的方式:(read是一行一行的读取)
                  cat /sites/linuxpig.com.txt | while read LINE  #其中LINE为变量名
                  do
                      echo $LINE
                  done
其他

 

posted @ 2023-04-05 14:27  vmsysjack  阅读(14)  评论(0编辑  收藏  举报