1、shell简介
shell快捷键
筛选信息
快捷键符号
命令执行:
!! 执行上一条命令
!【num】 执行历史命令中的第num行命令
Ctrl 【关键字】 执行内容匹配的命令,查找的是执行过的历史命令
示例:
命令行切换:
Ctrl + A 光标迅速回到行首
Ctrl + E 光标迅速回到行尾
Ctrl + k 删除光标到行尾内容,其实等于剪切在内存
Ctrl + u 删除光标到行首内容,其实等于剪切在内存
Ctrl + y 粘贴删除的内容,刚刚删除的内容在命令行还原显示
Ctrl + c 临时终止命令行命令
Esc + b 移动到当前单词的开头,以空格为分隔符
Esc + f 移动到当前单词的结尾,以空格为分隔符
grep命令
负责从数据源中检索对应的字符串,行过滤
grep 【OPTIONS】 【查找内容】 【文件】
OPTIONS选择项:
-i: 不区分大小写
-v: 查找不包含指定内容的行,反向选择
-w: 按单词搜索,精确查找所在行
-o: 打印匹配关键字
-c: 统计匹配到的次数
-n: 显示行号
-r: 逐层遍历目录查找
-A: 显示匹配行及后面多少行
-B: 显示匹配行及前面多少行
-C: 显示匹配行前后多少行
-l:只列出匹配的文件名
-L:列出不匹配的文件名
-e: 使用正则匹配
-E:使用扩展正则匹配
^key:以关键字开头
key$:以关键字结尾
^$:匹配空行
--color=auto :可以将找到的关键词部分加上颜色的显示
grep 高亮显示
centos7中已经设置了,存放在/etc/profile.d/colorgrep.sh文件中,如若使用的系统中没有设置颜色输出,可以使用以下方法来自行设置
临时设置:
# alias grep='grep --color=auto' //只针对当前终端和当前用户生效
永久设置:
1)全局(针对所有用户生效)
vim /etc/bashrc
alias grep='grep --color=auto'
source /etc/bashrc
2)局部(针对具体的某个用户)
vim ~/.bashrc
alias grep='grep --color=auto'
source ~/.bashrc
常用命令选项必知必会 示例:
# grep -i 【root】 passwd 忽略大小写匹配包含root的行
# grep -w 【ftp】 passwd 精确匹配ftp单词
# grep -wo 【ftp】 passwd 打印匹配到的关键字ftp
# grep -n 【root】 passwd 打印匹配到root关键字的行号
# grep -ni 【root】 passwd 忽略大小写匹配统计包含关键字root的行
# grep -nic 【root】 passwd 忽略大小写匹配统计包含关键字root的行数
# grep -i ^root passwd 忽略大小写匹配以root开头的行
# grep bash$ passwd 匹配以bash结尾的行
# grep -n ^$ passwd 匹配空行并打印行号
# grep ^# /etc/vsftpd/vsftpd.conf 匹配以#号开头的行
# grep -v ^# /etc/vsftpd/vsftpd.conf 匹配不以#号开头的行
# grep -A 5 【mail】 passwd 匹配包含mail关键字及其后5行
# grep -B 5 【mail】 passwd 匹配包含mail关键字及其前5行
# grep -C 5 【mail】 passwd 匹配包含mail关键字及其前后5行
sort命令
信息排序
语法:
sort 【options】 【文件】
将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
options:
-u :去除重复行
-r :降序排列,默认是升序
-o : 将排序结果输出到文件中 类似 重定向符号>
-n :以数字排序,默认是按字符排序
-t :分隔符
-k :第N列
-b :忽略前导空格。
-R :随机排序,每次运行的结果均不同。
文件内容
[root@localhost ~]# cat num.txt
9
8
6
8
4
7
2
1
内容升序
[root@localhost ~]# sort -n num.txt
1
2
4
6
7
8
8
9
内容降序
[root@localhost ~]# sort -r num.txt
9
9
8
7
6
4
2
1
其他实践
sort -nu num.txt 升序去重,u表示去重
sort -ru num.txt 降序去重
sort -nru num.txt 先升序后降序再去重
sort -R num.txt 随机排序,R表示随机,等于打乱顺序了
sort -nu num.txt -o /tmp/a.txt 升序去重后输出到一个文件
处理信息
cut命令
数据截取
Mandatory arguments to long options are mandatory for short options too.
-b, --bytes=列表 只选中指定的这些字节
-c, --characters=列表 只选中指定的这些字符
-d, --delimiter=分界符 使用指定分界符代替制表符作为区域分界
-f, --fields=LIST select only these fields; also print any line
that contains no delimiter character, unless
the -s option is specified
-n with -b: don't split multibyte characters
--complement 补全选中的字节、字符或域
-s, --only-delimited 不打印没有包含分界符的行
--output-delimiter=字符串 使用指定的字符串作为输出分界符,默认采用输入
的分界符
--help 显示此帮助信息并退出
--version 显示版本信息并退出
示例:
# cut -d: -f1 1.txt 以:冒号分割,截取第1列内容
# cut -d: -f 1,6,7 1.txt 以:冒号分割,截取第1,6,7列内容
# cut -c 4 1.txt 截取文件中每行第4个字符
# cut -c 1-4 1.txt 截取文件中每行的1-4个字符
# cut -c 5- 1.txt 从第5个字符开始截取后面所有字符
tr命令
字符转换、替换、删除
用法:tr [选项]... SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。
-c, -C, --complement 首先补足SET1
-d, --delete 删除匹配SET1 的内容,并不作替换
-s, --squeeze-repeats 如果匹配于SET1 的字符在输入序列中存在连续的
重复,在替换时会被统一缩为一个字符的长度
-t, --truncate-set1 先将SET1 的长度截为和SET2 相等
--help 显示此帮助信息并退出
--version 显示版本信息并退出
用法1:把commands命令输出做为tr输入进行处理
commands | tr 'string1' 'string2'
用法2:把文件中的内容输入给tr进行处理
tr 'string1' 'string2' < filename
用法3:把文件中的内容输入给tr进行处理,需要使用到选项
tr options 'string1' < filename
示例1:通过tr把反复出现的内容进行压缩,压缩后再处理。
[root@localhost ~]# ifconfig eth0 | grep -w inet
inet 10.0.0.12 netmask 255.255.255.0 broadcast 10.0.0.255
[root@localhost ~]# ifconfig eth0 | grep -w inet | tr -s " "
inet 10.0.0.12 netmask 255.255.255.0 broadcast 10.0.0.255
[root@localhost ~]# ifconfig eth0 | grep -w inet | tr -s " " | cut -d " " -f 3 10.0.0.12
示例2: 文件的演示
[root@localhost ~]# head -n 5 /etc/passwd > test1.txt
[root@localhost ~]# tr '[0-9]' '@' < test1.txt
root:x:@:@:root:/root:/bin/bash
bin:x:@:@:bin:/bin:/sbin/nologin
daemon:x:@:@:daemon:/sbin:/sbin/nologin
adm:x:@:@:adm:/var/adm:/sbin/nologin
lp:x:@:@:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]# tr '[a-z]' '[A-Z]' < test1.txt
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
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
uniq命令
连续信息去重
Mandatory arguments to long options are mandatory for short options too.
-c, --count 统计重复行次数
-d, --repeated 只显示重复行
-i, --ignore-case 忽略大小写
-s, --skip-chars=N avoid comparing the first N characters
-u, --unique only print unique lines
文件内容
[root@localhost ~]# cat uniq.txt
AA
aa
aa
bb
cc
cc
dd
去重演示
[root@localhost ~]# uniq uniq.txt
AA
aa
bb
cc
dd
其他演示
uniq -i uniq.txt 大小写不敏感去重
uniq -ic uniq.txt 大小写不敏感去重后计数
uniq -d uniq.txt 仅显示重复的内容
sort -n num.txt | uniq 结合sort排序后去重
组合信息
paste命令
合并文件行内容输出到屏幕,不会改动源文件
Mandatory arguments to long options are mandatory for short options too.
-d, --delimiters=列表 改用指定列表里的字符替代制表分隔符
-s, --serial 不使用平行的行目输出模式,而是每个文件占用一行
--help 显示此帮助信息并退出
--version 显示版本信息并退出
文件内容
[root@localhost ~]# cat a.txt
hello
[root@localhost ~]# cat b.txt
world
888
999
内容合并
[root@localhost ~]# paste a.txt b.txt
hello world
888
999
[root@localhost ~]# paste b.txt a.txt
world hello
888
999
自定义分隔符后合并内容
[root@localhost ~]# paste -d'@' b.txt a.txt
world@hello
888@
999@
将一个文件所有内容一行输出
[root@localhost ~]# paste -s b.txt
world 888 999
[root@localhost ~]# paste -d'@' -s b.txt
world@888@999
xargs命令
命令结果传递
作用:
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 一般是和管道一起使用。
命令格式:
somecommand |xargs -item command
OPTIONS:
-a file 从文件中读入作为sdtin
-E flag flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
-p 当每次执行一个argument的时候询问一次用户。
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-t 表示先打印命令,然后再执行。
-i 或者是-I,将xargs接收的每项名称,逐行赋值给 {},可以用 {} 代替。
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
注意:linux命令格式一般为
命令 命令选项 参数
上一个命令的输出就是下一个命令的参数 这句话结合命令语法 应该知道输出的内容在下一个命令的位置了吧。
从文件中读取内容,多行读成了1行
[root@localhost ~]# xargs -a num.txt
9 8 6 8 4 7 2 1
从文件中读取内容时,指定内容结束符号
[root@localhost ~]# xargs -a num.txt -E 4
9 8 6 8
从文件中读取内容时,询问用户是否显示,y显示,其他不显示
[root@localhost ~]# xargs -a num.txt -p
echo 9 8 6 8 4 7 2 1 ?...y
9 8 6 8 4 7 2 1
[root@localhost ~]# xargs -a num.txt -p
echo 9 8 6 8 4 7 2 1 ?...n
从文件中读取内容时,指定每行显示几个内容
[root@localhost ~]# xargs -a num.txt -n4
9 8 6 8
4 7 2 1
从文件中读取内容时,指定每行显示几个内容,没显示一行询问一下用户
[root@localhost ~]# xargs -a num.txt -n4 -p
echo 9 8 6 8 ?...y
9 8 6 8
echo 4 7 2 1 ?...y
4 7 2 1
默认xargs以空格为分隔符,可以通过-d来自定义分隔符
[root@localhost ~]# echo "ab cd ef g" | xargs
ab cd ef g
[root@localhost ~]# echo "nameXnameXnameXname" | xargs -dX
name name name name
[root@localhost ~]# echo "nameXnameXnameXname" | xargs
nameXnameXnameXname
-I 临时存储内容给一个对象,然后进行后续处理
[root@localhost ~]# xargs -a num.txt -n1 -I {} echo {}--bak
9--bak
8--bak
6--bak
8--bak
4--bak
7--bak
2--bak
1--bak
-I的综合运用,转移文件并改名
[root@localhost ~]# ls *.txt
a.txt b.txt num.txt test1.txt uniq.txt
[root@localhost ~]# ls *.txt | xargs -n1 -I {} cp {} /tmp/{}-bak
[root@localhost ~]# ls /tmp/*-bak
/tmp/a.txt-bak /tmp/num.txt-bak /tmp/uniq.txt-bak
/tmp/b.txt-bak /tmp/test1.txt-bak
shell分类
查看系统的shell
查看当前系统的shell类型
[root@localhost ~]# echo $SHELL
/bin/bash
查看当前系统环境支持的shell
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
更改默认的shell
chsh <用户名> -s <新shell>
[root@localhost ~]# su - python
[python@localhost ~]$ exit
登出
[root@localhost ~]# chsh python -s /bin/sh
Changing shell for python.
Shell changed.
[root@localhost ~]# su - python
上一次登录:二 6月 7 20:11:13 CST 2022pts/0 上
-sh-4.2$ exit
登出
[root@localhost ~]# chsh python -s /bin/bash
Changing shell for python.
Shell changed.
[root@localhost ~]# su - python
上一次登录:二 6月 7 20:11:35 CST 2022pts/0 上
[python@localhost ~]$ echo $SHELL
/bin/bash
安装shell
安装shell
yum list | grep zsh
yum install -y zsh
查看效果
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/zsh
删除shell
[root@localhost ~]# yum remove zsh -y
shell实践
命令行实践方式
描述:
手工敲击键盘,在shell的命令行输入命令,按Enter后,执行通过键盘输入的命令,然后shell返回并显示命令执行的结果.
重点:
逐行输入命令、逐行进行确认执行
直接找一个终端界面执行一些可执行的命令即可,手动执行一个一个的shell命令
[root@localhost ~]# whoami
root
[root@localhost ~]# pwd
/root
[root@localhost ~]# date +"%F %T"
2022-06-07 20:14:46
文件实现方式
描述:
就是说我们把手工执行的命令a,写到一个脚本文件b中,然后通过执行脚本b,达到执行命令a的效果.
重点:
按照文件内容的顺序执行。
找一个文件,将我们刚才执行成功的命令放到里面。
[root@localhost ~]# cat test
whoami
pwd
date +"%F %T"
[root@localhost ~]# /bin/bash test
root
/root
2022-06-07 20:16:20
脚本实践
当可执行的Linux命令或语句不在命令行状态下执行,而是通过一个文件执行时,我们称文件为shell脚本。
应用场景
重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。
自动化分析处理
自动化备份
自动化批量部署安装
等等...
脚本创建
脚本创建工具:
创建脚本的常见编辑器是 vi/vim.
脚本命名
shell脚本的命名简单来说就是要有意义,方便我们通过脚本名,来知道这个文件是干什么用的。
脚本内容:
各种可以执行的命令
脚本注释
单行注释:
除了首行的#不是注释外,其他所有行内容,只要首个字符是#,那么就表示该行是注释
多行注释:
多行注释有两种方法::<<! ... ! 和 :<<字符 ... 字符
脚本执行
脚本执行方法
方法1:
bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用)
方法2:
/path/to/script-name 或 ./script-name (当前路径下执行脚本)
方法3:
source script-name 或 . script-name (注意“.“点号)
方法1变种:
cat /path/to/script-name | bash
bash /path/to/script-name
执行示例
方法1:
[root@localhost ~]# /bin/bash get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
方法2:
[root@localhost ~]# ./get_netinfo.sh
bash: ./get_netinfo.sh: 权限不够
[root@localhost ~]# ll get_netinfo.sh
# 本身这个文件就没有执行权限,所以不能执行
-rw-r--r-- 1 root root 521 6月 7 20:41 get_netinfo.sh
[root@localhost ~]# chmod +x get_netinfo.sh
[root@localhost ~]# ./get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
方法3:
[root@localhost ~]# source get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
[root@localhost ~]# chmod -x get_netinfo.sh
[root@localhost ~]# ll get_netinfo.sh
-rw-r--r-- 1 root root 521 6月 7 20:41 get_netinfo.sh
# source命令只是加载文件的,跟执行命令没关系
[root@localhost ~]# source get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
方法1变种:cat到文件中所有命令,交给bash命令执行
[root@localhost ~]# cat get_netinfo.sh | bash
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
# bash执行这个文件中所有命令,输出给了bash执行
[root@localhost ~]# bash < get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
脚本调试
需求
我们在编写脚本的时候,往往会受到各种因素的限制,导致脚本功能非常大或者内容有误,如果直接执行脚本的时候,因为脚本内容有误,导致脚本执行失败。
所以我们需要在脚本执行的时候,保证脚本没问题,我们可以借助于多种脚本调试方式来验证脚本。
调试方式
-n 检查脚本中的语法错误
-v 先显示脚本所有内容,然后执行脚本,结果输出,如果执行遇到错误,将错误输出。
-x 将执行的每一条命令和执行结果都打印出来,适合大文件
简单实践
准备工作
准备备份文件
cp get_netinfo.sh get_netinfo-error.sh
设置错误文件
[root@localhost ~]# cat get_netinfo-error.sh
...
# 将最后一行末尾的"取消
ifconfig eth0 | grep ether | awk '{print $2}' |xargs echo "MAC Address:
检查语法实践
脚本开发规范
脚本规范
1、脚本命名要有意义,文件后缀是.sh
2、脚本文件首行是而且必须是脚本解释器
#!/bin/bash
3、脚本文件解释器后面要有脚本的基本信息等内容
脚本文件中尽量不用中文注释; 通过 echo $LANG 查看是否支持中文
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等
4、脚本文件常见执行方式:/bin/bash 脚本名
5、脚本内容执行:从上到下,依次执行
6、代码书写优秀习惯;
1)成对内容的一次性写出来,防止遗漏。
如:()、{}、[]、''、``、""
2)[]中括号两端要有空格,书写时即可留出空格[ ],然后再退格书写内容。
3)流程控制语句一次性书写完,再添加内容
7、通过缩进让代码易读;(即该有空格的地方就要有空格)
其他技巧
1 尽可能记忆更多的命令
2 掌握脚本的标准的格式
3 多看、多模仿写、多思考
《三体》中有句话——弱小和无知不是生存的障碍,傲慢才是。
所以我们不要做一个小青蛙