Shell中Bash的基本功能(二)
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
…省略部分输出…
我们使用 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 ~]#
执行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 多命令顺序执行
[ 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