添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
博学的显示器  ·  verdaccio - 掘金·  1 年前    · 
坚强的佛珠  ·  TypeScript ...·  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 使用范例

7.5.2.1 基础范例

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

[root@centos7 ~]# less /etc/services    #若不接任何参数,则会满屏显示文件内容。
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
# Network services, Internet style
# IANA services version: last updated 2013-04-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
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  Not all ports
# are included, only the more common ones.
# The latest IANA port assignments can be gotten from
#       http://www.iana.org/assignments/port-numbers
# The Well Known Ports are those from 0 through 1023.
# The Registered Ports are those from 1024 through 49151
# The Dynamic and/or Private Ports are those from 49152 through 65535
# Each line describes one service, and is of the form:
# service-name  port/protocol  [aliases ...]   [# comment]
tcpmux          1/tcp                           # TCP port service multip/etc/services

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

[root@centos7 ~]# less -N /etc/services #每一行前面都有行号了。
      1 # /etc/services:
      2 # $Id: services,v 1.55 2013/04/14 ovasik Exp $
      4 # Network services, Internet style
      5 # IANA services version: last updated 2013-04-10
      7 # Note that it is presently the policy of IANA to assign a single      7  well-known
      8 # port number for both TCP and UDP; hence, most entries here have      8  two entries
      9 # even if the protocol doesn't support UDP operations.
     10 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  No     10 t all ports
     11 # are included, only the more common ones.
     13 # The latest IANA port assignments can be gotten from
     14 #       http://www.iana.org/assignments/port-numbers
     15 # The Well Known Ports are those from 0 through 1023.
     16 # The Registered Ports are those from 1024 through 49151
     17 # The Dynamic and/or Private Ports are those from 49152 through 6     17 5535
     19 # Each line describes one service, and is of the form:
     21 # service-name  port/protocol  [aliases ...]   [# comment]
/etc/services

7.5.2.2 技巧性范例

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

[root@centos7 ~]# ls /etc|less  #分页查看etc目录文件内容。
adjtime
aliases
aliases.db
alternatives
anacrontab
asound.conf
audisp
audit
bash_completion.d
bashrc
binfmt.d
centos-release
centos-release-upstream
chkconfig.d
cron.d
cron.daily
cron.deny
cron.hourly
cron.monthly
crontab
cron.weekly
crypttab
csh.cshrc
csh.login
dbus-1

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@centos7 ~]# 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
operator:x:11:0:operator:/root:/sbin/nologin

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

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

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

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

7.7 tail:显示文件内容尾部

7.7.1 命令详解

【命令星级】 ★★★★★

【功能说明】

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

【语法格式】

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

【选项说明】

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

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

7.2.2 使用范例

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

[root@centos7 ~]# tail /etc/passwd  #tail命令不接参数,默认显示最后10行。
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oldboy:x:1000:1000:oldboy:/home/oldboy:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin

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

[root@centos7 ~]# tail -n 5 /etc/passwd #第一种写法。
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oldboy:x:1000:1000:oldboy:/home/oldboy:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin
[root@centos7 ~]# tail -5 /etc/passwd   #第二种写法,这种写法简单。
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oldboy:x:1000:1000:oldboy:/home/oldboy:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin

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

[root@centos7 ~]# tail -n +5 /etc/passwd    #拓展用法,但不常用。
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oldboy:x:1000:1000:oldboy:/home/oldboy:/bin/bash
tcpdump:x:72:72::/:/sbin/nologin

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

[root@centos7 ~]# tail -f test.txt #tail -f实时监控文件的变化,在生产中常用的场景是监控日志文件。
welcome to Linux
if you like Linux please support me
bye! boys and girls
#光标会停在此处
#新开一个终端
[root@centos7 ~]# echo 'tail -f jiankong' >> test.txt   #往test.txt文件里追加内容。
[root@centos7 ~]# tail -f test.txt 
welcome to Linux
if you like Linux please support me
bye! boys and girls
tail -f jiankong #新加的内容会,实时显示。
^C  #Ctrl+c结束

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.8.2.1 基础范例

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

[root@centos7 ~]# cat >test1.txt<<EOF   #创建测试的文件。
> liyao
> neteagle
[root@centos7 ~]# grep -v "neteagle" test1.txt  #过滤不包含neteagle字符串的行,注意被过滤的字符串,应尽可能使用双引号。
liyao

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

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

[root@centos7 ~]# cat >test2.txt<<EOF   #创建测试文件
> lisir
> neteagle
> neteagle linux
[root@centos7 ~]# grep -n "neteagle" test2.txt  #输出包含neteagle字符串的行,并显示行号。
2:neteagle
3:neteagle linux
[root@centos7 ~]# grep -n "." test2.txt #显示所有航的行号(类似于cat -n test2.txt),这里的“.”代表匹配任意单个字符,即匹配了所有得内容,所以,显示了所有行的行号。
1:lisir
2:neteagle
3:neteagle linux
4:ALEX

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

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

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

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

