1.命令别名(alias)及历史命令(history)
(1)alias命令别名
在BASH中,存在命令别名(alias)这一项功能,我们可以用一个命令去作为另一个命令的别称。
如我若是要经常性的使用ls -al |more这个命令去查看翻阅一些文件夹的内容,但这个命令太长我又懒得输入这么多字符该咋办?
我就可以用一些简单的字符来替代ls -al |more,比如lm这个简写字符,那么我的命令应该为:alias lm=‘ls -al |more’

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

那我们想取消命令别名的设置的话,应该输入什么命令呢?
答案是:“unalias”,如上方的命令,我想取消lm的话,我的命令应该是:unalias lm

(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条历史信息。

-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)里的信息来达到我们的目的

② 登录后信息(etc/motd)
若是想更改登录后的提示信息,则可以通过更改/etc/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

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

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

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

②grep命令
grep命令常用来显示我们想要查找的关键词的那一行
例如使用last命令可以显示最近登录系统的用户

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

命令格式:grep 【-a c i n v】‘查找字符’ 想要查找的路径或文件名
常用参数:
-a:将二进制文件按文本文件的方式查找数据
-c:计算找到字符的个数

-i:忽略大小写的差异

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

-v:反选,输出除了指定字符之外的所有行的内容
命令格式:grep 【-a c i n v】‘查找字符’ 想要查找的路径或文件名
常用参数:
-a:将二进制文件按文本文件的方式查找数据
-c:计算找到字符的个数

-i:忽略大小写的差异

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

-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配合使用,看你选择那个分隔区间来进行排序
例如:

② wc命令
wc命令常用于对文本的行、字数、字符数的统计
命令格式:wc 【-l w m】
常用参数:
默认wc不加参数的话是列出三种信息的数据
-l:仅列出行数
-w:仅列出字数(英文字母)
-m:仅列出字符数
例如:

其中第一个是行、第二个是字数、第三个是字符数
(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]

-d:删除信息当中你想要删除的字符
例:我想删除last中的英文字母r,则我可以输入命令:last |tr -d d

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

② col命令
col命令可以用于简单的将文本中的【TAB键】替换成空格键。
在文本中,如果使用cat -A查看,TAB键会显示为^I,而TAB键就可以把这些^I替换成空格键
命令格式:col 【-x】

③ expand命令
expand命令和col命令类似,也是将【TAB键】转成空格键,但是expand命令可以选择TAB键转成的空格键的个数。
比如我可以自由选定一个TAB键可以换成8、9个空格键
命令格式:expand 【-t】文件名
常用参数:
-t:后面跟你想将TAB键转换的空格的个数
例如:将TAB键转成6个空格

④ join命令
使用join命令可以对两个数据有相关性的文件,进行数据上的拼接,相加。
比如在两个文件当中,有相同数据的那一行,才将他们加在一起
命令格式:join 【-t i 1 2】
常用参数:
join默认不加参数的时候,以空格为分隔符分隔数据,并且比对【第一个栏位】的数据,如果两个文件相同,则将两条数据连成一行
-t:参数t后跟你想要设置的分隔符,分隔符使用【‘’】括住
-i:忽略大小写差异
-1 n:后接数字参数n,代表第一个文件你所要参考的分隔栏位是几位(分隔符是默认或者自己设置的)?
-2 n:后接数字参数n,代表第二个文件你所要参考的分隔栏位是几位
例如:我们分别查看/etc/passwd和/etc/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 ';'

(5)文件划分命令:split
有时候我们经常会碰到一个文件过大而无法发送或上传的情况,为了处理这种情况,我们可以使用划分文件的命令——split
split命令可以将一个大文件依据文件大小或行数来划分成多个小文件,而当想要将多个小文件复原回大文件,只要使用数据流重定向就好了(>,>>)
命令格式:split 【-b l】文件名 小文件的文件前缀
例如:split -b 300K /etc/services services
常用参数:
-b:后接你想划分的单个文件的大小,可以接单位
-l:以行数来划分

(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,所以我们就不需要专门输入文件名了。

Comments NOTHING