第十节.学习及认识BASH(二)

最后更新于 2021-10-08 513 次阅读


1.命令别名(alias)及历史命令(history)

(1)alias命令别名

在BASH中,存在命令别名(alias)这一项功能,我们可以用一个命令去作为另一个命令的别称。

如我若是要经常性的使用ls -al |more这个命令去查看翻阅一些文件夹的内容,但这个命令太长我又懒得输入这么多字符该咋办?

我就可以用一些简单的字符来替代ls -al |more,比如lm这个简写字符,那么我的命令应该为:alias lm=‘ls -al |more’

alias创建命令别名演示

而如果我们想查看一下当前系统的所以命令别名,那我们只要直接输入alias,就可以进行查询

alias命令查看所有命令别名

那我们想取消命令别名的设置的话,应该输入什么命令呢?

答案是:“unalias”,如上方的命令,我想取消lm的话,我的命令应该是:unalias lm

unalias取消命令别名命令演示

(2)历史命令(history)

bash默认会保存1000条曾经执行过的历史命令,而我们通过输入“history”这个命令,就可以显示出当前bash的历史命令。

默认情况下,历史命令的消息记录在系统的~/.bash_history中,但是默认情况下,只有在当前用户注销后,他输入过的命令才会被写入~/.bash_histroy,但是这里我们可以通过history -w参数立刻写入历史命令。

我们除了可以使用↑↓方向键选择历史命令以外,还可以使用【!!】这个命令来执行上一个命令;也可以使用【!n】来选择执行第n个命令;还可以使用命令标头,例如【!vi】来执行vi开头的命令。

命令格式:history 【n -c 】【-a r w】histfiles

常用参数:

不加参数:直接显示当前bash的历史命令

n:n代表数字,表示【要列出最近n条历史信息】,如果n为3,就代表列出最近3条历史信息。

history n 命令演示

-c:清空当前bash的所有历史命令

-a:将目前新增的history命令写入histfiles中,如果没有指定histfiles的话,就默认写入~/.bash_history

-r:将histfiles的内容读到目前shell的history中

-w:将当前shell的history的内容写入histfiles中

2.BASH shell的操作环境

(1)BASH登录前及登陆后信息的更改

① 登录前信息(etc/issue)

若是想更改BASH登录前的展示信息,我们可以通过更改/etc/issue(telnet环境更改/etc/issue.net)里的信息来达到我们的目的

修改issue文件的效果演示
② 登录后信息(etc/motd)

若是想更改登录后的提示信息,则可以通过更改/etc/motd的内容来达到我们的目的

修改motd文件的效果演示

(2)BASH的相关配置文件

① /etc/man_db.conf

man_db.conf规定了执行man这个命令的时候,该去哪里查看数据的路径设置。

而当我们使用tarball来安装某些软件时,该软件的man page可能会放置在/usr/local/你安装的软件名字/man中,如果我们不手动的将该路径添加到man_db.conf中的话,可能我们在使用man命令时,就会提示找不到相关说明文件

② ~/.bash_logout

这个文件记录了,当我们注销BASH后,系统会帮我们做些什么才离开?

默认情况下,我们注销BASH时,系统只会帮我们clear屏幕的内容。但是我们可以自行设置,来让系统帮我做一些备份和一些重要任务后再离开。

(3)BASH的常用默认组合键

ctrl + C:终止当前的命令

ctrl + Z:暂停当前的命令

ctrl + D:输入结束(EOF),例如用在回邮件的时候

ctrl + S:暂停当前屏幕的输出(锁死屏幕)

ctrl + Q:恢复当前屏幕的输出

ctrl + U:在提示字符下,将整列命令删除

ctrl + M:回车

(4)通配符与特殊符号

① 通配符
Ⅰ.“*”

代表匹配【0个到无穷个】任意字符

Ⅱ.‘’?‘’

代表【一定有一个】任意字符

例如,我想显示/etc文件夹中,文件名是五个字符的文件,则我的命令可以是:ll /etc/?????

