十、 shell基础

原文链接: http://www.cnblogs.com/outsrkem/p/11170720.html
shell的表现形式:
        history 
            -c              清空历史命令(清空缓存;默认:1000条)
            -w              将缓存中的历史命令保存到配置文件中
        ~/.bash_history     永久保存历史命令(默认:1000条)
        ! 数值                调用指定条数的历史命令
        ↑↓ 光标键          调用原来执行过的历史命令
        !关键词                调用最近一次以此关键词开头的历史命令
        !!                  执行上一次命令

输入输出重定向

    标准输入(键盘):   /dev/stdin      [设备标识号:0]   通过键盘向服务器发送指令
    标准正确输出: /dev/stdout     [设备标识号:1]   ls命令输出的结果
    标准错误输出: /dev/stderr [设备标识号:2] lss命令输出的结果
        模拟标准输入:echo "123456" | passwd --stdin username  非交互式修改密码
1. 输入重定向
① "<"
        wc < 统计行数   (常规写法:wc abc)
        cpio -idvcu < *.cpio
        patch -pn < *patch
② " << "
            # wc     << abc
            > asjdg 7y8 hbm,.dd k,2 '
            > alskjd 'd 2 dasld '
            > abc
            2 10 44
        wc "<<" abc 统计指定关键词范围内的信息           标准输出(显示器)

连接符号


    选项连接符:
        -a :find /etc -name "init*" -a -type f 
        -o :find /etc -size -4K -o -size +10M       不取从4K到10M大小的文件
    命令连接符:
        -exec :find /etc -name "init*" -a -type f -exec ls -l {} \;
        -ok   :find /tmp -name "init*" -a -type f -ok rm -rf {} \;
        |     :ls -l /etc/ | more   分页显示/etc/目录下的所有文件的长格式信息
            echo "--help" | cat
            echo "--help" |xargs cat
            #将echo --help 当做cat命令的选项执行
            find /etc -name "init*" -a -type f |xargs ls -l
            #将find所查询到的命令结果(任务流方式)使用|xargs传递给后面的命令
        ;   :无逻辑关系连接符
        &&  :有逻辑关系,符号前的命令必须执行成功,才执行符号后的命令
        ||  :有逻辑关系,符号前的命令若执行成功,则不执行符号后的命令
                          符号前的命令若执行不成功,则执行符号后的命令
        [ "$a" == "abc" ] && echo yes || echo no
            当a=abc时,输出yes,否则,输出no
    grep 提取包含关键词的行  (行提取命令)
        grep "关键词"      文本文件或文本流
        正则表达式
            -An     在关键词行向下显示n行
            -Bn     在关键词行向上显示n行
    find 在指定范围(目录)内查询符合条件的文件名&路径
        -name
        -type
        -user -group
        -nouser         查询没有所有者的文件
        -[acm]time  -[acm]min
        -size
        -perm 
        -a -o
    默认精确查询 -name abc.txt
        模糊查询:通配符
            -name "*abc.txt"        用到通配符的需要用双引号引用
    echo  [选项]  [输出内容]
            -e          支持反斜线控制的字符转换
            -n          取消输出后行尾的换行符号


Bash特殊符号

序号 标识格 说明
1 '' 其内的只是一个普通字符,原来的特殊含义失效
2 "" 其内的几乎是所有字符为一个普通字符,原来的特殊含义失效
3 `` 调用指定命令的结果
4 $() 调用指定命令的结果
5 () 其内执行的命令都在新开的子shell中执行
6 [] 条件判断公式
7 {} 其内执行的所有命令,与当前shell中无异,但格式更严谨
8 # 注释
9 $ 在bash shell中调用变量
10 \ 针对命令的转意符

Bash特殊颜色

