美文网首页Shell
Shell脚本学习

Shell脚本学习

作者: rmrfany | 来源:发表于2018-12-26 11:10 被阅读10次

    1. 设置字体颜色

    echo -e   特殊字符穿特殊处理
    echo -n   最后不自动换行
    \033 可以用 \e 代替

    #!/bin/bash 
    # 
    #下面是字体输出颜色及终端格式控制 
    #字体色范围:30-37 
    echo -e "\033[30m 黑色字 \033[0m"
    echo -e "\033[31m 红色字 \033[0m"
    echo -e "\033[32m 绿色字 \033[0m"
    echo -e "\033[33m 黄色字 \033[0m"
    echo -e "\033[34m 蓝色字 \033[0m"
    echo -e "\033[35m 紫色字 \033[0m"
    echo -e "\033[36m 天蓝字 \033[0m"
    echo -e "\033[37m 白色字 \033[0m"
    #字背景颜色范围:40-47 
    echo -e "\033[40;37m 黑底白字 \033[0m"
    echo -e "\033[41;30m 红底黑字 \033[0m"
    echo -e "\033[42;34m 绿底蓝字 \033[0m"
    echo -e "\033[43;34m 黄底蓝字 \033[0m"
    echo -e "\033[44;30m 蓝底黑字 \033[0m"
    echo -e "\033[45;30m 紫底黑字 \033[0m"
    echo -e "\033[46;30m 天蓝底黑字 \033[0m"
    echo -e "\033[47;34m 白底蓝字 \033[0m"
    #控制选项说明 
    #\033[0m 关闭所有属性 
    #\033[1m 设置高亮度 
    #\033[4m 下划线 
    echo -e "\033[4;31m 下划线红字 \033[0m"
    #闪烁 
    echo -e "\033[5;34m 红字在闪烁 \033[0m"
    #反影 
    echo -e "\033[8m 消隐 \033[0m "
    #\033[30m-\033[37m 设置前景色 
    #\033[40m-\033[47m 设置背景色 
    #\033[nA光标上移n行 
    #\033[nB光标下移n行 
    echo -e "\033[4A 光标上移4行 \033[0m"
    #\033[nC光标右移n行 
    #\033[nD光标左移n行 
    #\033[y;xH设置光标位置 
    #\033[2J清屏 
    #\033[K清除从光标到行尾的内容 
    echo -e "\033[K 清除光标到行尾的内容 \033[0m"
    #\033[s 保存光标位置 
    #\033[u 恢复光标位置 
    #\033[?25| 隐藏光标 
    #\033[?25h 显示光标 
    echo -e "\033[?25l 隐藏光标 \033[0m"
    echo -e "\033[?25h 显示光标 \033[0m"
    echo -n "不自动换行"
    

    2.shell脚本中预定义变量

    $# :命令行中位置参数的个数 
    $* :所有位置参数的内容 
    $? :上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0表示执行异常或出错 
    $$ :当前所在进程的进程号 
    $! :后台运行的最后一个进程号 
    $0 :当前执行的进程/程序名 
    $1 : 位置参数第一个,以此类推
    

    3.输入输出

    read -p   打印提示(text),等待输入,并将输入存储在REPLY中
    read -t   指定读取等待时间
    stty -echo  禁止将输出发送到终端
    stty echo  允许输出发送到终端

    4.数组

    定义数组格式:array[key]=value

        array_pt=( 1 2 3 4 5 6 )
        echo ${array_pt[0]}
        echo ${array_pt[*]} 或者 echo ${array_pt[@]}  打印所有值
        echo ${#array_pt[*]}                打印数组长度
        unset   array_pt[0]             删除第一个
        unset   array_pt                    删除整个数组
    
        关联数组
        declare  -A  array              关联数组索引值可以使用任意文本
        echo ${!array[*]}               打印索引值
        
        字串提取
        echo ${arr[*]:2}                    从第二个开始打印
        echo ${arr[*]:1:2}              打印第一个到第二个和:0:2一样
        
        字串删除
        array=( [0]=one [1]=two [2]=three [3]=four ) 
        echo ${arr[*]#t*e}              左边开始最短匹配
        one two e four              
        echo ${arr[*]##t*e}             左边开始最长匹配
        one two four            
        echo ${arr[*]%o}                右边开始最短匹配
        one tw three four
        echo ${arr[*]%%o}               右边开始最长匹配
        one tw three four
        
        字串替换
        echo ${arr[*]/o/m}              m替换o
        mne twm three fmur
        echo ${arr[*]/o/}               删除o
        ne tw three fur
        echo ${arr[*]/#o/k}             第一个字母为o的替换为k
        kne two three four
        echo ${arr[*]/%o/k}             末尾字幕为o的替换为k
        one twk three four
    

    5.函数

    a)格式

        function name() {
                command sequence(命令序列);
        }
        或
        name() {
                Command sequence(命令序列);
        }
    

    b) fork炸弹

        :(){:|:&};:
    

    6.Find 查找

    全局查找
    find / -name *.cpp

        find 路径 参数
        find . -iregex ".*\(\.txt\|\.pdf\)$"     -i 忽略大小写 找出后缀.txt .pdf 的文件
        find . -type f -name “*.txt”                找出名字为*.txt 的文件
        find . -type f 时间戳          find . -type f -atime -7   访问小于七天的文件 
                访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。 
                修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。 
                变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修                       改时间。
        find . -type f -size 文件大小单元 
        find . -type f -name "*.txt" -delete    删除
        find . -type f -perm 777            权限为777的文件
        find . -type f -user tom            用户名为tom所拥有的文件
        find . -type f -user root -exec chown tom {} \;     查找并修改权限
        find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;
        find . -path "./sk" -prune -o -name "*.txt" -print  搜索并跳过指定文件
    

    7.xargs 参数传递过滤器

        echo "nameXnameXnameXname" | xargs -dX -n2  -dX //定界符 -n2 两个一行
        cat arg.txt | xargs -I {} echo $* adfadf {} dfadsfd -I 替换字符串
        adfadf aaa dfadsfd
        adfadf bbb dfadsfd
        adfadf ccc dfadsfd
    
        rm 删除太多的文件时,可能得到一个错误信息:/bin/rm Argument list too long.  用   xargs去避免这个问题:
        find . -type f -name “*.log” -print0 | xargs -0 rm -f
        
        统计一个源代码目录中所有php文件的行数:
        find . -type f -name "*.php" -print0 | xargs -0 wc -l 
    
        查找所有的jpg 文件,并且压缩它们: 
        find . -type f -name “*jpg” | xargs tar -czvf images.tar.gz 
    
        一个文件包含了很多你希望下载的URL,你能够使用xargs下载所有链接:
        cat url_list.txt | xargs wget -c
    

    8.tr 替换

        大小写转换
        echo "HELLO WORLD" | tr 'A-Z' 'a-z'             hello world
        
        删除字符串
        echo "hello 123 world 456" | tr -d '0-9'
        hello  world
        
        将制表符转换为空格: 
        cat text | tr '\t' ' '
        
        字符集补集,从输入文本中将不在补集中的所有字符删除: 
        echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n'
        1  2  3  4
        
        用tr压缩字符,可以压缩输入中重复的字符: 
        echo "thissss is      a text linnnnnnne." | tr -s ' sn'
        this is a text line.
            
        使用tr做数字相加操作: 
        echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 0 ]
        
        tr可以使用的字符类: 
        [:alnum:]:字母和数字
        [:alpha:]:字母
        [:cntrl:]:控制(非打印)字符
        [:digit:]:数字
        [:graph:]:图形字符
        [:lower:]:小写字母
        [:print:]:可打印字符
        [:punct:]:标点符号
        [:space:]:空白字符
        [:upper:]:大写字母
        [:xdigit:]:十六进制字符
    

    9. Sort 分类

        $ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt
        baidu 100 5000
        google 110 5000
        sohu 100 4500
        guge 50 3000
        -n          按字母顺序排序
        -t              空格
        -k              分栏
        -r              与-n相反
        1.2,1.2     第一个域的第二个值到第一个域的第二个值
        3,3         第三个域(如果没有后面的3,会对应第3个域和其后的域)
    
        删除重复行: 
        uniq file.txt
        sort file.txt | uniq
        sort -u file.txt    
    
        只显示单一行: 
        uniq -u file.txt
        sort file.txt | uniq -u
        
        统计各行在文件中出现的次数: 
        sort file.txt | uniq -c
        
        在文件中找出重复的行: 
        sort file.txt | uniq -d
    

    10. % 与%%与#与##

        示例2,定义变量 url="man.linuxde.net" 
        echo ${url%.*}      #移除 .* 所匹配的最右边的内容。
        man.linuxde
        echo ${url%%.*}     #将从右边开始一直匹配到最左边的 *. 移除,贪婪操作符。
        man
        echo ${url#*.}      #移除 *. 所有匹配的最左边的内容。
        linuxde.net
        echo ${url##*.}     #将从左边开始一直匹配到最右边的 *. 移除,贪婪操作符。
        net
    

    11.Gerp

        选项 -e 制动多个匹配样式: 
        echo this is a text line | grep -e "is" -e "line" -o
        is
        line
    
        也可以使用-f选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
        cat patfile
        aaa
        bbb
        echo aaa bbb ccc ddd eee | grep -f patfile -o
        
        在多级目录中对文本进行递归搜索: 
        grep "text" . -r -n
         .表示当前目录。
    
        #显示匹配某个结果之后的3行,使用 -A 选项:
        seq 10 | grep "5" -A 3
        #显示匹配某个结果之前的3行,使用 -B 选项:
        seq 10 | grep "5" -B 3
        #显示匹配某个结果的前三行和后三行,使用 -C 选项:
        seq 10 | grep "5" -C 3
        #不会输出任何信息,如果命令运行成功返回0,失败则返回非0值
        grep -q "test" filename
    

    12.Cut

    [root@localhost text]# cut -f2 -d";" test2.txt 
    Name
    tom
    jack
    
    //-f2                   第二栏
    //-d";"                 分界符
    cut -c1-3 test.txt              一到三之间的
    cut -c-5 test.txt               第五个之前的
    

    13.Sed 文本处理流编辑器

        可以使用任意的分界符
        
        直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books: 
        sed -i 's/book/books/g' file
        -n选项和p命令一起使用表示只打印那些发生替换的行: 
        sed -n 's/test/TEST/p' file 
        
        sed 's/sk/SK/4g' file               全局从匹配到的第四个开始 SK替换sk
        sed 's/\/bin/\/usr\/local\/bin/g'   /需要转义字符
    
        删除空白行: 
        sed '/^$/d' file
        删除文件的第2行: 
        sed '2d' file
        删除文件的第2行到末尾所有行: 
        sed '2,$d' file
        删除文件最后一行: 
        sed '$d' file
        删除文件中所有开头是test的行: 
        sed '/^test/'d file
    
        已匹配字符串标记&
        正则表达式\w\+匹配每一个单词,使用 [&] 替换它,&对应于之前所匹配到的单词: 
        echo this is a test line | sed 's/\w\+/[&]/g'
        [this] [is] [a] [test] [line]
    
        所有以192.168.0.1开头的行都会被替换成它自已加localhost: 
        sed 's/^192.168.0.1/&localhost/' file
        192.168.0.1localhost
        
        字符串匹配
        echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
        BBB aaa
        love被标记为1,所有loveable会被替换成lovers,并打印出来: 
        sed -n 's/\(love\)able/\1rs/p' file
    
        对于模板test和west之间的行,每行的末尾用字符串aaa bbb替换: 
        sed '/test/,/west/s/$/aaa bbb/' file
    
        -e选项允许在同一行里执行多条命令: 
        sed -e '1,5d' -e 's/test/check/' file
    

    14.Tar

    压 缩:tar -jcvf filename.tar.bz2 要被压缩的文件或目录路径
    查 询:tar -jtvf filename.tar.bz2
    解压缩:tar -jxvf filename.tar.bz2 -C 想要解压到的路径
    
    

    相关文章

      网友评论

        本文标题:Shell脚本学习

        本文链接:https://www.haomeiwen.com/subject/nptflqtx.html