第7章 Linux文件过滤及内容编辑处理

第7章 Linux文件过滤及内容编辑处理

在第5章,我们讲解了Linux系统文件及目录处理的基本命令知识和应用实践,本章继续为大家讲解处理Linux系统文件内容的一些核心命令,这些命令同样十分重要。

7.1 vi/vim:纯文本编辑器

Windows下最基本的文本编辑器就是记事本,当然,还有一些功能强大的文本编辑器,例如notepad++、emeditor等,如果与Linux系统相比较,那么你会发现Windows下的记事本对应的就是Linux里的vi命令,而notepad++、emeditor这样的编辑器对应则是vim命令,因此,掌握vi/vim命令是学好Linux的重要的必修课之一,因为这两个命令是管理Linux必不可少的工具。

7.1.1 命令详解

【命令星级】 ★★★★★

【功能说明】

vi是Linux命令行界面下的重要文字编辑器。vim是vi命令的增强版,例如,高亮显示代码、自动缩进等。vim与vi编辑器是兼容的,建议读者多用vim编辑器替代vi编辑器。

【用法格式】


vim  [option]  [file]
vim  [选项]    [文件]  

【vim的三种模式】

vim分为三种模式:普通模式、编辑模式、命令模式,其作用分别如下。

(1)普通模式

用vim命令打开一个文件后,默认的状态就是普通模式。在这个模式中,不能进行编辑输入操作,但可以按“上下左右”键来移动光标,同时还可以执行一些操作命令进行如删除、复制、粘贴等工作。

(2)编辑模式

在普通模式下不能进行编辑输入操作,只有按下“i,I,o,O,a,A,r,R,s,S”(其中“i”最为常用)等字母进入编辑模式后才可以执行录入文字等编辑操作。确定文件是否处于编辑模式状态有一个重要的特征,那就是在窗口的左下角要有插入的标记“--INSERT--”或“--插入--”,如图7-1所示。

图7-1 vim编辑模式

(3)命令模式

在普通模式下,输入“:”或“/”或“?”时,光标会自动定位在那一行,在这个模式中,可以执行保存、退出、搜索、替换、显示行号等相关操作。

图7-2所示的是vim的三种模式转换示意图。

图7-2 vim的三种模式转换示意图

【选项说明】

表7-1针对vi/vim命令的参数选项进行了说明。

表7-1 vi/vim命令的参数选项及说明

7.1.2 使用范例

范例7-1:进入普通模式。


[root@oldboy ~]# vim oldboy_new.txt

输入“vim文件名”即可直接进入vim窗口。如图7-3所示,左下角会显示这个文件的当前状态。如果是新文件,则会显示[New File],如"oldboy_new.txt"[New File]。

图7-3 vim编辑新文件窗口底部

如果是已存在的文件,则会显示当前文件名、行数、字符数等,如图7-4所示。


[root@oldboy ~]# vim /etc/services

图7-4 vim编辑已有文件窗口底部

范例7-2:进入编辑模式。

在普通模式下,按下i键就可以进入编辑模式,此时可输入任意文本内容。当然还有很多字母也可以实现同样的功能,如“I,o,O,a,A,r,R,s,S”,从图7-5中可以看到,其左下角有个“--INSERT--”,表示可以编辑内容了。

图7-5 vim编辑模式窗口

范例7-3:按[Esc]键切回到普通模式。

编辑完内容后,可按[Esc]键退出编辑模式,进入普通模式,此时,细心的读者可以从图7-6中注意到窗口左下角的“--INSERT--”消失了。

图7-6 vim从编辑模式返回普通模式窗口

范例7-4:使用命令模式保存文件内容,退出vim编辑器。

切回到普通模式后,此时就可以使用命令模式保存文件内容了,如图7-7所示,输入“:wq”(保存退出)或“:wq!”(强制保存退出)后敲下回车键即可保存退出。

图7-7 vim命令模式保存文件窗口底部

7.1.3 通过vim命令打开文件的方法小结

以下列举几种通过vim命令打开文件的方法。

·vim file:打开/新建文件,光标置于第1行行首,file为任意文件名。

·vim file+n:打开文件,光标置于第n行行首,n为自然数。

·vim file+:打开文件,光标置于最后1行行首。

·vim file+/pattern:将光标置于与pattern匹配的第一个字符串处,pattern为任意字符串。

有关vi/vim的命令深入知识(含vim配置及编程开发配置)讲解,可以参考《跟老男孩学Linux运维:Shell编程实战》一书的第16章。

7.2 echo:显示输出文本内容

7.2.1 命令详解

【命令星级】 ★★★★★

【功能说明】

echo命令能将指定文本显示在Linux命令行上,或者通过重定向符写入到指定的文件中。

【语法格式】


echo  [option]  [string]
echo  [选项]    [文本] 

【选项说明】

表7-2针对echo命令的参数选项进行了说明。

表7-2 echo命令的参数选项及说明

7.2.2 使用范例

范例7-5:打印文本到屏幕输出。


[root@oldboy ~]# echo Hello world      #<==echo直接接想输出的文本。
Hello world
[root@oldboy ~]# echo 'Hello world'    #<==可以使用单引号将内容括起来。
Hello world
[root@oldboy ~]# echo "Hello world"    #<==也可以使用双引号。
Hello world
[root@oldboy ~]# echo -e "hello\tworld" #<==使用选项-e可以识别\t(一个tab)等特殊字符。
hello   world

范例7-6:将单行文本追加到某个文件中。


[root@oldboy ~]# echo "hello world" >>hello.txt  #<==使用追加重定向符号>>将文本
                                                      写入文件。
[root@oldboy ~]# cat hello.txt
hello world

范例7-7:使用-n参数的示例。


[root@oldboy ~]# echo "oldboy";echo "oldboy"      #<==分号可以连接2个命令。
oldboy                                            #<==命令执行结果分成了两行输出。
oldboy
[root@oldboy ~]# echo -n "oldboy";echo "oldboy"   #<==使用-n选项就可以不换行,
                                 输出成一行。
oldboyoldboy

范例7-8:打印彩色输出。

命令如下:


