zoukankan      html  css  js  c++  java
  • sheel命令学习和工作总结。

    工作两年后,发现sheel脚本用的挺多,一直感觉自己用的还可以,后来才发现很多地方自己不够清楚,特写下这篇博客对用到的地方进行总结。

    一、sheel加载的四种方式。

    1、工作目录执行。

    工作目录执行,指的是执行脚本时,先进入到脚本所在的目录(此时,称为工作目录),然后使用 ./脚本方式执行
    
    [tan@tan scripts]$ ./test.sh
    -bash: ./test.sh: Permission denied
    [tan@tan scripts]$ chmod 764 test.sh
    [tan@tan scripts]$ ./test.sh
    Hello Shell
    如图,报了权限错误,上一篇博文有提到,这里需要赋权,使用chmod 764 test.sh 赋权后就可以正常执行了
    ./的意思是说在当前的工作目录下执行hello.sh。如果不加上./,bash可能会响应找到不到hello.sh的错误信息。
    因为目前的工作目录 (/data/shell)可能不在执行程序默认的搜索路径之列,也就是说,不在环境变量PASH的内容之中。
    查看PATH的内容可用 echo $PASH 命令。现在的/data/shell就不在环境变量PASH中的,所以必须加上./才可执行。

    2、绝对目录执行。

    绝对目录和工作目录执行没有本质的差别,都需要有可执行权限。

    3、sh执行。

    指的是用脚步对应的sh或bash来解析脚步执行。

    [tan@tan scripts]$ sh test.sh 
    Hello Shell
    [tan@tan scripts]$ bash test.sh 
    Hello Shell
    注意,若是以方法三的方式来执行,那么,可以不必事先设定shell的执行权限,甚至都不用写shell文件中的第一行(指定bash路径)。
    因为方法三 是将hello.sh作为参数传给sh(bash)命令来执行的。这时不是hello.sh自己来执行,而是被人家调用执行,所以不要执
    行权限。那么不用 指定bash路径自然也好理解了啊,呵呵……。

    4、source和.执行。

    指的是在当前的shell环境中执行,也需要有执行权限,但是相比前面三个不会创建一个子进程来执行。

    [tan@tan scripts]$ . test.sh 
    Hello Shell
    [tan@tan scripts]$ source test.sh 
    Hello Shell 

    变量的传递总结如下链接https://zhuanlan.zhihu.com/p/60761450

    二、dirname和basename的使用

      cur_dir=$(cd $(dirname $0);pwd) #获取当前路径
    
      BASE_PARENT_DIR=$(dirname $cur_dir)#获取目录的上一级目录
       basename /usr/bin/sort
                Output "sort".
       basename include/stdio.h .h
                Output "stdio".

    三、echo 

    echo <和echo <<的作用

    echo >  是输出重定向 
    echo >> 输出追加重定向
    > /dev/null 2>&1 1和2都输出到黑洞

    echo 的显示

    -n do not output the trailing newline
    -e enable interpretation of backslash escapes
    -E disable interpretation of backslash escapes (default)

    https://blog.csdn.net/xnn_1993/article/details/87090754

    四、sed

      sed表示Stream Editor,流式编辑器又名行编辑器,每次编辑一行,它可以执行各种功能,如搜索、查找、修改、插入或删除文件,此外,他也可以

    执行复制的正则表达式匹配。它可以用于以下目的:

    • 查找和替换匹配给定的格式的内容
    • 在指定行查找和替换匹配给定格式的内容
    • 在所有行查找和替换匹配给定格式的内容
    • 搜索并同时替换两种不同的模式

      使用的格式如下:sed [操作选项] ‘命令’ 文件名,

      常用的操作选项如下

    -n:指定处理后只显示该行
    -e:进行多项编辑任务
    -i:直接修改读取的文件内容,而不是由屏幕输出。
    -f 该选项会将其后文件中的脚步命令添加到已有的命令中。

      常用的命令选项如下:

    p:打印匹配行
    a:新增
    c:替代一行
    d:删除定位行
    s:替代一行中的某些部分
    g:全局替换标志
    n:1-512之间的数字,表示出现第几次替换。

    正则表达式:

     1、符号".":
    匹配任意一个字符,除了换行符,但是需要注意的是,在sed中不能匹配换行符,但是在awk中可以匹配换行符。类似shell通配符中的"?",匹配一个任意字符。
    
    2、符号"*""*"表示前边字符有0个或多个。".*"表示任意一个字符有0个或多个,也就是能匹配任意的字符。类似shell通配符中的"*",可以匹配任意字符。
    
    3、 符号"[]""[ ]"中括号中可以包含表示字符集的表达式。使用方法大概有如下几种。
    [a-z]:表示a-z字符中的一个,也就是小写字母。
    [0-9]:表示0-9字符中的一个,也就是表示数字。
    [A-Z]:表示大写字母。
    [a-zA-Z]:表示字符集为小写字母或者大写字母。
    [a-zA-Z0-9]:表示普通字符,包括大小写字母和数字。
    [abc]:表示字符a或者字符b或者字符c。
    [^0-9]:表示非数字类型的字符,^表示取反意思,只能放在中括号的开始处才有意义。
    [-cz]:表示字符-或者字符c或者字符z,注意与[c-z]的区别,因为-符号没有放在e和f之间。
    
    4. 符号"^"^"表示行首的意思,也就是每一行的开始位置。在这里并不是上边字符范围中取反的意思,^符号只有在"[]"符号的开头处才能表示字符取反。
    ^abc:表示以abc开头的字符串abc。
    ^abc.*:表示以abc开头的字符串abcxxx。
    
    5. 符号"$"
    "$"表示行尾的意思,也就是每一行的结尾位置,很好理解,和"^"正好相反。
    world$:表示以world结尾的字符串world,如果该行中间有world字符串是不符合匹配条件的。
    ^$:表示空行。行首和行尾没有内容,可不就是空行嘛。
    
    6. 符号"":
    ""表示是转义字符,和其它语言中用到的转义字符意义基本上是一样的。其实简单理解,就是把元字符转义为普通字符,比如"\"表示普通符号"",把普通字符转换为特殊意义符号,比如"
    "表示把普通字符n转义为换行符。
    
    7. 符号"{}""{}"表示前边字符的数量范围,大概有三种用法,其实容易理解,看例子就知道了,但是必须注意要加上转义字符"",否则不生效,表示为普通字符"{""}"
    {2}:表示前边字符的重复次数是2。
    {2,}:表示前边字符的重复次数至少是2,也就是大于等于2。
    {2,9}:表示前边字符的重复次数大于2但小于9。
    
    8. 符号"<"">""<"表示匹配条件为词首的位置,理解上可以对比 "^" 行首。
    举个例子,"nihao 1hello 2hello3 hello4"有这么内容的一行内容。
    "<hello"匹配结果"nihao 1hello 2hello3 hello4""hello>"匹配结果"nihao 1hello 2hello3 hello4",这种匹配方式用的不是太多,用到会用就OK 

    使用例子:

    1、显示
        sed -n '2p' tmp.txt    只显示第二行
        sed -n '1,3p' tmp.txt  打印第一行到第三行
        sed -n '/mov/p' tmp.txt 打印含mov的行
    sed -n "/kevin/,/frank/"p tmp.txt  打印匹配kevin开始,frank为结束的行
    
    
    2、删除
        sed '2d' tmp.txt   删除第二行
        sed '3,$d' tmp.txt 删除第三行到最后一行,$表示最后一行
    3、查询
        sed -n '/hello/p' tmp.txt查询包含关键字hello的所有行
    4、代替
        sed '1c Hi' tmp.txt 第一行替代为Hi
    sed '/tom/c Hi' tmp.txt 仅仅替换有tom的行
    sed -n '/hello/p' tmp.txt | sed 's/hello/bid/g'把hello替换bird
    sed 's/to/tt/2' tmp.txt 只替换第2个to
    sed 's/^/// comment /' tmp.txt开头加点注释
    sed 's/$/// comment /' tmp.txt末尾加点注释
    sed -i /^servial/c"hello" tmp.txt 以serial开头的行替换为hello
    5、插入
        sed -i '$a bye' tmp.txt 在最后一行插入bye
       sed -i 3d tmp.txt 可以看到命令不一定非要用‘’

      

    五、awk

      awk是一个强大的文本分析工具,它把文件逐行的读入,以空格为默认分割符将每行分割为多个字段。

      使用方式:awk  [OPTIONS]  ‘pattern {action}’ filenames,其中pattern是要查找的内容(可以没有,也叫匹配的规则),action找到匹配内容时所执行的命令

    last -n 5 | awk '{print $1}' 列出最近五个登录用户
    cat /etc/passwd | awk -F ':' '{print $1}'
    awk -F ':' '$1=="root" {print $0}' /etc/paswd -F指定分隔符,$0表示整行,$1表示第一列,条件后有空格
    awk -F 'a|b' '{}'或者awk -F '[a|b]' '{}'以a或者b作为分割符,和awk -F "[ab]" '{}'作用一样
    awk -F "[a][b]" '{}'这种形式的分隔符是合并的关系,即以ab作为一个字符分割

          awk中两个特别的表达式,BEGIN和END,都可以用于pattern中,在程序赋予初始状态和程序结束之后的一些扫尾工作

           

    awk -F, ‘BEGIN{sum=0}{sum==$3}END{print sum/1024/1024" GB"}'
  • 相关阅读:
    统计学习方法学习笔记第二章(感知机)
    filebeat句柄占用问题
    小组年终总结的汇总
    使用docker制作zookeeper镜像
    普罗米修斯在k8s上面的部署
    k8s亲和性和反亲和性的理解
    AlertManager 的在k8s集群上面的安装部署使用
    filebeat生产上面镜像制作的流程
    普罗米修斯生产上面的性能优化点
    AlertManger集群的搭建
  • 原文地址:https://www.cnblogs.com/kwdeblog/p/13322218.html
Copyright © 2011-2022 走看看