Shell中Bash的基本功能(二)

baixiaoshi 2019-12-11

1 历史命令

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

[ ~]# 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

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

Shell中Bash的基本功能(二)

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

[ ~]# history -w
[ ~]# 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

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

[ ~]# history -c
[ ~]# history
    1  history

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

[ ~]# !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 命令别名
命令格式:
[ ~]# alias
#查询命令别名
[ ~]# alias 别名=‘原命令‘
#设定命令别名
例如:

[ ~]# 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‘

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

[ ~]# vi /root/.bashrc
[ ~]# source /root/.bashrc
[ ~]# vi /root/.bashrc
[ ~]# 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 ~]#

Shell中Bash的基本功能(二)

 执行VI会发亮

测试:

[ ~]# systemctl stop docker
[ ~]# docker info
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[root@192 ~]# ssd
[ ~]# 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)、输出重定向

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

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

[ 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 多命令顺序执行

Shell中Bash的基本功能(二)

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

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

相关推荐