• Shell中Bash的基本功能(二)


    1 历史命令

    1)历史命令的查看
    [root@localhost ~]# history [选项] [历史命令保存文件]
    选项:
    -c: 清空历史命令
    -w: 把缓存中的历史命令写入历史命令保存文件。如果不手工指定历史命令保存文
    件,则放入默认历史命令保存文件~/.bash_history 中

    [root@192 ~]# history
        1  systemctl stop firewalld
        2  systemctl disable firewalld
        3   setenforce 0
        4     getenforce
        5   setenforce 0
        6     getenforce
        7  vim /etc/selinux/config
        8  reboot
        9  docker
       10  docker ps -a
       11  systemctl start docker
       12  docker ps -a
       13  docker rm cb26c27396e5
       14  docker run -itd --name mongo  -p 27017:27017 mongo --auth
       15   docker exec -it mongo mongo admin
       16  docker run -itd --name mongo1  -p 27017:27017 mongo
       17  docker run -itd --name mongo1  -p 27018:27017 mongo
       18  docker run -itd --name mongo2  -p 27018:27017 mongo
       19  docker exec -it mongo2 mongo
       20  docker ps -a
       21  docker rm $(docker ps -a -q)
       22  docker rm -f $(docker ps -a -q)
       23  docker run -itd --name mongo  -p 27017:27017 mongo
       24   docker exec -it mongo mongo
       25  history

    [root@localhost ~]# vi /etc/profile
    …省略部分输出…
    HISTSIZE=1000
    …省略部分输出…

    我们使用 history 命令查看的历史命令和~/.bash_history 文件中保存的历史命令是不同的。那
    是因为当前登录操作的命令并没有直接写入~/.bash_history 文件,而是保存在缓存当中的。需要等
    当前用户注销之后,缓存中的命令才会写入~/.bash_history 文件。如果我们需要把内存中的命令直
    接写入~/.bash_history 文件,而不等用户注销时再写入,就需要使用“-w”选项了。命令如下:
    [root@localhost ~]# history -w
    #把缓存中的历史命令直接写入~/.bash_history
    这时再去查询~/.bash_history 文件,历史命令就和 history 命令查询的一致了。

    [root@192 ~]# history -w
    [root@192 ~]# cat .bash_history
    systemctl stop firewalld
    systemctl disable firewalld
     setenforce 0
       getenforce
     setenforce 0
       getenforce
    vim /etc/selinux/config
    reboot
    docker
    docker ps -a
    systemctl start docker
    docker ps -a
    docker rm cb26c27396e5
    docker run -itd --name mongo  -p 27017:27017 mongo --auth
     docker exec -it mongo mongo admin
    docker run -itd --name mongo1  -p 27017:27017 mongo
    docker run -itd --name mongo1  -p 27018:27017 mongo
    docker run -itd --name mongo2  -p 27018:27017 mongo
    docker exec -it mongo2 mongo
    docker ps -a
    docker rm $(docker ps -a -q)
    docker rm -f $(docker ps -a -q)
    docker run -itd --name mongo  -p 27017:27017 mongo
     docker exec -it mongo mongo
    history
    vim .bash_history
    history -w

    如果需要清空历史命令,只需要执行:
    [root@localhost ~]# history -c
    #清空历史命令

    [root@192 ~]# history -c
    [root@192 ~]# history
        1  history

    2)、历史命令的调用
    如果想要使用原先的历史命令有这样几种方法:
     使用上、下箭头调用以前的历史命令
     使用“!n”重复执行第 n 条历史命令
     使用“!!”重复执行上一条命令
     使用“!字串”重复执行最后一条以该字串开头的命令
     使用“!$”重复上一条命令的最后一个参数

    [root@192 ~]# !20
    docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED                                                                                       STATUS              PORTS                      NAMES
    3b6d2367d39c        mongo               "docker-entrypoint..."   34 minutes ago                                                                                Up 34 minutes       0.0.0.0:27017->27017/tcp   mongo
    [root@192 ~]# !!
    docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED                                                                                       STATUS              PORTS                      NAMES
    3b6d2367d39c        mongo               "docker-entrypoint..."   34 minutes ago                                                                                Up 34 minutes       0.0.0.0:27017->27017/tcp   mongo

    2、命令与文件的补全
    Tab键


    3 命令别名
    命令格式:
    [root@localhost ~]# alias
    #查询命令别名
    [root@localhost ~]# alias 别名='原命令'
    #设定命令别名
    例如:

    [root@192 ~]# alias
    alias cp='cp -i'
    alias egrep='egrep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias grep='grep --color=auto'
    alias l.='ls -d .* --color=auto'
    alias ll='ls -l --color=auto'
    alias ls='ls --color=auto'
    alias mv='mv -i'
    alias rm='rm -i'
    alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-ti                                                                          lde'

    [root@localhost ~]# alias vi='vim'
    #定义 vim 命令的别名是 vi
    既然我们说别名的优先级比命令高,那么命令执行时具体的顺序是什么呢?命令执行时的顺序是
    这样的:
    1、 第一顺位执行用绝对路径或相对路径执行的命令。
    2、 第二顺位执行别名。
    3、 第三顺位执行 Bash 的内部命令。
    4 第四顺位执行按照$PATH 环境变量定义的目录查找顺序找到的第一个命令。
    为了让这个别名永久生效,可以把别名写入环境变量配置文件“~/.bashrc”。命令如下:
    [root@localhost ~]# vi /root/.bashrc

    [root@192 ~]# vi /root/.bashrc
    [root@192 ~]# source /root/.bashrc
    [root@192 ~]# vi /root/.bashrc
    [root@192 ~]# cat /root/.bashrc
    # .bashrc
    
    # User specific aliases and functions
    
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    alias ssd='systemctl start docker'
    alias vi='vim'
    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi
    [root@192 ~]#

     执行VI会发亮

    测试:

    [root@192 ~]# systemctl stop docker
    [root@192 ~]# docker info
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    [root@192 ~]# ssd
    [root@192 ~]# docker info
    Containers: 1
     Running: 0
     Paused: 0
     Stopped: 1
    Images: 2
    Server Version: 1.13.1
    Storage Driver: overlay2
     Backing Filesystem: xfs
     Supports d_type: true
     Native Overlay Diff: true
    Logging Driver: journald
    Cgroup Driver: systemd

    4 Bash 常用快捷键
    快捷键 作 用
    ctrl+A 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。
    ctrl+E 把光标移动到命令行结尾。
    ctrl+C 强制终止当前的命令。
    ctrl+L 清屏,相当于 clear 命令。
    ctrl+U 删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便
    ctrl+K 删除或剪切光标之后的内容。
    ctrl+Y 粘贴 ctrl+U 或 ctrl+K 剪切的内容。
    ctrl+R 在历史命令中搜索,按下 ctrl+R 之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。
    ctrl+D 退出当前终端。
    ctrl+Z 暂停,并放入后台。
    ctrl+S 暂停屏幕输出。
    ctrl+Q 恢复屏幕输出。

    5 输入输出重定向

     1)、输出重定向

    [root@192 ~]# cd test/
    [root@192 test]# ll
    总用量 0
    [root@192 test]# pwd
    /root/test
    [root@192 test]# ls > abc
    [root@192 test]# cat abc
    abc
    [root@192 test]# ls >> abc
    [root@192 test]# cat abc
    abc
    abc
    [root@192 test]# lsal >> abc
    bash: lsal: 未找到命令...
    [root@192 test]# lsal 2>> abc
    [root@192 test]# cat abc
    abc
    abc
    bash: lsal: 未找到命令...
    [root@192 test]# lsal &>> abc
    [root@192 test]# cat abc
    abc
    abc
    bash: lsal: 未找到命令...
    bash: lsal: 未找到命令...

    2)、输入重定向
    [root@localhost ~]# wc [选项] [文件名]
    选项:
    -c 统计字节数
    -w 统计单词数
    -l 统计行数

    [root@192 test]# wc -l abc
    4 abc
    [root@192 test]# wc abc
     4  8 70 abc
    [root@192 test]# wc -c abc
    70 abc
    [root@192 test]#

    6 多命令顺序执行

    [root@192 test]# ls ; date
    abc
    2019年 12月 11日 星期三 22:28:05 CST
    [root@192 test]# lsl && date
    bash: lsl: 未找到命令...
    [root@192 test]# lsl || date
    bash: lsl: 未找到命令...
    2019年 12月 11日 星期三 22:29:35 CST
    [root@192 test]# ls ; ddd
    abc
    bash: ddd: 未找到命令...
    相似命令是: 'dd'
    [root@192 test]# ls || ddd
    abc
    [root@192 test]# ls && echo yes || echo no
    abc
    yes
    [root@192 test]# lsll && echo yes || echo no
    bash: lsll: 未找到命令...
    no

    7 管道符
    1)、行提取命令 grep
    [root@localhost ~]# grep [选项] "搜索内容" 文件名
    选项:
    -A 数字: 列出符合条件的行,并列出后续的 n 行
    -B 数字: 列出符合条件的行,并列出前面的 n 行
    -c: 统计找到的符合条件的字符串的次数
    -i: 忽略大小写
    -n: 输出行号
    -v: 反向查找
    --color=auto 搜索出的关键字用颜色显示
    举几个例子:
    [root@localhost ~]# grep "/bin/bash" /etc/passwd
    #查找用户信息文件/etc/passwd 中,有多少可以登录的用户
    再举几个例子吧:

    [root@localhost ~]# grep -A 3 "root" /etc/passwd
    #查找包含有“root”的行,并列出后续的 3 行
    [root@localhost ~]# grep -n "/bin/bash" /etc/passwd
    #查找可以登录的用户,并显示行号
    [root@localhost ~]# grep -v "/bin/bash" /etc/passwd
    #查找不含有“/bin/bash”的行,其实就是列出所有的伪用户
    [root@192 test]# grep "root" /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    dockerroot:x:987:981:Docker User:/var/lib/docker:/sbin/nologin
    [root@192 test]# cat /etc/passwd |grep "root"
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    dockerroot:x:987:981:Docker User:/var/lib/docker:/sbin/nologin
    [root@192 test]# grep -A 3 "root" /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
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    --
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    --
    dockerroot:x:987:981:Docker User:/var/lib/docker:/sbin/nologin
    [root@192 test]# grep -v "/bin/bash" /etc/passwd
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    2)find 和 grep 的区别
    find 命令是在系统当中搜索符合条件的文件名,如果需要模糊查询,使用通配符进行匹配,搜索时文件名是完全匹配。
    [root@localhost ~]# touch abc
    #建立文件 abc
    [root@localhost ~]# touch abcd
    #建立文件 abcd
    [root@localhost ~]# find . -name "abc"
    ./abc
    #搜索文件名是 abc 的文件,只会找到 abc 文件,而不会找到文件 abcd
    #虽然 abcd 文件名中包含 abc,但是 find 是完全匹配,只能和要搜索的数据完全一样,才能找到
    注意:find 命令是可以通过-regex 选项识别正则表达式规则的,也就是说 find 命令可以按
    照正则表达式规则匹配,而正则表达式是模糊匹配。但是对于初学者而言,find 命
    令和 grep 命令本身就不好理解,所以我们这里只按照通配符规则来进行 find 查询。
    grep 命令是在文件当中搜索符合条件的字符串,如果需要模糊查询,使用正则表达式进行匹配,
    搜索时字符串是包含匹配。
    [root@localhost ~]# echo abc > test
    #在 test 文件中写入 abc 数据
    [root@localhost ~]# echo abcd >> test
    #在 test 文件中再追加 abcd 数据
    [root@localhost ~]# grep "abc" test
    abc
    abcd
    #grep 命令查找时,只要数据行中包含有 abc,就会都列出
    #所以 abc 和 abcd 都可以查询到
    3)管道符
    [root@localhost ~]# ll -a /etc/ | more
    [root@localhost ~]# netstat -an | grep "ESTABLISHED"
    #查询下本地所有网络连接,提取包含 ESTABLISHED(已建立连接)的行
    #就可以知道我们的服务器上有多少已经成功连接的网络连接
    [root@localhost ~]# netstat -an | grep "ESTABLISHED" | wc -l
    #如果想知道具体的网络连接数量,就可以再使用 wc 命令统计行数
    [root@localhost ~]# rpm -qa | grep httpd

  • 相关阅读:
    检查两个单链表是否有交点
    检查链表中是否有环
    [转]根据二叉树的先序、中序遍历结果重建二叉树
    背包问题
    硬币问题
    部分和问题
    斐波那契计算
    最大公因数和最小共倍数
    计算一年中的第几天
    利用递归反向输出字符串
  • 原文地址:https://www.cnblogs.com/dalianpai/p/12026416.html
Copyright © 2020-2023  润新知