通配符“?”演示
Ⅲ.[]

代表【一定有括号内的其中一个字符】,比如[abcd]就代表一定包含a、b、c、d中的一个字符

Ⅳ.[-]

若有减号在中括号内,则代表【匹配在编码顺序内的任意一个字符】,比如[a-z],就代表包含a-z在内的所有英文字母。

Ⅴ.[^]

若有指数符号"^"在中括号内,则代表反选。比如【^abc】,则代表可以匹配除了a、b、c三个字符以外的其他字符

范例1:我想找出/etc文件夹中,文件开头不是小写英文字母的文件。

命令:ls -al /etc/【^a-z】*

范例2:找出/etc文件夹中,文件名内包含数字的文件。

命令:ls -al /etc/*【0-9】 *

② 特殊字符
Ⅰ.#

注释符号,说明后续的数据均不执行

Ⅱ.\

转义符,将特殊符号或通配符转变为一般字符

Ⅲ.|

管道(PIPE)符号,分隔两个管道命令

Ⅳ.;

连续执行命令分隔符

Ⅴ.~

用户的家目录

Ⅵ.$

使用变量前导符

Ⅶ.&

任务管理,将命令变成后台任务

Ⅷ.!

逻辑运算符,代表【非】not的意思

Ⅸ./

目录符号,路径分隔的符号

Ⅹ.>,>>

数据流重定向,输出定向(stdout,stderr)

ⅩⅠ.<,<<

数据流重定向,输入定向(stdin)

ⅩⅡ.‘ ’

单引号,单引号括住的内容将不具有变量替换的功能,$等特殊字符会变成纯文本

ⅩⅢ.“ ”

双引号,双引号里的特殊字符和变量依旧会保留其作用

ⅩⅣ.`

反单引号,两个【`】括住的命令为优先执行的命令,与$(command)用法相同

ⅩⅤ.( )

在中间为子shell的起始与结束

ⅩⅥ.{}

在中间为命令区块的组合

3.数据流重定向

(1)什么是数据流重定向?

数据流重定向(redirect)从字面上来看就是将数据流的方向进行一次重新选择,让它去往它该去的地方。

数据流重定向图片演示

从图片上来看可以看成,我们输入命令,让其读取某个文件的信息(标准输入STDIN),然后成功执行的话,就在屏幕或其他设备上进行标准输出(STDOUT);而如果执行失败的话,就在屏幕或其他设备上进行标准错误输出(STDERR

而数据流重定向,就可以让数据流去往我们想让它去往的地方。比如标准错误输出,我们可以让它不输出在屏幕上,让它输出在某个文件里;或者让它以标准输出的方式进行输出。

(2)如何进行数据流重定向?

首先我们需要知道三种输入输出的代码和字符。

标准输入:代码0,字符<,<<

标准输出:代码1,字符>,>>

标准错误输出:代码2,字符2>,2>>

① 标准输出和标准错误输出(staout、staerr)

标准输出和标准错误输出的字符中,>代表直接覆盖,>>代表累积写入。

例1:我想将ll /的显示内容输出到~/rootfile文件中,则我的命令应该为:ll / > ~/rootfile

ll / > ~/rootfile命令演示

例2:如果我想将标准输出和标准错误输出分别写入到不同的文件,该怎么处理?

比如,我想查看/tmp 和/tmp/abc 这两个文件夹的内容,但是其中一个文件夹是不存在的,所以想将标准输出和错误输出分开记录。

命令:ll /tmp /tmp/abc >staout 2>staerr

标注输出和标准错误输出分别输出的命令演示

例3:如果我已经知道了我的命令运行时一定会产生错误输出,但是我又不想错误输出在屏幕上输出影响我对命令结果的查看时,我该怎么办?

这时候要使用黑洞设备/dev/null,我们只需要把错误输出的信息导入这个黑洞设备就行了。

命令:find /home -name .bashrc 2> /dev/null

例4:如果我想将标准输出和标准错误输出输出到同一个文件,然后分别显示,我该如何处理?

这时候我们要使用一些特殊语法,我们可以写成>list 2>&1,或者直接写成 &>list。

命令:ll /tmp /tmp/abc >list 2>&1

ll /tmp /tmp/abc &>list

② 标准输入

标准输入的特殊字符中,<代表使用文件内容来替换原本应该用键盘输入的数据。

例1:如果我想创建一个文件并用键盘键入我想要的内容的话,我的操作流程就应该是:

cat > testfile

键入想要的内容

ctrl+d退出编辑

cat > filename 用键盘输入内容演示

那如果我不想键盘输入,而是将另一个文件的内容导入呢?

我的命令就可以为:cat > testfile < inputfile

使用数据流重定向制定标准输入的内容的命令演示

<<则代表【结束的输入字符】,正常按上方的文件创建流程,在键盘输入完内容后,应该按ctrl+d来结束内容输入。但是加入<<后,我们可以指定一个字符来作为我们停止内容输入的信号。

例如我们可以设定【eof】为我们的终止输入字符,具体命令为:cat > testfile << "eof"

重定向标准输入"<<"演示

4.命令执行的判断依据

(1)“;”连续命令执行

";"可以作为多个命令之间的连续执行分隔符,多个命令之间不考虑命令相关性,一个接一个的连续执行。

例如:我想在关机之前,多进行几次sync同步命令,我就可以输入:sync; sync; shutdown -h now

(2)“&&”和“||”前一个命令执行后续才执行/前一个命令不执行,后面的命令才执行

如果要考虑两个命令之间的相关性在进行执行命令的话,可以考虑"&&"和"||"。其中,"&&"意思是,前一个命令成功执行($?=0)后面的命令才执行;而"||"的意思是,前一个命令不执行($?≠0)后续的命令才执行。

假设我想先查看/tmp里有没有/asoul这个文件夹,如果有的话就直接在asoul文件夹下创建ava文件,如果没有的话,就建立asoul这个文件夹,再创建ava这个文件的话,我应该怎么操作?

首先我们应该先用ls命令进行判断/tmp/asoul文件夹的存在,在判断是否要创建/asoul这个文件夹,由于前后两个命令存在一个前是后否的相关性,所以我们应该先考虑使用“||”这个字符。

然后又因为我们想要在存在asoul文件夹之后再进一步创建ava文件,所以我们根据这个前是后是的相关性,应该使用“&&”这个字符,所以我们的命令就应该为:

ls /tmp/asoul || mkdir /tmp/asoul && touch /tmp/asoul/ava

“&&”与“ll”命令执行判断演示

5.管道(pipe)命令

“|”管道也是用于连接多个命令之间的连接符,但是它和之前我们提到的“;”、"||"、"&&"等连续执行分隔符不一样,管道主要的作用是处理前一个命令所传来的正确信息。换句话说就是,在前一个命令的正确输出信息基础上,进行下一步的命令执行。

也就是说,前一个命令必须要是以标准输出的格式传递下去,下一个命令才能够正确执行(如果是想处理标准错误输出,则需要将标准错误输出转换成标准输出,后续命令才能处理,常用的命令为:2>&1)。

并且,管道后续的命令必须是能够接受标准输出的命令才行,例如:more、less、head、tail等。像ls、cp等命令就不能作为管道的后续命令被使用。

咱们常用的管道命令大致有:

(1)选取命令:cut、grep

①cut命令

通过cut命令,我们可以将前置命令展示的信息以【列】为单位来进行切割选取

命令格式:

cut -d '你选定的分隔字符' -f 你想选择的段数

cut -c 字符区间

参数解释:

-d:-d后边接你想选定的分隔字符,可以根据文件本身内容来选择,比如以冒号“:”、或者空格" "来作为分隔符,跟着-f参数使用

-f:-d将一段信息分为数段,用-f来选择你想取出第几段

-c:常用于排列整齐的数据,以字符的单位取出固定字符区间

例如:ehco $PATH |cut -d ':' -f 3

cut 命令演示1

变量PATH的内容我们可以以“:”为分隔,将数据内容分成5段,然后我们要是想选择第三或第四段,就可以使用-f参数来进行选择

cut 命令演示2
②grep命令

grep命令常用来显示我们想要查找的关键词的那一行

例如使用last命令可以显示最近登录系统的用户

last命令演示

如果我们想查找其中某个用户的登录信息,那我们就可以使用命令:last | grep 'reboot'

grep命令查找关键词

命令格式:grep 【-a c i n v】‘查找字符’ 想要查找的路径或文件名

常用参数:

-a:将二进制文件按文本文件的方式查找数据

-c:计算找到字符的个数

-i:忽略大小写的差异

-n:输出结果的同时顺便输出字符所在的行号

-v:反选,输出除了指定字符之外的所有行的内容

命令格式:grep 【-a c i n v】‘查找字符’ 想要查找的路径或文件名

常用参数:

-a:将二进制文件按文本文件的方式查找数据

-c:计算找到字符的个数

grep -c演示

-i:忽略大小写的差异

grep -i演示

-n:输出结果的同时顺便输出字符所在的行号

grep -n演示

-v:反选,输出除了指定字符之外的所有行的内容

grep -v演示

(2)排序及数据整理命令:sort、wc、uniq

① sort命令

sort命令的功能主要是对数据进行一个排序。

命令格式:sort 【-f b M n r u t k】 文件名或stdin输入

常用参数:

-f:忽略大小写差异

-b:忽略最前面的空格字符部分

-M:以月份的名字来进行排序,例如JAN、DEC等排序方法

-n:使用【纯数字】进行排序,默认是文字形式

-r:反向排序

-u:uniq,对排序好的内容直接进行筛选,相同的数据仅显示出一个

-t:分隔符号,默认是【TAB】

-k:常与-t配合使用,看你选择那个分隔区间来进行排序

例如

sort -t -k命令演示
② wc命令

wc命令常用于对文本的行、字数、字符数的统计

命令格式:wc 【-l w m】

常用参数:

默认wc不加参数的话是列出三种信息的数据

-l:仅列出行数

-w:仅列出字数(英文字母)

-m:仅列出字符数

例如

wc命令统计演示

其中第一个是行、第二个是字数、第三个是字符数

(3)双向重定向:tee

由名字可得知,该命令的主要作用是对数据流的双向重定向,也就是说既可以让一个数据流输出到file中的同时,又输出到屏幕或设备上。

命令格式:tee 【-a】 你想输出信息的文件

例如:我既想将last展示的信息输出到~/last.out文件,又想输出到屏幕上供我查看,那我就可以输入命令:last | tee -a ~/last.out | more

(4)字符转换命令:tr、col、expand、join、paste

① tr命令

tr命令可以实现对字符的删除和替换

命令格式:tr 【-d s】 字符

常用参数:

tr命令默认不加参数是替换功能

:我想将last中的所以小写字母替换成大写字母,则我可以输入命令:last | tr [a-z] [A-Z]

tr命令不带参数

-d:删除信息当中你想要删除的字符

:我想删除last中的英文字母r,则我可以输入命令:last |tr -d d

tr命令带 -d参数

-s:替换掉重复的字符

:我想将last中重复的o给删掉,则我可以输出命令:last |tr -s o

tr命令带-s参数
② col命令

col命令可以用于简单的将文本中的【TAB键】替换成空格键。

在文本中,如果使用cat -A查看,TAB键会显示为^I,而TAB键就可以把这些^I替换成空格键

命令格式:col 【-x】

col命令演示
③ expand命令

expand命令和col命令类似,也是将【TAB键】转成空格键,但是expand命令可以选择TAB键转成的空格键的个数。

比如我可以自由选定一个TAB键可以换成8、9个空格键

命令格式:expand 【-t】文件名

常用参数:

-t:后面跟你想将TAB键转换的空格的个数

例如:将TAB键转成6个空格

expand命令演示
④ join命令

使用join命令可以对两个数据有相关性的文件,进行数据上的拼接,相加。

比如在两个文件当中,有相同数据的那一行,才将他们加在一起

命令格式:join 【-t i 1 2】

常用参数:

join默认不加参数的时候,以空格为分隔符分隔数据,并且比对【第一个栏位】的数据,如果两个文件相同,则将两条数据连成一行

-t:参数t后跟你想要设置的分隔符,分隔符使用【‘’】括住

-i:忽略大小写差异

-1 n:后接数字参数n,代表第一个文件你所要参考的分隔栏位是几位(分隔符是默认或者自己设置的)?

-2 n:后接数字参数n,代表第二个文件你所要参考的分隔栏位是几位

例如:我们分别查看/etc/passwd和/etc/group这两个文件的前三栏

passwd文件前三栏内容展示
group文件前三行内容展示

我们分别观察?这两个文件,会发现/etc/group的前三栏和/etc/passwd文件的前三栏是一致的,现在我想让他们两个文件的内容拼接在一起,且重复的内容只显示一次,我该怎么做?

这时候就需要Join这个命令,我们令/etc/passwd为第一个文件,/etc/group为第二个文件,我们从上可得这两个文件前三栏都是一样的,所以我们就以第三栏为参考。

命令:join -t ':' -1 3 /etc/passwd -2 3 /etc/group | head -n 3

注意:这里我们选择的用于参考的那一栏会挪到拼接内容的第一行去,这时我们用第二栏作为参考来与上边的例子做个对比就很清楚了

参考展示
⑤ paste命令

和join命令一样,也是用于数据拼接,但是这个不用进行数据比对,直接就对数据进行拼接

命令格式:paste 【-d】 文件1 文件2

常用参数:

-d:d参数后接你想要的分隔符,比如你想要冒号隔开两个数据,就使用 -d ';'

paste命令演示

(5)文件划分命令:split

有时候我们经常会碰到一个文件过大而无法发送或上传的情况,为了处理这种情况,我们可以使用划分文件的命令——split

split命令可以将一个大文件依据文件大小或行数来划分成多个小文件,而当想要将多个小文件复原回大文件,只要使用数据流重定向就好了(>,>>)

命令格式:split 【-b l】文件名 小文件的文件前缀

例如:split -b 300K /etc/services services

常用参数:

-b:后接你想划分的单个文件的大小,可以接单位

-l:以行数来划分

split命令演示

(6)"-"减号的用法

在管道命令中,我们经常会使用前一个命令的staout作为下一个命令个stain(比如tar命令,可以打包一个文件又马上解压到另一个文件夹中),所以这时候我们可以使用一个符号来替代我们的stdin和stdout。

减号"-"在管道命令中,可以用来替代前一个命令的stdout或者作为stdin。

例如这个命令:tar -cjf - /home| tar xjf - -C /etc/homeback

前一个命令我们可以看出是打包命令,目的是打包/home这个文件夹内的内容,但是我们不直接输出成打包文件,而是用"-"减号代替了我们的staout,然后使用管道命令直接输送到下一个解包命令中,作为第二个命令的stain,所以我们就不需要专门输入文件名了。

(6)"-"减号的用法

在管道命令中,我们经常会使用前一个命令的staout作为下一个命令个stain(比如tar命令,可以打包一个文件又马上解压到另一个文件夹中),所以这时候我们可以使用一个符号来替代我们的stdin和stdout。

减号"-"在管道命令中,可以用来替代前一个命令的stdout或者作为stdin。

例如这个命令:tar -cjf - /home| tar xjf - -C /etc/homeback

前一个命令我们可以看出是打包命令,目的是打包/home这个文件夹内的内容,但是我们不直接输出成打包文件,而是用"-"减号代替了我们的staout,然后使用管道命令直接输送到下一个解包命令中,作为第二个命令的stain,所以我们就不需要专门输入文件名了。

“-”减号在管道命令中的用法演示