Shell脚本学习

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脚本学习)