shell

一、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系统下的根目录

0

ls

仅显示当前目录的可见内容

  • ls -l : 显示当前目录可见内容,并且以长格式的形式展示ll
  • ls -a: 显示当前目录的所有内容,包含隐藏内容
  • ls -al:显示当前目录的所有内容,包含隐藏内容,并且以长格式的形式展示

文件属性

0

0

其他属性

0

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

  1. rm -r

加了 -r 后,它认为你是在删除一个目录,并且表示递归删除该目录下的所有内容,使用这个命令时系统会向你进行确认:

rm -r day06 rm -r xuhai xuhai1 //可以同时删两个文件夹,不过要确认两次而已

这时,系统会告诉我们day06目录非空,确认是否删除?我们回复一个y就表示删除,并且会向我们多次确认;

  1. 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

0

创建文件:

创建文件有两种方式,可以使用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表示全局的意思;

下面的例子表示把整个文档中的”一代天骄”替换为”二代天骄”:

0

0

  • 搜索关键词:/keyword,直接斜杠后面跟上你要搜索的词就行;

二、shell三剑客之sed

sed(stream editor)流编辑器

(一)sed简介

sed是一种流编辑器,它是文本处理中非常适中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的’行‘存储在临时缓冲区中,又称为 ‘模式空间’(pattern space) ,接着使用sed命令再去处理缓冲区中的内容,处理完成后,把缓冲区的内容输出到屏幕上,接着再去处理下一行,这样不断重复,直到处理到文件的末尾,文件内容并没有改变(也可以加选项,去直接修改文件,或者使用重定向指定文件,存储数据)

sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

(二)工作流程

0

  1. 读取——执行——显示
  2. 常见用法:
    1. sed [选项] ‘操作’ 参数
    2. sed [选项] -f scriptfile 参数

scriptfile表示脚本文件,需要用-f选项指定,表示通过指定的脚本文件来处理输入的目标文件。

参数就是文件,也就是指定的待处理的文本文件列表

(三)常见选项

-h或–help:显示帮助

-e或-expression=:表示用指定命令或者脚本来处理输入的文本文件

-f或-file-:表示用指定的脚本文件来处理输入的文件文件

-n、-quite或silent:表示仅表示处理后的结果,sed默认输出全部内容,-n是只输出匹配到的内容,这个选项一般只用于查看

-i sed默认是不会修改文件内容的,-i会直接修改文件内容

-r 加这个选项可以使sed支持扩展正则表达式

sed –help 查看帮助

0

(四)操作

“操作”用于只当对文件操作的动作行为,也就是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)

(五)不常用操作

  1. h 模式空间的内容到临时缓冲区。
  2. H 追加模式空间的内容到临时缓冲区。
  3. g 获得临时缓冲区的内容,并替代当前模板块中的文本。
  4. G 获得临时缓冲区的内容,并追加到当前模板块文本的后面。
  5. l 列表不能打印字符的清单。
  6. N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。(追加的行间\n进行处理,因为此时将两行看做一行)
  7. p 打印模板块的行。
  8. P(大写) 打印模板块的第一行。
  9. q 退出Sed。
  10. b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
  11. r file 从file中读行。
  12. t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
  13. T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
  14. w file 写并追加模板块到file末尾。
  15. W file 写并追加模板块的第一行到file末尾。
  16. 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)普通字符

  1. 大小写字母、数字、标点符号及一些其他符号

(2)元字符

  1. 在正则表达式中具有特殊意义的专用字符

基础正则表达式的常见元字符

元字符

作用

\

转义字符,用于取消特殊符号的含义,如:\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 \ }匹配两到三位的小写字母

  1. 元字符是一类字符
  2. 中括号两边都不能空格

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值