echo -e "\033[30m 黑色字oldboy trainning \033[0m"
echo -e "\033[31m 红色字oldboy trainning \033[0m"
echo -e "\033[32m 绿色字oldboy trainning \033[0m"
echo -e "\033[33m 黄色字oldboy trainning \033[0m"
echo -e "\033[34m 蓝色字oldboy trainning \033[0m"
echo -e "\033[35m 紫色字oldboy trainning \033[0m"
echo -e "\033[36m 天蓝字oldboy trainning \033[0m"
echo -e "\033[37m 白色字oldboy trainning \033[0m"

提示:上文加粗的递增数字表示字体颜色范围。

图7-8为打印效果图。

图7-8 打印彩色输出效果图

假设要打印的背景色的数字范围为40-47,命令如下:


echo -e "\033[40;37m 黑底白字 welcome to old1boy\033[0m"
echo -e "\033[41;37m 红底白字 welcome to old2boy\033[0m"
echo -e "\033[42;37m 绿底白字 welcome to old3boy\033[0m"
echo -e "\033[43;37m 黄底白字 welcome to old4boy\033[0m"
echo -e "\033[44;37m 蓝底白字 welcome to old5boy\033[0m"
echo -e "\033[45;37m 紫底白字 welcome to old6boy\033[0m"
echo -e "\033[46;37m 天蓝白字 welcome to old7boy\033[0m"
echo -e "\033[47;30m 白底黑字 welcome to old8boy\033[0m"

提示:上文加粗的递增数字表示背景颜色范围。

图7-9为打印的效果图。

图7-9 打印彩色背景色效果图

有关字体颜色内容,在《跟老男孩学Linux运维:Shell编程实战》一书的第9章有详细介绍。

范例7-9:打印变量内容。


[root@oldboy ~]# echo $PATH  #<==echo打印环境变量,在环境变量名前面使用“$”符号。
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@oldboy ~]# test=12345  
[root@oldboy ~]# echo $test
12345

提示:与echo类似的命令还有printf,这是一个功能更强的输出命令,具体请见后文。

7.3 cat:合并文件或查看文件内容

7.3.1 命令详解

【命令星级】 ★★★★★

【功能说明】

cat命令可以理解为英文单词concatenate的缩写,其功能是连接多个文件并且打印到屏幕输出,或者重定向到指定文件中。此命令常用于显示单个文件内容,或者将几个文件内容连接起来一起显示,还可以从标准输入中读取内容并显示,生产环境中,它常与重定向或追加符号配合使用。

cat命令的记忆方法:cat的中文意思是猫,可理解为“瞄”一下文件内容,那就是显示文件内容了。根据老男孩的运维经验,cat具备5大常用功能,具体请见表7-3。

表7-3 cat命令常用功能

【语法格式】


cat  [option]  [file]
cat  [选项]    [文件]

说明:在cat命令及后面的选项和文件里,每个元素之间都至少要有一个空格。

【选项说明】

表7-4针对cat命令的参数选项进行了说明。

表7-4 cat命令的参数选项及说明

7.3.2 使用示例

1.基础范例

范例7-10:执行cat的完整命令生成test.txt文件内容。

方法1:


cat >test.txt<<EOF
welcome to my blog.http://oldboy.blog.51cto.com

if you like my blog’s contents,pls support me

bye! boys and girls
EOF #<==这里要敲回车才能结束,另外,EOF必须成对出现,但也可以用别的成对标签进行替换。例如,
oldboy字符标签,默认情况下结尾的EOF必须要顶格写。


方法2:


cat >test.txt<<-EOF  #<==如果cat后面使用了“>>-”符号,则结尾的EOF可以不用顶格,但
                                                       要用tab键缩进。

welcome to my blog.http://oldboy.blog.51cto.com

if you like my blog’s contents,pls support me

bye! boys and girls
EOF


以上就是cat命令在生产环境中常用的非交互式编辑文件的方法,请不要忽略上文中的空行,那是下文测试选项时需要用到的。另外,如果内容中包含$符号时要用“\”符号进行转义。

以上命令的执行过程及结果如下:


[root@oldboy ~]# cat >test.txt<<EOF
> welcome to my blog.http://oldboy.blog.51cto.com
> 
> if you like my blog's contents,pls support me
> 
> 
> 
> bye! boys and girls
> EOF   
[root@oldboy ~]# cat test.txt 
welcome to my blog.http://oldboy.blog.51cto.com
#<==此行是空行。
if you like my blog's contents,pls support me
#<==此行是空行。
#<==此行是空行。
#<==此行是空行。
bye! boys and girls.

范例7-11:直接执行cat命令查看文件内容,不带任何选项。


[root@oldboy ~]# cat test.txt 
welcome to my blog.http://oldboy.blog.51cto.com

if you like my blog’s contents,pls support me。

bye! boys and girls.


这就是最简单最基本的查看文件内容的使用方法了。

范例7-12:执行cat命令,分别带-n及-b选项,并对比两者的区别。


[root@oldboy ~]# cat -n test.txt 
    1  welcome to my blog.http://oldboy.blog.51cto.com
    2
    3  if you like my blog's contents,pls support me。
    4
    5
    6
    7  bye! boys and girls.
#<==说明:从上面的例子中可以看出,“-n”选项就是按行为文件内容编号并打印输出,包括空行。
[root@oldboy ~]# cat -b test.txt   
    1  welcome to my blog.http://oldboy.blog.51cto.com
2  if you like my blog's contents,pls support me。



3  bye! boys and girls.

#<==说明:从上面的例子可以看出,-b选项与-n选项类似,但是,-b选项并不为空行编号。


范例7-13:执行cat命令,带-E选项。


[root@oldboy ~]# cat -E test.txt  
welcome to my blog.http://oldboy.blog.51cto.com$
$
if you like my blog's contents,pls support me。$
$
$
$
bye! boys and girls.$

从上面的例子可以看出,-E选项就是将文件结尾的隐藏结束标识符$符显示出来。即使是空行,结尾也是有结束标识符的,这一点大家需要注意。

再来个小例子:


[root@oldboy ~]# echo >test1.txt
[root@oldboy ~]# cat -E test1.txt 
$
[root@oldboy ~]# ls -l test1.txt 
-rw-r--r-- 1 root root 1 05-30 21:35 test1.txt

这个小例子更好地说明了即使是以空行结尾也是有标识符$的。因此,在计算文件占用空间时,要注意这点。

-A(-vET)、-e(-vE)这两个选项都包含-E选项,因此,有与-E类似的功能,但-v、-T这两个选项在工作中使用得不多,了解一下即可。

范例7-14:执行cat命令,带-s选项。