[root@centos7 ~]# \grep -Ei "neteagle|alex" test2.txt   #不区分大小写,同时过滤包含neteagle和alex字符串。 
neteagle
neteagle linux
[root@centos7 ~]# \grep -Ei --color=auto "neteagle|alex" test2.txt  #增加--color参数
neteagle
neteagle linux
#匹配的字符串会显示红色颜色。
[root@centos7 ~]# alias grep
alias grep='grep --color=auto'
#因为系统已经把grep设置了别名,为了看到--color参数效果,把前面命令加了“\”转义。

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

[root@centos7 ~]# grep "neteagle" test2.txt #-c计算出文本中有几个neteagle字符串。
neteagle
neteagle linux
[root@centos7 ~]# grep -c "neteagle" test2.txt

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

[root@centos7 ~]# grep -o "neteagle" test2.txt
neteagle
neteagle

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

准备测试数据:

[root@centos7 ~]# useradd neteagle
[root@centos7 ~]# useradd neteagle1
[root@centos7 ~]# useradd neteagle2
[root@centos7 ~]# grep -w neteagle /etc/passwd  #使用-w搜索neteagle字符串。
neteagle:x:1001:1001::/home/neteagle:/bin/bash
[root@centos7 ~]# grep neteagle /etc/passwd #如果取消-w参数,则会搜索到包含neteagle字符串的用户。
neteagle:x:1001:1001::/home/neteagle:/bin/bash
neteagle1:x:1002:1002::/home/neteagle1:/bin/bash
neteagle2:x:1003:1003::/home/neteagle2:/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@centos7 ~]# cat >neteagle.txt<<EOF
> I am neteagle
> I like Linux
> I like badminton ball,billiard ball and chinese chess! 
> my web is https://www.neteagles.cn
> our site is http://www.etiantian.org
> my qq num is 19661891.
> not 19000661891.
> my god,i am not girl,iam boy!

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

[root@centos7 ~]# tr 'abc' 'xyz' <neteagle.txt  #tr命令接文件比较特殊,需要输入重定向符号“<”。
I xm netexgle texzher!
I texzh Linux.
I like yxdminton yxll,yillixrd yxll xnd zhinese zhess! 
my ylog is https://www.netexgles.zn
our site is http://www.etixntixn.org
my qq num is 19661891.
not 19000661891.
my god,i xm not nets,yut NETEAGLE!

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

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

[root@centos7 ~]# tr '[a-z]' '[A-Z]' <neteagle.txt  #小写转大写。
I AM NETEAGLE TEACHER!
I TEACH LINUX.
I LIKE BADMINTON BALL,BILLIARD BALL AND CHINESE CHESS! 
MY BLOG IS HTTPS://WWW.NETEAGLES.CN
OUR SITE IS HTTP://WWW.ETIANTIAN.ORG
MY QQ NUM IS 19661891.
NOT 19000661891.
MY GOD,I AM NOT NETS,BUT NETEAGLE!
#[a-z]26个小写字母的缩写,[A-Z]26个大写字母的缩写。因此本例是将a替换为Ab替换为B...z替换为Z

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

[root@centos7 ~]# tr '[0-9]' '[a-j]' <neteagle.txt  #数字0替换为a1替换为b ...一一对应。
I am neteagle
I like Linux
I like badminton ball,billiard ball and chinese chess! 
my web is https://www.neteagles.cn
our site is http://www.etiantian.org
my qq num is bjggbijb.
not bjaaaggbijb.
my god,i am not girl,iam boy!

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

[root@centos7 ~]# tr -d 'neteagle' <neteagle.txt    #使用参数-d删除字符。
I m  chr!
I ch Liux.
I ik bdmio b,biird b d chis chss! 
my bo is hps://www.s.c
our si is hp://www.ii.or
my qq um is 19661891.
o 19000661891.
my od,i m o s,bu NETEAGLE!

提示: 凡是在文件中出现的“n”、“e”、“t”、“e”、“a”、“g”、“l”、“e”字符都会被删除!而不是仅仅是删除neteagle字符串。

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

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

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

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

解题步骤具体如下。

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

[root@centos7 ~]# mkdir /data
[root@centos7 ~]# ll -d /data
drwxr-xr-x. 2 root root 6 Oct  9 18:03 /data

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

[root@centos7 ~]# vim /data/neteagle.txt    #默认是命令模式。

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

I am study linux.

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

5)报错并退出,代码如下:

:wq     #保存并退出,w(write,写入),q(quit,退出)。
:wq!    #强制保存并退出。
:q!     #强制退出不保存。

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