文字颜色 30黑 31红 32绿 33黄 34蓝 35紫 36青 37白
底纹颜色 40黑 41红 42绿 43黄 44蓝 45紫 46青 47白
特殊显示 0关闭 1高亮 4下划线 5闪烁 7反显 8消影
颜色设置:如 \e[1;41;33m  \e[0m

    
    
        
    ⑴ ''    :所有被单引号所引用的字符,都只是一个普通字符,原来的特殊含义失效
        echo '$PATH'    $在单引号中没有调用变量的功能了
    ⑵ ""    :几乎是所有被双引号引用的字符,都只是一个普通字符,原来的特殊含义失效,除($ \ ``)
        echo "$PATH"    $在双引号中被调用时,是有效的
    ⑶ `` 和 $()  :调用指定命令的结果
        time=$(date)
        abc=`ls *`
    # echo `date`
    2018年 07月 03日 星期二 09:10:28 CST
    # echo "`date`"
    2018年 07月 03日 星期二 09:10:37 CST
    # echo '`date`'
    `date`
    ⑷ ()    :所有在小括号内执行的命令,都是在新开启的子shell中执行的,不会影响当前shell,当小括号内的命令执行完成时,新开启的子shell自动结束消失
    ⑸ {}    :所有在大括号中执行的命令,都是在当前shell中执行的,与不加括号无异。大括号要严格遵循格式:            { name=lisi;echo $name;}
            a、大括号的左括号和第一条命令之间需要留一个空格
            b、大括号内最后一条命令结尾需要使用;结束
                # { name=lisi;echo $name;}
                # (name=zhangsan;echo $name)   在子shell中执行
    ⑹ [] :条件判断公式
        ① [ "$abc" != "10" ]        #在进行 == 和 != 进行判断时,必须遵循以下a、b两个原则
                #   == 和 != 是用来判断字符和字符串,不是用来判断数值的。 
                    a、括号两侧必须留有一个空格
                    b、判断符号两侧必须留有空格
        ② [ -f /etc/bashrc ]
            -f 判断指定对象是否存在,判断该文件是否是普通文件
            [ -f /etc/bashrc ] && source /etc/bashrc
    ⑺ # :在shell中是注释的意思,在文本内不生效,作为备注和注解
拓展:并不是所有的注释都是不生效的,有些注释代表默认就生效(/etc/ssh/sshd_config)
            ;
            //  
            
            /*   */
    ⑻ $ :调用指定变量的值,在bash shell中是这样的,其他shell中不一定
        echo "$PATH"
    ⑼ \ :将所有的特殊字符和字符串转义为普通字符和字符串(针对命令)

变量声明

命令:declare   [+/-] [选项]  变量
-   : 给变量设定类型
+   : 取消变量的类型
-a  : 将变量声明成数组型
-i  : 将变量声明成整数型
-r  : 将变量声明成只读(变量值不能修改,也不能删除,更不能取消只读选项)
-x  : 将变量声明成环境变量
-p  : 显示指定变量的类型及内容

正则表达式

(1) 正则表达式:

* 前一个字符任意多次(*前边必须有一个字符) 基础正则表达式
. 匹配任意一个字符 基础正则表达式
^ 限制行首 基础正则表达式
$ 限制行尾 基础正则表达式
[] 其内任意一个字符,[A-Za-z][0-9][^0-9][abc][a-cdf] 基础正则表达式
\{n\} 前一个字符重复0到n次 基础正则表达式
\{n,\ 前一个字符至少重复n次及以上 基础正则表达式
\{n,m\} 前一个字符重复n次以上m次以下 基础正则表达式
+ 前一个字符一次或多 egrep
? 前一个字符0次或一次 egrep
| 分支符号(或者) egrep
() 其内为一个整体匹配一个字符 egrep
注:当用到egrep时“\{\}”中的反斜杠取消


 (2) 基础正则表达式:
    *   匹配前一个字符任意多次(连续)
        *前一个字符连续出现了多少次(*前边必须有一个字符)
    .   匹配任意一个字符(除去换行符以外)
        若某文本要过滤包含. 的行,则需要使用转义符将.的特殊含义取消
        grep "\." /sh/passwd
    ^   匹配行首
    $   匹配行尾
        grep "\.$" /sh/passwd       #过滤以.结尾的行
        grep -v "^$"  /sh/passwd    #取消文本的空白行
    []  匹配括号内的任意一个字符
        [0-9] [a-zA-Z] [^0-9]       #尽量不要使用[a-Z]
        注:除了连接符 - 以外,不可以使用其他符号
    \{n\}   # 过滤必须出现指定次数的行
    \{n,\}
            # grep "a\{0,\}" passwd | wc -l
            # grep "a*" passwd | wc -l
    \{,n\}
    \{n,m\}
            # grep "o\{2,3\}" /sh/passwd
 (3) 扩展正则表达式:
        指定匹配的前一个字符出现的次数(类似于*)
        在使用egrep 或 grep -E 时,不需要使用转义符
        +   匹配前一个字符一次或任意多次
        ?   匹配前一个字符0次或1次
        |   分支符号(或者)
(4) 正则表达式过滤手机号码和ip
1. 中国手机号码:
以1开头,11位连续的数字
    grep "1[0-9]\{10\}" sj.txt
每行中只有手机号的:
    grep "^1[0-9]\{10\}$" sj.txt
中国联通:130、131、132、   145、    155、156、    185、186
    拆分:
        13[012][0-9]{8}
        145[0-9]{8}
        1[58][56][0-9]{8}
    组装:1(3[012]|45|[58][56])[0-9]{8}
2.IP范围0-255
拆分(怎么容易写正则匹配怎么拆分):
            0-9             [0-9]
            10-99           [1-9][0-9]
            100-199         1[0-9][0-9]
            200-249         2[0-4][0-9]
            250-255         25[0-5]
组装:egrep "[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]" b
过滤IP
^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

转载于:https://www.cnblogs.com/outsrkem/p/11170720.html

你可能感兴趣的:(十、 shell基础)