[root@oldboy ~]# cat -s test.txt 
welcome to my blog.http://oldboy.blog.51cto.com

if you like my blog’s contents,pls support me。
#<==此处原来是3行空行,现在,由于-s选项的原因,变成一个空行了。
bye! boys and girls.


从上面的例子可以看出,-s选项就是将两个以上的空行变成一个空行,如果文件中连续的空行很多,那么这个选项可以让文件显示更加精炼易读。

但是在实际生产工作中,我们还是习惯使用grep-v"^$"test.txt过滤掉所有的空行(一个空行都不留),从而让显示更紧凑一些,示例代码如下。有关grep的讲解,详见后文。


[root@oldboy ~]# grep -v "^$" test.txt  #<==“^$”是正则表达式字符组合,表示空行。
welcome to my blog.http://oldboy.blog.51cto.com
if you like my blog's contents,pls support me。
bye! boys and girls.

范例7-15:执行cat命令编辑新文件。


[root@oldboy ~]# cat >test3.txt
hi,here is linux os.
[root@oldboy ~]# cat test3.txt 
hi,here is linux os.

从上面的例子可以看出,这里是利用cat和“>”重定向将标准输出定向到文件,这是一种特殊的编辑文件的方法。

这里有几个问题需要注意一下,具体如下。

1)结束编辑可以用快捷键Ctrl+d或Ctrl+c退出,但是必须要先执行回车操作,将光标定位到新的未输入的行才行。

2)利用此种方式输入时,会发现如果输入错了,只按退格键(Backspace)将无法删除,需要按住“Ctrl+退格键”才能删除。

3)此操作是一种特殊编辑方法,此处仅作为扩展知识点提及,生产环境中使用得很少。

范例7-16:执行cat命令连接并显示多个文件。


[root@oldboy ~]# cat test.txt test3.txt  
welcome to my blog.http://oldboy.blog.51cto.com

if you like my blog’s contents,pls support me。

bye! boys and girls. #<==此行以上是test.txt。
hi,here is linux os. #<==这是test3.txt的内容。


提示:这样两个文件会一起显示,但还是会有先后顺序之分的,前面的test.txt的内容会优先显示。

2.生产案例

说明:后面的生产案例会涉及Shell编程相关知识,如果没有Shell编程功底,则只需关注cat命令的用法即可。如果对Shell编程感兴趣,则可以参考老男孩的《跟老男孩学Linux运维:Shell编程实战》一书。

范例7-17:利用cat实现一键优化Linux系统脚本。

这是使用cat命令实现非交互式地在文件结尾增加内容的功能。下面的优化脚本是批量修改配置文件的方法,是生产环境中经常用到的用法,要熟练掌握才好。

下面以一键优化脚本中的一部分Linux服务器内核选项优化为例来说明cat的功能。

说明:本优化适合Apache、Nginx、Squid等多种Web相关应用,特殊的业务可能需要略做调整。

所谓内核优化,主要是在Linux系统中针对业务服务应用而进行的系统内核选项优化,优化并无特殊的标准,下面以常见的生产环境中Linux的内核优化为例进行讲解,仅供大家参考。示例代码如下:


[root@oldboy ~]# cat opt_sysctl.sh 
#!/bin/bash

/bin/cp /etc/sysctl.conf /etc/sysctl.conf.date +%F_%T #<==备份sysctl.conf。

cat>>/etc/sysctl.conf<<EOF #<==修改sysctl.conf。
#added by oldboy at 2007 start
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
#end
EOF
sysctl -p &>/dev/null #<==加载sysctl.conf。


以上是脚本内容,下面是执行情况:


[root@oldboy ~]# sh opt_sysctl.sh 
[root@oldboy ~]# tail -16 /etc/sysctl.conf
#added by oldboy at 2007 start
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000    65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
#end

注意:EOF可以使用任意成对字符串来代替,通常习惯使用EOF。

范例7-18:利用cat在脚本中显示帮助菜单。


[root@oldboy ~]# cat exportfs_usage.sh 
#!/bin/bash

exportfs_usage()
{
cat <<END
USAGE: $0 {start|stop|monitor|status|validate-all}
END
}
exportfs_usage


执行上述脚本后的效果:


[root@oldboy ~]# sh exportfs_usage.sh  
    USAGE: exportfs_usage.sh {start|stop|monitor|status|validate-all}

这里的cat命令可以用echo命令来代替,对于单行的内容显示和追加内容,使用echo命令是非常合适的,cat的优势是针对多行文本内容进行编辑,或者在已有内容的结尾追加新内容。

范例7-19:利用cat在脚本中显示内容选择菜单。


[root@oldboy ~]# cat menu.sh 
#!/bin/bash

menu(){
cat <<END
1.[apple]
2.[pear]
3.[banana]
4.[cherry]
5.[orange]
please select one that you like:
END
}
menu


执行上述脚本后的效果如下:


[root@oldboy ~]# sh menu.sh 
        1.[apple]
        2.[pear]
        3.[banana]
        4.[cherry]
        5.[orange]
        please select one that you like:

为了实现自动化运维,有时高级运维人员不得不通过脚本将操作写好,然后让组内的初级运维或非运维的同事,通过傻瓜式的菜单选择,来完成相应的工作,进而提升工作效率。

上面的脚本,从美感的角度来看,还是有些缺陷。比如:


[root@oldboy ~]# cat menu.sh 
#!/bin/bash

menu(){
cat <<END
1.[apple]
2.[pear]
3.[banana]
4.[cherry]
5.[orange]
please select one that you like:
END #<==此处顶格写,没有保持队形。但是直接保持队形,脚本执行又会报错。
}
menu


报错如下:


