1、shell简介

shell快捷键

筛选信息

快捷键符号

命令执行:

    !! 					执行上一条命令
    !【num】 			执行历史命令中的第num行命令
    Ctrl 【关键字】 		执行内容匹配的命令,查找的是执行过的历史命令

示例:
image

命令行切换:

	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个字符开始截取后面所有字符

image

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

image

示例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

image

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排序后去重

image
image

组合信息

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

image

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

image
image

-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

image

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

image

文件实现方式

描述:
	就是说我们把手工执行的命令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

image

脚本实践

当可执行的Linux命令或语句不在命令行状态下执行,而是通过一个文件执行时,我们称文件为shell脚本。

应用场景

重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。
 	自动化分析处理
 	自动化备份
 	自动化批量部署安装
 	等等... 

脚本创建

脚本创建工具:
	创建脚本的常见编辑器是	vi/vim.

脚本命名
	shell脚本的命名简单来说就是要有意义,方便我们通过脚本名,来知道这个文件是干什么用的。

脚本内容:
	各种可以执行的命令

脚本注释

单行注释:
	除了首行的#不是注释外,其他所有行内容,只要首个字符是#,那么就表示该行是注释
多行注释:
	多行注释有两种方法::<<! ... !  和 :<<字符 ... 字符

image

脚本执行

脚本执行方法

方法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:

检查语法实践
image
image

脚本开发规范

脚本规范

1、脚本命名要有意义,文件后缀是.sh
2、脚本文件首行是而且必须是脚本解释器
	#!/bin/bash
3、脚本文件解释器后面要有脚本的基本信息等内容
	脚本文件中尽量不用中文注释; 通过 echo $LANG 查看是否支持中文
	尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
	常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等
4、脚本文件常见执行方式:/bin/bash 脚本名
5、脚本内容执行:从上到下,依次执行
6、代码书写优秀习惯;
    1)成对内容的一次性写出来,防止遗漏。
如:()、{}、[]、''、``、""
    2)[]中括号两端要有空格,书写时即可留出空格[    ],然后再退格书写内容。
    3)流程控制语句一次性书写完,再添加内容
7、通过缩进让代码易读;(即该有空格的地方就要有空格)

其他技巧

1 尽可能记忆更多的命令
2 掌握脚本的标准的格式
3 多看、多模仿写、多思考
posted @ 2022-12-27 09:48  aBiu--  阅读(32)  评论(0编辑  收藏  举报