[root@centos7 ~]# cat /data/neteagle.txt
I am study linux.

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

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

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

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

  • vi相当于Windows记事本,功能够用,但是不够强大。
  • vim相当于高级编辑器notepad++、emeditor,其功能更多,而且它的操作与vi是一样的,推荐大家都使用vim编辑文件。
  • 7.10.2 使用echo命令解题及知识点分析

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

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

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

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

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

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

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

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

    [root@centos7 ~]# echo "1111
    > 4444">>neteagle2.txt
    #可以用这个方法想文件中追加多行,不是很常用,了解即可,可用单引号或双引号引用所有内容。
    [root@centos7 ~]# cat neteagle2.txt 
    

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

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

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

    7.10.4 重定向符号的核心知识

    7.10.4.1 重定向简介

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

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

    7.10.4.2 标准输入/输出/错误输出

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

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

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

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

    表7-13 重定向符号总结

    7.10.4.3 标准输出示例范例

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

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

    7.10.4.4 错误输出案例

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

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

    7.10.4.5 输入重定向的示例

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

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

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

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

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

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

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

    mail -s '邮件标题' 邮件地址 <邮件内容(文件)
    [root@centos7 ~]# mail -s 'tranning' 19661891@qq.com </etc/hosts
    

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

    7.10.4.6 追加输入重定向的示例

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

    [root@centos7 ~]# cat <<EOF
    > neteagle
    neteagle
    

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

    [root@centos7 ~]# cat >neteagle.txt<<EOF
    > neteagle
    [root@centos7 ~]# cat neteagle.txt 
    neteagle
    #相当于cat neteagle >neteagle.txt
    

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

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

    liyao neteagle

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

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

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

    解题步骤如下。

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

    [root@centos7 ~]# cat >neteagle.txt<<EOF
    > liyao
    > neteagle
    [root@centos7 ~]# cat neteagle.txt 
    liyao
    neteagle
    

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

    [root@centos7 ~]# grep -v neteagle neteagle.txt #排除输出中包含neteagl字样的字符串。
    liyao
    

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

    7.11.2 使用head命令解题

    解题示例如下:

    [root@centos7 ~]# head -2 neteagle.txt
    liyao
    

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

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

    示例代码如下:

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

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

    7.12 有关mkdir命令的考试题

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

    解答命令如下:

     mkdir -p /neteagle/test
    

    实践过程如下:

    [root@centos7 ~]# mkdir -p /neteagle/test       #递归创建目录,一般第一级目录不存在时使用-p,否则报错。
    [root@centos7 ~]# tree /neteagle/   #查看目录树结果。
    /neteagle/
    └── 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@centos7 ~]# touch /tmp/test.txt
    [root@centos7 ~]# touch /mnt/test.txt
    [root@centos7 ~]# cp /mnt/test.txt /tmp
    cp: overwrite ‘/tmp/test.txt’? ^C
    
    [root@centos7 ~]# /bin/cp /mnt/test.txt /tmp
    
    [root@centos7 ~]# \cp /mnt/test.txt /tmp
    

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

    【详细说明】

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

    [root@centos7 ~]# alias cp  #或使用alias | grep cp。
    alias cp='cp -i'
    

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

    解法三: (不推荐使用)

    [root@centos7 ~]# unalias cp
    [root@centos7 ~]# cp /mnt/test.txt /tmp/test.txt
    

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

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

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

    解法四: (禁止使用)

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

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

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

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

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

    Linux别名的作用

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

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

    Linux别名对应的命令

    alias:查看和设置别名。

    unalias:取消别名。

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

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

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

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

    [root@centos7 ~]# alias rm='echo "rm cmd is not allowd to use."'
    [root@centos7 ~]# rm
    rm cmd is not allowd to use.
    [root@centos7 ~]# rm -rf /tmp/
    rm cmd is not allowd to use. -rf /tmp/
    
        **范例7-52:**简化命令操作(此为生产案例)
    
    [root@centos7 ~]# ls /etc/sysconfig/network-scripts/ifcfg-eth0
    [root@centos7 ~]# alias neteagle='cat /etc/sysconfig/network-scripts/ifcfg-eth0'
    [root@centos7 ~]# alias |grep neteagle
    alias neteagle='cat /etc/sysconfig/network-scripts/ifcfg-eth0'
    [root@centos7 ~]# neteagle
    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=no
    BOOTPROTO=none
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=yes
    IPV6_AUTOCONF=yes
    IPV6_DEFROUTE=yes
    IPV6_FAILURE_FATAL=no
    IPV6_ADDR_GEN_MODE=stable-privacy
    NAME=eth0
    #UUID=33457492-ae7a-47d9-ae56-b209a615ad6a
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.201
    PREFIX=24
    GATEWAY=10.0.0.254
    IPV6_PRIVACY=no
    DNS1=223.5.5.5
    

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

    [root@centos7 ~]# cat ~/.bashrc
    # .bashrc
    # User specific aliases and functions
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    # Source global definitions
    if [ -f /etc/bashrc ]; then
        . /etc/bashrc
    

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

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

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

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

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

    7.14 本章知识总结

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

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

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