[root@oldboy ~]# sh menu.sh 
menu.sh: line 15: warning: here-document at line 4 delimited by end-of-file (wanted `END')
menu.sh: line 16: syntax error: unexpected end of file

改进后的脚本如下:


[root@oldboy ~]# cat menu.sh 
#!/bin/bash

menu(){
cat <<-END #<==此处END前加了一个减号。
1.[apple]
2.[pear]
3.[banana]
4.[cherry]
5.[orange]
please select one that you like:
END #<==因为前面使用了“-END”,因此此处可以使用Tab键缩进,记住是以Tab键缩进而不是空格!
}

menu


7.4 more:分页显示文件内容

7.4.1 命令详解

【命令星级】 ★★★★☆

【功能说明】

more命令的功能类似于cat,但cat命令是将整个文件的内容一次性地显示在屏幕上,而more则会一页一页地显示文件内容。但more的功能还是比较简单的,其有一个增强版的命令是less,将在7.5节详细讲解。

【语法格式】


more  [option]  [file]
more  [选项]    [文件] 

说明:在more命令及后面的选项和文件里,每个元素之间都至少要有一个空格。

【选项说明】

表7-5针对more命令的参数选项进行了说明。

表7-5 more命令的参数选项及说明

在交互模式下,使用more命令打开文本后,会进入一个基于vi的交互界面,在这里可以使用部分vi编辑器的功能,如搜索功能,还可以切换到vi编辑器。表7-6给出了more命令的交互式子命令。

表7-6 more命令的交互式子命令及说明

7.4.2 使用范例

1.基础范例

范例7-20:执行more命令,后面不接任何参数。


[root@oldboy ~]# more /etc/services  #<==若不接任何参数,则会满屏显示文件内容。
# /etc/services:
# $Id: services,v 1.48 2009/11/11 14:32:31 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2009-11-10
#
...省略若干...
#
# Each line describes one service, and is of the form:
#
# service-name  port/protocol  [aliases ...]  [# comment]

tcpmux 1/tcp # TCP port service multiplexer
–More–(0%) #<==还有已经显示内容的百分比。


读者可以在上面的交互界面测试一下常用的交互命令,比如按空格键往下翻一屏,按“b”往上翻一屏,若想要查找“3306”,则先输入一个“/”,然后输入“3306”敲回车即可找到。

范例7-21:查看前n行。


[root@oldboy ~]# more -5 /etc/services  #<==此时并不是满屏显示文件内容,只会显示5行内容。
# /etc/services:
# $Id: services,v 1.48 2009/11/11 14:32:31 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2009-11-10
--More--(0%)  

范例7-22:从指定的行数开始显示内容。


[root@oldboy ~]# more +888 /etc/services  #<==此时直接从第888行显示文件内容。
cableport-ax    282/tcp                   # Cable Port A/X
cableport-ax    282/udp                   # Cable Port A/X
rescap          283/tcp                   # rescap
rescap          283/udp                   # rescap
corerjd         284/tcp                   # corerjd
corerjd         284/udp                   # corerjd
fxp             286/tcp                   # FXP Communication
fxp             286/udp                   # FXP Communication
k-block         287/tcp                   # K-BLOCK
………… 
--More--(7%)

7.5 less:分页显示文件内容

7.5.1 命令详解

【命令星级】 ★★★★★

【功能说明】

如果使用man less查看less的帮助文档,则会发现官方的解释是less为more的反义词(opposite of more)。但less命令的名称只是一个文字游戏,它是more命令的高级版本(less这个名称来自俗语“越简单就越丰富”,即less is more)。

less命令的基本功能类似于more命令,可以分页显示文件内容,但比more的功能更强大。less命令在读取文件内容时,并不是像more、vi命令一样,需要一次性将整个文件加载之后再显示,而是会根据需要来加载文件内容,这样打开文件的速度更快。而且less命令支持[page up]、[page down]等按键的功能,可通过该功能往前或往后翻看文件,这样更容易查看一个文件的内容。

【语法格式】


less  [option]  [file]
less  [选项]    [文件] 

说明:在less命令及后面的选项和文件里,每个元素之间都至少要有一个空格。

【选项说明】

表7-7针对less命令的参数选项进行了说明。

表7-7 less命令的参数选项及说明

在交互模式下,less命令也是基于more命令和vi命令的,在这里可以使用vi编辑器的部分功能,如搜索功能,还可以切换到vi编辑器。表7-8给出了less命令的交互式子命令。

表7-8 less命令的交互式子命令及说明

7.5.2 使用范例

1.基础范例

范例7-23:通过less命令查看文件。


[root@oldboy ~]# less /etc/services  #<==若不接任何参数,则会满屏显示文件内容。
# /etc/services:
# $Id: services,v 1.48 2009/11/11 14:32:31 ovasik Exp $
#
# /etc/services:
# $Id: services,v 1.48 2009/11/11 14:32:31 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2009-11-10
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
…………

范例7-24:显示行号的示例。


[root@oldboy ~]# less -N /etc/services  #<==每一行前面都有行号了。
      1 # /etc/services:
      2 # $Id: services,v 1.48 2009/11/11 14:32:31 ovasik Exp $
      3 #
      4 # Network services, Internet style
      5 # IANA services version: last updated 2009-11-10
…………
  10772 com-bardac-dw   48556/udp               # com-bardac-dw
  10773 iqobject        48619/tcp               # iqobject
  10774 iqobject        48619/udp               # iqobject
(END)

2.技巧性范例

范例7-25:分页显示命令结果的示例。


[root@oldboy ~]# ls /etc/|less  #<==分页查看etc目录文件内容。
abrt
acpi
adjtime
aliases
aliases.db
alsa
alternatives
anacrontab
asound.conf
at.deny
audisp
audit
bash_completion.d
bashrc
:

7.6 head:显示文件头部内容

7.6.1 命令详解

【命令星级】 ★★★★★

【功能说明】

head命令用于显示文件头部的内容,执行head命令默认会输出文件的开头10行内容。

【语法格式】


head  [option]  [file]
head  [选项]    [文件] 

【选项说明】

表7-9针对head命令的参数选项进行了说明。

表7-9 head命令的参数选项及说明

7.6.2 使用范例

范例7-26:显示文件的前10行。


[root@oldboy ~]# head /etc/passwd  #<==head命令不接任何参数默认显示文件的前10行。
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

范例7-27:显示文件的前5行。


[root@oldboy ~]# head -n 5 /etc/passwd #<==第一种格式指定显示前5行。
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
[root@oldboy ~]# head -5 /etc/passwd   #<==第二种格式也是指定显示前5行,但是这种写
                          法更精简。
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

范例7-28:显示文件的前n个字节。


[root@oldboy ~]# head -c 10 /etc/passwd  #<==读取文件的前10个字节。前面的写法是以
                              行为单位的,而-c则是以字节为单位的。
                            该功能不常用。
root:x:0:0

范例7-29:打印文件除最后21行之外的内容。


[root@oldboy ~]# head -n -21 /etc/passwd  #<==最后21行不输出,这种写法也不常用。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

7.7 tail:显示文件内容尾部

7.7.1 命令详解

【命令星级】 ★★★★★

【功能说明】

tail命令用于显示文件尾部的内容,tail命令默认输出文件的最后10行。

【语法格式】


tail  [option]  [file]
tail  [选项]    [文件] 

【选项说明】

表7-10针对tail命令的参数选项进行了说明。

表7-10 tail命令的参数选项及说明

7.7.2 使用范例

范例7-30:显示文件最后10行的示例。


[root@oldboy ~]# tail /etc/passwd  #<==tail命令不接参数,默认显示最后10行。
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

范例7-31:使用tail命令显示文件末尾5行的内容。


[root@oldboy ~]# tail -n 5 /etc/passwd   #<==第一种写法。
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@oldboy ~]# tail -5 /etc/passwd     #<==第二种写法,这种写法简单。
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

范例7-32:通过tail命令从第15行开始显示文件。


[root@oldboy ~]# tail -n +15 /etc/passwd   #<==拓展的用法,但不常用。
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
...省略若干行...

范例7-33:通过tail命令实时监控文件的变化。


[root@oldboy ~]# tail -f /application/nginx/logs/access.log  #<==tail -f实时监控文件的变化,在生产中常用的场景是监控日志文件。
192.168.0.3 - - [23/May/2015:22:21:11 +0800] "GET /status/status.html HTTP/1.1" 304 0 "http://192.168.0.3/status/status.html" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.65 Safari/537.36"
...省略若干行...

7.8 grep:文本过滤工具

7.8.1 命令详解

【命令星级】 ★★★★★

【功能说明】

grep命令是Linux系统中最重要的命令之一,其功能是从文本文件或管道数据流中筛选匹配的行及数据,如果配合正则表达式技术一起使用,则功能会更加强大,它是Linux运维人员必须要掌握的命令之一!。

grep过滤就相当于是一个筛子,有可能筛子里面的东西是要保留的,也有可能是筛出来的需要保留,grep功能的生活形象图解如图7-10所示。

图7-10 grep对应生活中的形象工具——筛子

【语法格式】

grep命令里面的匹配模式,都是你要获取的内容,它们既可以是普通的文字符号也可以是正则表达式,其语法格式如图7-11所示。

图7-11 grep命令的语法结构图

【选项参数】

表7-11是grep命令的常用参数说明。

表7-11 grep的常用参数

7.8.2 使用范例

基础范例

范例7-34:请使用grep过滤不包含oldboy字符串的行(-v参数实践)。


[root@oldboy oldboy]# cat test1.txt    #<==查看待测试的文件。
test
liyao
oldboy
[root@oldboy oldboy]# grep -v "oldboy" test1.txt  #<==过滤不包含oldboy字符串的
                                 行,注意被过滤的字符串,应
                                 尽可能使用双引号。
test
liyao

提示:grep的-v参数的作用是排除,默认是以行为单位排除包含参数后面所接内容的某些行。

范例7-35:使用grep命令显示过滤后的内容的行号(-n参数实践)。


[oldboy@oldboy ~]$ cat test2.txt     #<==查看待测试的文件。
lisir
oldboy
oldboy linux
ALEX
[oldboy@oldboy ~]$ grep -n "oldboy" test2.txt   #<==输出包含oldboy字符串的行,
                                并显示行号。
2:oldboy
3:oldboy linux
[oldboy@oldboy ~]$ grep -n "." test2.txt        #<==显示所有行的行号(类似于cat
                                                    -n test2.txt),这里的"."代
                                                    表匹配任意单个字符,即匹配了所
                                                    有的内容,所以,显示了所有行的
                                                    行号。
1:lisir
2:oldboy
3:oldboy linux
4:ALEX

提示:-n参数会为grep命令找到的内容在开头加上对应的行号。

范例7-36:-i不区分大小写参数实践。


[oldboy@oldboy ~]$ grep "alex" test2.txt     #<==过滤小写alex的行,结果没有内容。
[oldboy@oldboy ~]$ grep -i "alex" test2.txt  #<==使用-i参数不区分大小写过滤alex。
ALEX

范例7-37:同时过滤两个不同的字符串并为过滤的内容显示颜色(-E和--color的参数实践)。


[oldboy@oldboy ~]$ grep -Ei "oldboy|alex" test2.txt  #<==不区分大小写,同时过滤包含oldboy和alex字符串。
oldboy
oldboy linux
ALEX
[oldboy@oldboy ~]$ grep -Ei --color=auto "oldboy|alex" test2.txt  #<==增加--color
                                         参数。
oldboy
oldboy linux
ALEX
#<==匹配的字符串会显示红色颜色。

范例7-38:计算匹配的字符串的数量(-c参数实践)。


[oldboy@oldboy ~]$ grep "oldboy" test2.txt   
oldboy
oldboy linux
[oldboy@oldboy ~]$ grep -c "oldboy" test2.txt
2

范例7-39:只输出匹配的内容(-o参数实践)。


[oldboy@oldboy ~]$ grep -o oldboy test2.txt 
oldboy
oldboy

范例7-40:利用grep搜索符合要求的用户(-w参数实践)。

准备测试数据:


[root@oldboy ~]# useradd oldboy
[root@oldboy ~]# useradd oldboy1
[root@oldboy ~]# useradd oldboy2
[root@oldboy ~]# grep -w oldboy /etc/passwd #<==使用-w搜索oldboy字符串。
oldboy:x:500:500::/home/oldboy:/bin/bash
[root@oldboy ~]# grep  oldboy /etc/passwd   #<==如果取消-w参数,则会搜索到包含
                             oldboy字符串的用户。
oldboy:x:500:500::/home/oldboy:/bin/bash
oldboy1:x:501:501::/home/oldboy1:/bin/bash
oldboy2:x:502:502::/home/oldboy2:/bin/bash

7.9 tr:替换或删除字符

7.9.1 命令详解

【命令星级】 ★★★★☆

【功能说明】

tr命令从标准输入中替换、缩减或者删除字符,并将结果写到标准输出。

【语法格式】


tr  [option]  [SET1]    [SET2]
tr  [选项]    [字符1]   [字符2]

【选项说明】

表7-12针对tr命令的参数选项进行了说明。

表7-12 tr命令的参数选项及说明

7.9.2 使用范例

以下是后面的范例中要用到的实践文本:


[root@oldboy ~]# cat oldboy.txt  
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.

not 4900000448.
my god ,i am not oldbey,but OLDBOY!


范例7-41:将文件中出现的“abc”替换为“xyz”。


[root@oldboy ~]# tr 'abc' 'xyz' < oldboy.txt  #<==tr命令接文件比较特殊,需要输入
                                                  重定向符号“<”。
I xm oldyoy texzher!
I texzh linux.

I like yxdminton yxll ,yillixrd yxll xnd zhinese zhess!
my ylog is http://oldyoy.ylog.51zto.zom
our site is http://www.etixntixn.org
my qq num is 49000448.

not 4900000448.
my god ,i xm not oldyey,yut OLDBOY!


提示:凡是在文本中出现的“a”全部转换成“x”,“b”全部转换成“y”,“c”全部转换成“z”,而不是仅仅将字符串“abc”替换为字符串“xyz”。

范例7-42:使用tr命令“统一”字母大小写。


[root@oldboy ~]# tr '[a-z]' '[A-Z]' <oldboy.txt #<==小写转大写。
I AM OLDBOY TEACHER!
I TEACH LINUX.

I LIKE BADMINTON BALL ,BILLIARD BALL AND CHINESE CHESS!
MY BLOG IS HTTP://OLDBOY.BLOG.51CTO.COM
OUR SITE IS HTTP://WWW.ETIANTIAN.ORG
MY QQ NUM IS 49000448.

NOT 4900000448.
MY GOD ,I AM NOT OLDBEY,BUT OLDBOY!
#<==[a-z]是26个小写字母的缩写,[A-Z]是26个大写字母的缩写。因此本例是将a替换为A,b替换为B…z替换为Z。


范例7-43:将数字0-9替换为a-j。


[root@oldboy ~]# tr '[0-9]' '[a-j]' < oldboy.txt #<==数字0替换为a,1替换为b …
                                一一对应。
I am oldboy teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.fbcto.com
our site is http://www.etiantian.org
my qq num is ejaaaeei.

not ejaaaaaeei.
my god ,i am not oldbey,but OLDBOY!


范例7-44:删除文件中出现的oldboy中的每个字符。


[root@oldboy ~]# tr -d 'oldboy'<oldboy.txt  #<==使用参数-d删除字符。
I am  teacher!
I teach inux.

I ike amintn a ,iiar a an chinese chess!
m g is http://.g.51ct.cm
ur site is http://www.etiantian.rg
m qq num is 49000448.

nt 4900000448.
m g ,i am nt e,ut OLDBOY!


提示:凡是在文件中出现的“o”、“l”、“d”、“b”、“y”字符都会被删除!而不仅仅是删除oldboy字符串。

7.10 有关vi/vim/cat/echo及特殊重点符号的考试题

考试题:在/data目录下创建oldboy.txt,并增加“I am studying linux.”一行内容。

该题有多种解题方法,下面就来一一分析讲解。

7.10.1 使用vi/vim命令解题及知识点分析

解题步骤具体如下。

1)首先确认/data目录是否存在,如果不存在则建立一个data目录,否则无法在不存在的data目录下创建oldboy.txt文件。示例代码如下:


[root@oldboy ~]# mkdir -p /data
[root@oldboy ~]# ls -ld /data
drwxr-xr-x. 2 root root 4096 Mar 10 14:33 /data

2)然后,执行vi命令指定路径,并创建和编辑oldboy.txt。示例代码如下:


[root@oldboy ~]# vi /data/oldboy.txt #<==默认是命令模式。

3)按i键进入insert插入模式(即编辑模式),然后按要求输入文本内容。示例代码如下:


I am studying linux.

4)编辑完毕后,按Esc键,退出编辑模式(插入模式),再次回到命令模式。

5)保存并退出,代码如下:


:wq   #<==保存并退出,w(write,写入),q(quit,退出)。
其他命令:
:wq!  #<==强制保存并退出。
:q!   #<==强制退出不保存。

6)检查文件内容,输出内容如下:


[root@oldboy ~]# cat /data/oldboy.txt
I am studying linux.

图7-12给出了上述过程中相应的转换流程。图7-13则是通过vi命令实现的流程图。

从该示例中可以得出如下几点结论。

·vi相当于Windows记事本,功能够用,但是不够强大。

·vim相当于高级编辑器notepad++emeditor,其功能更多,而且它的操作与vi是一样的,推荐大家都使用vim编辑文件。

7.10.2 使用echo命令解题及知识点分析

解题方法为利用echo命令在oldboy.txt中增加内容,示例代码如下:


[root@oldboy ~]# echo "I am studying CentOS."  #<==显示内容到屏幕上,这是echo的
                               基本功能。
I am studying CentOS.
[root@oldboy ~]# echo "I am studying CentOS." >>/data/oldboy.txt   
    #<==借用追加符号“>>”将内容写入到oldboy.txt结尾,此操作不改变源文件已有的内容。
[root@oldboy ~]# cat /data/oldboy.txt 
I am studying linux.   #<==这是vi命令添加的。
I am studying CentOS.  #<==这是echo命令添加的。
[root@oldboy ~]# echo "I am studying CentOS." >/data/oldboy.txt
    #<==借用重定向符号“>”先清空文件的所有内容,然后将内容写入到oldboy.txt结尾。
[root@oldboy ~]# cat /data/oldboy.txt 
I am studying CentOS.
[root@oldboy ~]# echo "I am studying CentOS." >/data/oldgirl.txt   
    #<==借用重定向符号“>”将内容写入到oldgirl.txt结尾,不改变源文件已有的内容。

图7-12 vi/vim中不同模式转换流程图

图7-13 通过vi命令打开编辑模式到保存退出的流程图

特殊符号“重定向符号(漏斗)”的说明

“>”为重定向符号,表示清除原文件里面的所有内容,然后将内容追加到文件的末尾(很危险的操作,慎用!)。

“>>”为追加重定向符号,即追加内容到文件的尾部(文件的最后一行)。

对于echo命令,需要补充的知识点具体如下。

下面来思考一下,echo命令通过重定向符号是否只能追加一行?

答:并非如此,重定向符号可以追加多行内容到文件的结尾,示例代码如下:


echo "1111
2222
3333     
4444">>oldgirl.txt
#<==可以用这个方法向文件中追加多行,不是很常用,了解即可,可用单引号或双引号引用所有内容。

操作过程及结果如下:


[root@oldboy ~]# echo "1111
> 2222
> 3333
> 4444">>oldgirl.txt
[root@oldboy ~]# cat oldgirl.txt 
1111
2222
3333
4444

7.10.3 使用cat命令解题及知识点分析

在向多行追加文本内容时,也可以利用cat再加上追加重定向符号实现与echo相同的功能,示例代码如下:


cat >>/data/test.txt<<EOF #<==这里必须要是两个小于号,EOF表示结束标记,即读取到EOF就结束。
I am studying linux cat.
for example.
EOF             #<==这个EOF表示结束,两个EOF之间的内容会被追加到文件中。
[root@oldboy ~]# cat >>/data/test.txt<<EOF
> I am studying linux cat.
> for example.
> EOF           #<==结尾EOF要顶格写,前面不能有空格,除非用tab,EOF可用其他符号替代。
[root@oldboy ~] # cat /data/test.txt 
I am studying linux cat.

7.10.4 重定向符号的核心知识

1.重定向简介

重定向是Linux里的一个重要名词,对于它的作用,直白点说,就是类似于如图7-14所示的漏斗,使用重定向符号,可以让数据从一个地方(文件或工具)无损失地流到另一个地方(文件或工具)。

图7-14 重定向符号的形象图解

2.标准输入/输出/错误输出

标准输入是一个名称,它表示数据的一个流入方向,通常表示数据从文件等流入到处理的工具或命令中,用代码0表示,使用“<”或“<<”符号来指示数据朝箭头所指的方向流动。

标准输出也是一个名称,也表示数据的一个流入方向,通常用代码1表示,使用“>”或“>>”符号来指示数据朝箭头的方向流动。与标准输入不同的是,1表示将命令等处理的一般信息输出到文件。

标准错误输出是另一个名称,也是表示数据的一个流入方向,通常用代码2表示,使用“>”或“>>”符号来指示数据朝箭头的方向流动。与标准输出不同的是,标准错误输出2表示将错误的信息输出到文件等,而不是输出正确的普通信息(仅输出错误信息)。

为了让读者能够清晰掌握重定向的相关知识,下面特总结了一个表,如表7-13所示。

表7-13 重定向符号总结

3.标准输出实际范例

标准输出的实际操作示例代码如下:


[root@oldboy ~]# echo "123" 1>oldboy.txt
[root@oldboy ~]# cat oldboy.txt
123
[root@oldboy ~]# echo 123 1>a.txt 2>b.txt #<==“echo 123”为正确输出,因此会重定向
                            到a.txt。
[root@oldboy ~]# cat a.txt 
123    #<==“echo 123”可以正确执行,因此会输出到a.txt。
[root@oldboy ~]# cat b.txt #<==“echo 123”可以正确执行,因此不会输出到b.txt。

4.错误输出案例

错误输出实际操作示例代码如下:


[root@oldboy ~]# cho 123 1>a.txt 2>b.txt #<==故意输入的错误命令cho。
[root@oldboy ~]# cat a.txt
[root@oldboy ~]# cat b.txt #<==“cho 123”执行会报错输出,因此,会重定向到b.txt。
-bash: cho: command not found

5.输入重定向的示例

输入重定向的实际操作示例如下。

范例7-45:将oldboy.txt内容输出到屏幕。


[root@oldboy ~]# echo 1 2 3 >oldboy.txt #<==将数据输出到oldboy.txt。
[root@oldboy ~]# cat<oldboy.txt     #<==读取oldboy.txt文件输出到屏幕。
1 2 3
[root@oldboy ~]# cat 0<oldboy.txt   #<==读取oldboy.txt文件输出到屏幕,0可以省略。
1 2 3

范例7-46:将oldboy.txt内容输出到指定命令进行处理,最后再输出到屏幕。


[root@oldboy ~]# tr " " "\n" 0< oldboy.txt #<==遇到空格,替换为回车(\n),0可以省略。
1
2
3
[root@oldboy ~]# xargs -n 1 <oldboy.txt  #<==分组显示,0可以省略。           
1
2
3

提示:tr和xargs命令的详解请参见后文。

范例7-47:Linux下使用输入重定向发邮件命令示例。


mail?-s '邮件标题'  邮件地址    <邮件内容(文件)
mail?-s 'training' oldboy@qq.com?</etc/hosts

提示:此功能需要开启邮件服务或配置邮件代理,这里只介绍“<”的应用。

6.追加输入重定向的示例

范例7-48:读入数据,然后输出到屏幕。


cat <<EOF
    oldboy
EOF

范例7-49:读入数据,然后输出到oldboy.txt文件。


    cat >oldboy.txt<<EOF
oldboy 
    EOF #相当于cat oldboy >oldboy.txt

7.11 有关grep/head/sed/awk及特殊重点符号的考试题

考试题:已知文件test.txt内容为:


test
liyao
oldboy

请给出在屏幕上输出test.txt内容时,不包含oldboy字符串的命令。

对于该题,相应的解答如下。

7.11.1 使用grep命令解题及知识点分析

解题步骤如下。

1)利用前文学到的知识,模拟生成要处理的数据文件,命令如下:


cat >oldboy.txt<<EOF
test
liyao
oldboy
EOF
[root@oldboy ~]# cat oldboy.txt 
test
liyao
oldboy

2)使用grep方法实现相应的功能,代码如下:


[root@oldboy ~]# grep -v oldboy oldboy.txt  #<==排除输出中包含oldboy字样的字符串。
test
liyao

提示:-v表示排除,后面接的内容是不希望输出的字符串,此处使用grep命令后,过滤的字符串为oldboy,对于该字符串,也可以用单引号或双引号引起来。

7.11.2 使用head命令解题

解题示例如下:


[root@oldboy ~]# head -2 oldboy.txt  #<==只输出文件的前两行。
test
liyao

7.11.3 通过更多命令解题的方法

下面的几种方法为扩展方法,基础弱的读者在学完第9章的内容之后,再回头来看这几个方法就简单了。

示例代码如下:


[root@oldboy ~]# sed '/oldboy/d' oldboy.txt      #<==使用三剑客之一的sed删除方法,
                                                     其实是先删除oldboy行,然后
                                                     打印剩下的内容。
test
liyao
[root@oldboy ~]# sed -n /[^oldboy]/p oldboy.txt  #<==正则表达式加sed方法。
test
liyao
[root@oldboy ~]# awk /[^oldboy]/ oldboy.txt      #<==正则表达式加awk方法。
test
liyao

命令中提到的三剑客是指grep、awk、sed,它们都具有过滤字符串的功能,grep最擅长,awk比较擅长按列过滤文件内容,sed则擅长在文件中删除、修改、替换和添加内容。三剑客配合正则表达式,是处理文件内容的杀手锏,读者必须掌握,后面的章节还会重点讲解这些内容,此处读者如果有不懂之处可以暂时忽略。

7.12 有关mkdir命令的考试题

考试题:请用一条命令完成创建目录/oldboy/test,即创建/oldboy目录及/oldboy/test目录。

解答命令如下:


mkdir -p /oldboy/test

实践过程如下:


[root@oldboy ~]# mkdir -p /oldboy/test  #<==递归创建目录,一般第一级目录不存在时使用
                                            -p,否则报错。
[root@oldboy ~]# tree /oldboy/          #<==查看目录树结果。
/oldboy/
`-- test
1 directory, 0 files

提示:如果tree命令不存在,则可以使用yum install tree-y安装。

7.13 有关cp/alias/unalias命令的考试题

考试题:已知/tmp目录下已经存在了test.txt文件,如何执行命令才能将/mnt/test.txt复制到/tmp下,并覆盖掉/tmp/test.txt,且让Linux系统不提示是否覆盖(root权限下)。

在解答该题之前,首先要建立测试数据,具体如下:


[root@oldboy ~]# touch /tmp/test.txt
[root@oldboy ~]# touch /mnt/test.txt
[root@oldboy ~]# cp /mnt/test.txt  /tmp/
cp: overwrite `/tmp/test.txt'?

法一:


/bin/cp /mnt/test.txt /tmp/test.txt

法二:


\cp  /mnt/test.txt /tmp/test.txt

采用这种方法解答此题的思路就是屏蔽掉系统默认的对应命令别名,执行cp的操作默认是调用了别名来执行的,所以会提示覆盖。

[详细说明]

cp命令默认是不会提示overwrite的,但是cp的-i选项会提示,在Linux的用户环境文件~/.bashrc中一般会将cp命名成alias cp='cp-i',示例代码如下:


[root@student tmp]# alias |grep cp
alias cp='cp -i'

这样,在Linux下输入cp命令实际上运行的是cp-i,再加上一个“\”符号,或者写cp全路径/bin/cp,就是让此次的cp命令不使用别名(cp-i)运行。

解法三(不推荐使用):


unalias cp
cp /mnt/test.txt /tmp/test.txt

提示:命令行处理别名仅在当时生效,重启系统后就失效了。

具体处理过程的演示代码如下:


[root@oldboy ~]# unalias cp  #<==提示:此法仅为临时取消别名方法,重新登录后就不再生效。
[root@oldboy ~]# alias |grep cp
[root@oldboy ~]# cp /mnt/test.txt  /tmp/     #<==不提示确认了。
[root@oldboy ~]# cp -i /mnt/test.txt  /tmp/  #<==只有主动加-i参数才会提示确认。
cp: overwrite `/tmp/test.txt'?

解法四(禁止使用):


$ vi ~/.bashrc
在“alias cp='cp -i'”前加上“#”注释掉,即取消cp的别名设置。
$ . ~/.bashrc(让修改生效)
# cp /mnt/test.txt /tmp/test.txt

这种解法为杀鸡取卵的方法,蛋取出来了,鸡也一命呜呼了。

此处涉及alias和ualias两种命令的用法,同时请读者思考一下别名的好处,以及怎么样利用这个特性为我们服务。

提示:同样的命令还有mv、rm等。希望读者做事也能尽量地举一反三,由此及彼,拓宽思路和视野。

需要特别说明的是,在脚本里直接写命令也可以逃避别名,但是我们在习惯上还是使用全路径。

Linux别名的作用

·对危险命令加一些保护参数等,以防止人为误操作。

·将很多复杂的字符串或命令变成一个简单的字符串或命令。

Linux别名对应的命令

·alias:查看和设置别名。

·unalias:取消别名。

下面来看一下Linux别名的用途示例。

范例7-50:相应的系统示例就是最好的例子。


[root@oldboy ~]# alias
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -i'

范例7-51:保护危险命令(此为生产案例)


[root@oldboy ~]# alias rm='echo "rm cmd is not allowd to use."'
[root@oldboy ~]# rm
rm cmd is not allowd to use.
[root@oldboy ~]# rm -fr /tmp/
rm cmd is not allowd to use. -fr /tmp/

范例7-52:简化命令操作(此为生产案例)


[root@oldboy ~]# ls /etc/sysconfig/network-scripts/ifcfg-eth0
[root@oldboy ~]# alias oldboy='cat /etc/sysconfig/network-scripts/ifcfg-eth0'
[root@oldboy ~]# alias |grep oldboy
alias oldboy='cat /etc/sysconfig/network-scripts/ifcfg-eth0'
[root@oldboy ~]# oldboy
DEVICE=eth0
HWADDR=00:0c:29:eb:fa:4c
TYPE=Ethernet
...省略若干...

Linux系统中别名配置所在的位置具体如下:


[root@oldboylinux ~]# cat ~/.bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

若希望定义的别名永久生效,则必须放到配置文件里,可以放到如下文件中:


a./etc/profile 全局生效,即所有登录的用户都生效。
b.~/.bashrc    当前用户生效,如果是root,就是登录root生效

提示:一定要用source或者“.”(点号)

以下是设置别名永久生效的例子。


[root@oldboy ~]# echo "alias rm='echo "rm cmd is not allowd to use."'" >>/etc/profile
[root@oldboy ~]# tail -1 /etc/profile
alias rm='echo rm cmd is not allowd to use.'
[root@oldboy ~]# source /etc/profile
[root@oldboy ~]# alias|grep rm
alias rm='echo rm cmd is not allowd to use.'

如下链接中分享有关别名的问题及解决技巧:http://oldboy.blog.51cto.com/2561410/699046

7.14 本章知识总结

1)重点命令:vi/vim/echo/cat/more/less/head/tail/grep/tr

2)普通命令:alias/unalias,提及的新命令sed/awk

3)重要知识:别名知识、复制后直接覆盖知识、多行文本追加知识、重定向符号知识


版权声明:本文为qq_43677746原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。