一、shell命令
(一)Shell是什么?
现在我们用的操作系统都是图形界面的,然而,真正能够控制计算机硬件(CPU、内存、显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁。由于安全、复杂、繁琐等原因,用户不能直接接触内核(也没有必要),需要另外再开发一个程序,让用户直接使用这个程序;该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。在用户和内核之间增加一层“代理”,既能简化用户的操作,又能保障内核的安全,何乐不为。
(二)linux终端下的快捷键
- tab :输入命令或者路径等操作时自动补全
- 上键:快速选择上一次或多次执行的命令
- 下键:快速选择下一次或多次执行的命令
- ctrl+a:让光标直接移动到命令行行首
- ctrl+e:让光标直接移动到命令行行尾
- ctrl+f:光标向右移动一位,跟方向键的右键是一样的效果
- ctrl+b:光标向左移动一位,跟方向键的左键是一样的效果
- ctrl+insert:复制
- shift+insert:粘贴
- ctrl+c:中断命令,就是一个命令一直执行,我们可以提前中断它
- ctrl+d:退出终端:除了使用ctrl+d的快捷键退出,还可以使用exit或者logout命令退出
- ctrl+l:相当于clear命令,清屏
(三)常用命令
cd
进入某个目录中
切换当前目录到根目录,”/“就是linux或unix系统下的根目录
ls
仅显示当前目录的可见内容
- ls -l : 显示当前目录可见内容,并且以长格式的形式展示ll
- ls -a: 显示当前目录的所有内容,包含隐藏内容
- ls -al:显示当前目录的所有内容,包含隐藏内容,并且以长格式的形式展示
文件属性
其他属性
pwd
显示当前用户所在目录
这个命令一般都是配合cd,ls命令使用的;
man
表示查看某命令的帮助文档
man这个命令就是帮助文档的意思:
我们在man后面加上具体的命令,按回车,就会显示出这个命令的用法
mkdir
新建一个目录
用法一:
创建了一个名为xuhaixuhai的目录
mkdir xuhaixuhai
同时创建了3个平级的目录
mkdir xuhai1 xuhai2 xuhai3
用法二:
mkdir -p
创建了一个带有层级关系的目录结构:创建了xuhai目录,xuhai目录下创建了子目录liudan
mkdir -p xuhai/liudan
这就是同时创建了两个同级的目录xuhai和xuhai1,又同时创建了它们的子目录xuhai1和liudan1
mkdir -p xuhai/liudan xuhai1/liudan1
rmdir
删除一个空目录,注意是空目录,有东西的目录不能删
注意:你要删除某个文件或者某个目录,你必须要到它的上一级目录中才能删除,否则无法删除;
rm
删除一个文件或目录
如果你不指定参数的时候,它就认为你是要删除一个文件:
用这个命令它就认为你是在删除一个文件:
rm xuhai
- rm -r
加了 -r 后,它认为你是在删除一个目录,并且表示递归删除该目录下的所有内容,使用这个命令时系统会向你进行确认:
rm -r day06 rm -r xuhai xuhai1 //可以同时删两个文件夹,不过要确认两次而已
这时,系统会告诉我们day06目录非空,确认是否删除?我们回复一个y就表示删除,并且会向我们多次确认;
- rm -r -f
-f 表示强制删除一个目录,不管这个目录下面是否有还有内容,并且它是直接删,不像-r那样还会向你确认,直接删;
rm -rf xuhai //表示强制删除一个目录,不管它是否为空 rm -r -f xuhai //根据上面学的知识,这也表示强制删除一个目录
但是你用-f跟rmdir配合使用是删除不掉非空目录的,-f不能跟rmdir配合使用,linux没有这样的语法;
rmdir -f xuhai
注意:-f 一定要慎用,删除了很难找回来
cp
复制拷贝一个文件或目录
用法一:拷贝文件
cp xuhai xuhai1
将xuhai文件拷贝了一份,新的这份文件叫xuhai1,这两份文件只有名字不一样;
注意:没加 - r ,就默认是拷贝文件,跟rm是一个道理
用法二:拷贝目录
cp -r xuhai xuhai1
将xuhai目录及它的子目录下的所有内容,都拷贝到xuhai1目录;
注意:加了 -r 就表示递归拷贝,把当前这个目录下的所有内容都拷贝出来成一份新的目录;
mv
重命名/移动文件或目录
用法一:重命名
mv day06 day6\_AM
这表示对文件重命名,将day06重命名为day6_AM
用法二:移动,或者叫剪切
mv day06\_AM ../
这就表示将day06_AM文件移动到了当前目录的上一级目录中,也就是移动到了家目录的上一级目录中;
…/ 表示上一级目录,这里不加斜杠”/“都是一个意思,都表示上一级目录
标准的写法应该是不带这个斜杠:
mv day06\_AM ..
(四)文件管理命令
touch
创建文件命令,创建一个或者多个文件,或者创建隐藏文件
用法一:创建单个文件
touch xuhai.txt
这就是创建了一个文本类型的文件,文件名为xuhai;
创建文件时,文件名可以为中文,但是你在创建脚本等特殊文件时,最好还是不要用中文;
用法二:一次创建多个文件
touch xuhai.txt tom.mkv
用法三:创建隐藏文件
touch .xuhai.txt .tom.txt
在前面加个点儿就表示创建隐藏文件
echo
输出重定向命令
echo的作用:就是当你用touch命令创建文件后,我们通过echo向文件中写入内容;
用法一:echo > 覆盖的方式写入
echo "helloworld" > a.txt
这表示将helloworld写入到a.txt中,如果a.txt中有内容,则会把原本的内容覆盖。
注意:你要往文件里写内容的时候,由于是字符串,所以你要给helloworld加双引号。
用法二:echo >> 追加的方式写入
echo "helloworld" >> a.txt
这表示将helloworld追加到a.txt中,不会把原本的内容覆盖。
用法三:错误信息追加
用法四:正确的信息和错误的信息均写入同一个文件
用法三跟用法四暂时先不管,后面学习shell脚本的时候会涉及到。
cat
显示文件的内容,从文件第一行开始显示
用法一:cat命令的普通用法
cat a.txt
这就表示显示a.txt文件中的内容。
用法二:cat命令的高级用法:往文件中写入内容
cat >a.txt<<EOF
输入这行命令,文件左边有个右箭头,左边有两个左箭头,并且有大写的EOF
单词组成;然后再回车,左下角就会弹出一个右箭头,表示你可以往a.txt中输入内容;
我们写完最后,再加一个EOF,再回车就能结束编辑模式,这个文件中就被写入内容了。
所以说,除了echo > 与echo >>命令可以往文件中写入内容,
cat >文件名.文件拓展名
tac
显示文件的内容,但是是从最后一行开始显示
tac命令跟cat是相反的;
tac a.txt
这就是从最后一行开始输出a.txt的内容
tac命令的用处:比如在查看日志时,从第一天开始看就太多了,直接用tac命令即可看到最新的内容;
nl
显示文件内容,从第一行开始显示,但是会多显示一个行数
nl命令跟cat命令差不多,都是从第一行显示文件内容,不过nl会多显示一个行号。
用法:
nl c.txt
more
分页显示文件内容,更方便我们阅读
当你的文件中的内容特别多,如果你不分页显示的话,你就得一点点往下翻,比较麻烦;这时候就可以使用more命令,分页显示文件的内容,你可以点下一页;
用法一:more 文件名.扩展名
more c.txt
按一下空格键,可以往后翻页;按一下字母b键,可以往前翻页;
用法二:more -num 文件名.扩展名
more -3 c.txt
这也是分页显示,但是只显示前三行
less
分页显示文件内容
less命令也是分页显示文件内容,但是跟more有区别
head
取出文件的前几行显示,head头部,后面跟参数 -n,-n 表示取多少行出来:
head -3 c.txt
这就是取前3行显示;
head命令了解即可
tail
取出文件的后几行显示,后面跟参数 -n
tail -3 c.txt
这就是取后3行显示;
(五)VI、VIM文本编辑器
使用文本编辑器之前需要安装,VIM是VI的升级版,我们通常是用VIM文本编辑器。
安装VIM文本编辑器:
yum install -y vim
创建文件:
创建文件有两种方式,可以使用touch命令创建,也可以使用VIM文本编辑器创建;
使用touch命令创建:
touch new.txt
使用VIM文本编辑器创建文件:
vim new.txt
注意,如果new.txt文件已经存在,则会直接打开它;如果new.txt文件不存在,则会先创建,再打开它;
命令模式
用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。
命令模式的常用命令
- p:粘贴
- yy:复制所在行
- nyy:从光标在的那一行开始,往下复制n行,包含光标所在那一行,如果你想复制3行,你就输入3yy
- dd:删除所在行
- ndd:删除n行
- gg:快速跳转到文件的头行的首字符
- G:快速跳转到文件的尾行的首字符
- 行号+G:比如200G,表示跳转到第200行,但是使用行号+G命令时,你需要先在底行模式中set nu将行号显示出来
- $:可以快速跳转到光标所在行的行尾
- u:撤销,回退操作
输入模式
在命令模式下按下 i 就进入了输入模式。
- ESC:退出输入模式,切换到命令模式
底线命令模式
在命令模式下按下:(英文冒号)就进入了底线命令模式。
- set nu:表示显示行号;
- wq:表示保存文件,跟上面的连续按两下大写的ZZ是一样的效果;
- w:将文件中的数据保存到磁盘
- q:退出vim,但是会保存文件
- q!:强制退出vim,并且不保存文件
- %s/old/new/g:全局替换,相当于windows下ctrl+f搜索出来后再进行替换的操作;最后的g表示全局的意思;
下面的例子表示把整个文档中的”一代天骄”替换为”二代天骄”:
- 搜索关键词:/keyword,直接斜杠后面跟上你要搜索的词就行;
二、shell三剑客之sed
sed(stream editor)流编辑器
(一)sed简介
sed是一种流编辑器,它是文本处理中非常适中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的’行‘存储在临时缓冲区中,又称为 ‘模式空间’(pattern space) ,接着使用sed命令再去处理缓冲区中的内容,处理完成后,把缓冲区的内容输出到屏幕上,接着再去处理下一行,这样不断重复,直到处理到文件的末尾,文件内容并没有改变(也可以加选项,去直接修改文件,或者使用重定向指定文件,存储数据)
sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
(二)工作流程
- 读取——执行——显示
- 常见用法:
- sed [选项] ‘操作’ 参数
- sed [选项] -f scriptfile 参数
scriptfile表示脚本文件,需要用-f选项指定,表示通过指定的脚本文件来处理输入的目标文件。
参数就是文件,也就是指定的待处理的文本文件列表
(三)常见选项
-h或–help:显示帮助
-e或-expression=:表示用指定命令或者脚本来处理输入的文本文件
-f或-file-:表示用指定的脚本文件来处理输入的文件文件
-n、-quite或silent:表示仅表示处理后的结果,sed默认输出全部内容,-n是只输出匹配到的内容,这个选项一般只用于查看
-i sed默认是不会修改文件内容的,-i会直接修改文件内容
-r 加这个选项可以使sed支持扩展正则表达式
sed –help 查看帮助
(四)操作
“操作”用于只当对文件操作的动作行为,也就是sed的命令。通常情况下是采用“[n1[n2]]”操作参数的格式。n1、n2是可选的,代表选择进行操作的行数,如操作需要在5~20行之间进行,则表示为“5,20动作行为”。常见的操作包括以下几种。
a:增加,在当前行下面增加一行指定内容。
i:插入,在选定行上面插入一行指定内容。
d:删除,删除选定的行。
D:删除模板块的第一行,5D和5d的效果相同,但是单独输入一个D或者d会删除全部内容
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,2,4p即打印2到4行,或者;号来分割,3p;5p表示打印3行和5行。通常与“-n”选项一起使用。
c:替换,讲选定行替换为指定内容。
s:替换,替换指定字符,sed -e ‘/Q/s/QQQ/123’ cs.txt
在线演示操作:打印空行的行号_牛客题霸_牛客网 (nowcoder.com)
(五)不常用操作
- h 模式空间的内容到临时缓冲区。
- H 追加模式空间的内容到临时缓冲区。
- g 获得临时缓冲区的内容,并替代当前模板块中的文本。
- G 获得临时缓冲区的内容,并追加到当前模板块文本的后面。
- l 列表不能打印字符的清单。
- N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。(追加的行间\n进行处理,因为此时将两行看做一行)
- p 打印模板块的行。
- P(大写) 打印模板块的第一行。
- q 退出Sed。
- b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
- r file 从file中读行。
- t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
- T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
- w file 写并追加模板块到file末尾。
- W file 写并追加模板块的第一行到file末尾。
- y 字符转换
特殊符号
解释说明
!
对指定行以外的所有行应用命令*
=
打印当前行行号
~
“First~step”表示从First行开始,以步长Step递增
&
代表被替换的内容
:
实现一行命令语句可以执行多条sed命令*
{}
对单个地址或地址范围执行批量操作
+
地址范围中用到的符号,做加法运算
(六)语法总结
sed [选项] ‘操作’ 参数
‘ ‘:首先是脚本生效的位置,默认每一行都会生效,可指定一个位置
如:sed -e ‘1i\我是插入的内容 ‘ test.txt–i(insert),\与插入的内容隔开
执行之后再查看文件,发现文件内容并没有改动
接着使用sed命令再去处理缓冲区中的内容,处理完成后,把缓冲区的内容输出到屏幕上,发现文件内容并没有改动
改变文件内容 -i
sed -ie ‘’ test.txt
sed -i.bak txt
这个时候会发现当前目录里多一个没有修改之前的文件,因为-i参数加了别的内容,会默认将原文件后面加一个后缀,以此形成备份文件
‘ ‘:脚本内容,一般是操作行数+具体操作。如果有复合操作则写在{},并用;区分
sed ‘/first/{ N ;p}’ data2.txt #
sed -e ‘/34/{h;g}’ cs.txt
对文件多次操作,可sed [选项] ‘操作’ [选项] ‘操作’ 参数
sed -e ‘1a\a’ -e ‘2a\b’ nowcoder.txt
(七)正则表达式
1、正则表达式的作用
正则表达式是一种字符模式,用于在查找过程中匹配指定的字符。
它将匹配被查找的的行中任何位置出现的相同模式,在正则表达式中,元字符是最重要的概念
正则表达式能够被vim、sed、grep调用
正则表达式运用场景 mysql、oracle、php、Python、Apache、Nginx…
(1)基础正则表达式示例
grep “^abc” test.txt
sed -n ‘/123/p’ test.txt
sed 命令结合正则表达式时,格式略有不同,正则表达式以“/”包围。
注:如果遇到特殊符号的情况,扩展正则还需要转义字符“\”。
2、正则表达式组成
(1)普通字符
- 大小写字母、数字、标点符号及一些其他符号
(2)元字符
- 在正则表达式中具有特殊意义的专用字符
基础正则表达式的常见元字符
元字符
作用
\
转义字符,用于取消特殊符号的含义,如:\r、\n等\n
\w 匹配任意一个字符和数字
^
匹配字符串的开始位置,如:^world匹配以world开头的行(^$ 表示空行)
$
匹配字符串的结束位置,如:world$匹配以world结尾的行.
.
匹配除\n(换行)之外的任意一个字符10:23
*
匹配前面的子表达式0次或者多次–.*
[list]
匹配list列表中的一个字符,如:[0-9]匹配任一位数字10:23:[0-9][0-9]
[^list]
匹配不在list列表中的一个字符,如:[^0-9]匹配任意一位非数字字符
\ {n \ }
匹配前面的子表达式n次,如:[0-9] \ {2 \ }匹配两位数字
\ {n, \ }
匹配前面的子表达式不少于n次,如:[0-9]{2,\ }表示两位及两位以上数字
\ {n,m \ }
匹配前面的子表达式n到m次,如:[a-z]\ {2,3 \ }匹配两到三位的小写字母
- 元字符是一类字符
- 中括号两边都不能空格
3、基础正则表达式案例(以查看日志为例)
创建文件
一、知道报错时间查询日志——^ 行首定位符
sed -n ‘/^2023-10-16 17:08/p’ nowcoder.txt #只能打印出匹配一行
sed -n ‘/^2023-10-16 17:08/,+10p’ nowcoder.txt #只能打印出匹配行以及下几行
二、知道系统报错信息,查看具体日志
sed -n ‘/系统异常/,+10p’ nowcoder.txt #只能打印出匹配行
三、查询某个时间段内的日志
方法一
sed -n ‘/2023-10-16 17:08:1[0-9]/,+5p’ nowcoder.txt #只能打印出匹配行
sed -n ‘/2023-10-16 17:08:[0-9]{2}/,+5p’ nowcoder.txt #只能打印出匹配行
方法二
sed -n ‘2023-10-16 17:08:00/,/2023-10-16 16:08:00/p’ nowcoder.txt #开始时间和结束时间必须要是日志里面有的,要是没有的时间,那查找就没有结果
sed -n ‘2023-10-16 17:08:/,/2023-10-16 16:08:/p’ nowcoder.txt #模糊查询
四、查询时间段范围的报错(有时间记录,并时间的那一行有error报错)
sed -n ‘/2023-10-16/{/exception/p}’ nowcoder.txt #有时间记录,并时间的那一行有exception异常抛出的)
cat -n nowcoder.txt |sed -n ‘/2023-10-16/p’ #用于查找错误日志看报错次数,和首行主要信息
(八)使用脚本编辑文件
sed [选项] -f scriptfile 参数
scriptfile:使用sed脚本,将多个编辑指令存放到文件中(每一行一条编辑指令),通过 -f 的方式调用
案例
确定参数(处理文件)
创建脚本
cat >cmd
执行
sed -f cmd cs.txt