• 2.6 文本文件编辑命令

    2.6 文本文件编辑命令

    通过前面几个小节的学习,读者应该基本掌握了切换工作目录及对文件的管理方法。Linux系统中“一切都是文件”,而对服务程序进行配置自然也就是编辑程序的配置文件。如果不能熟练地查阅系统或服务的配置文件,那以后工作时可就真的要尴尬了。本节将讲解几条用于查看文本文件内容的命令。至于编辑器使用起来比较复杂,因此将放到第4章与Shell脚本内容一起讲解。

    1.cat命令

    cat命令用于查看纯文本文件(内容较少的),格式为“cat [选项] [文件]”。

    Linux系统中有多个用于查看文本内容的命令,每个命令都有自己的特点,比如这个cat命令就是用于查看内容较少的纯文本文件的。cat这个命令也很好记,因为cat在英语中是“猫”的意思,小猫咪是不是给您一种娇小、可爱的感觉呢?

    如果在查看文本内容时还想顺便显示行号的话,不妨在cat命令后面追加一个-n参数:

    1. [root@linuxprobe ~]# cat -n initial-setup-ks.cfg
    2. 1 #version=RHEL7
    3. 2 # X Window System configuration information
    4. 3 xconfig --startxonboot
    5. 4
    6. 5 # License agreement
    7. 6 eula --agreed
    8. 7 # System authorization information
    9. 8 auth --enableshadow --passalgo=sha512
    10. 9 # Use CDROM installation media
    11. 10 cdrom
    12. 11 # Run the Setup Agent on first boot
    13. 12 firstboot --enable
    14. 13 # Keyboard layouts
    15. 14 keyboard --vckeymap=us --xlayouts='us'
    16. 15 # System language
    17. 16 lang en_US.UTF-8
    18. ………………省略部分输出信息………………

    cat命令详解:https://www.linuxcool.com/cat

    2.more命令

    more命令用于查看纯文本文件(内容较多的),格式为“more [选项]文件”。

    如果需要阅读长篇小说或者非常长的配置文件,那么“小猫咪”可就真的不适合了。因为一旦使用cat命令阅读长篇的文本内容,信息就会在屏幕上快速翻滚,导致自己还没有来得及看到,内容就已经翻篇了。因此对于长篇的文本内容,推荐使用more命令来查看。more命令会在最下面使用百分比的形式来提示您已经阅读了多少内容。您还可以使用空格键或回车键向下翻页:

    1. [root@linuxprobe ~]# more initial-setup-ks.cfg
    2. #version=RHEL7
    3. # X Window System configuration information
    4. xconfig --startxonboot
    5.  
    6. # License agreement
    7. eula --agreed
    8. # System authorization information
    9. auth --enableshadow --passalgo=sha512
    10. # Use CDROM installation media
    11. cdrom
    12. # Run the Setup Agent on first boot
    13. firstboot --enable
    14. # Keyboard layouts
    15. keyboard --vckeymap=us --xlayouts='us'
    16. # System language
    17. lang en_US.UTF-8
    18.  
    19. ignoredisk --only-use=sda
    20. # Network information
    21. network --bootproto=dhcp --device=eno16777728 --onboot=off --ipv6=auto
    22. network --bootproto=dhcp --hostname=linuxprobe.com
    23. --More--(43%)

    3.head命令

    head命令用于查看纯文本文档的前N行,格式为“head [选项] [文件]”。

    在阅读文本内容时,谁也难以保证会按照从头到尾的顺序往下看完整个文件。如果只想查看文本中前20行的内容,该怎么办呢?head命令可以派上用场了:

    1. [root@linuxprobe ~]# head -n 20 initial-setup-ks.cfg
    2. #version=RHEL7
    3. # X Window System configuration information
    4. xconfig --startxonboot
    5.  
    6. # License agreement
    7. eula --agreed
    8. # System authorization information
    9. auth --enableshadow --passalgo=sha512
    10. # Use CDROM installation media
    11. cdrom
    12. # Run the Setup Agent on first boot
    13. firstboot --enable
    14. # Keyboard layouts
    15. keyboard --vckeymap=us --xlayouts='us'
    16. # System language
    17. lang en_US.UTF-8
    18.  
    19. ignoredisk --only-use=sda
    20. # Network information
    21. network --bootproto=dhcp --device=eno16777728 --onboot=off --ipv6=auto
    22. [root@linuxprobe ~]#

    4.tail命令

    tail命令用于查看纯文本文档的后N行或持续刷新内容,格式为“tail [选项] [文件]”。

    我们可能还会遇到另外一种情况,比如需要查看文本内容的最后20行,这时就需要用到tail命令了。tail命令的操作方法与head命令非常相似,只需要执行“tail -n 20 文件名”命令就可以达到这样的效果。tail命令最强悍的功能是可以持续刷新一个文件的内容,当想要实时查看最新日志文件时,这特别有用,此时的命令格式为“tail -f 文件名”:

    1. [root@linuxprobe ~]# tail -f /var/log/messages
    2. May 4 07:56:38 localhost gnome-session: Window manager warning: Log level 16: STACK_OP_ADD: window 0x1e00001 already in stack
    3. May 4 07:56:38 localhost gnome-session: Window manager warning: Log level 16: STACK_OP_ADD: window 0x1e00001 already in stack
    4. May 4 07:56:38 localhost vmusr[12982]: [ warning] [Gtk] gtk_disable_setlocale() must be called before gtk_init()
    5. May 4 07:56:50 localhost systemd-logind: Removed session c1.
    6. Aug 1 01:05:31 localhost systemd: Time has been changed
    7. Aug 1 01:05:31 localhost systemd: Started LSB: Bring up/down networking.
    8. Aug 1 01:08:56 localhost dbus-daemon: dbus[1124]: [system] Activating service name='com.redhat.SubscriptionManager' (using servicehelper)
    9. Aug 1 01:08:56 localhost dbus[1124]: [system] Activating service name='com.redhat.SubscriptionManager' (using servicehelper)
    10. Aug 1 01:08:57 localhost dbus-daemon: dbus[1124]: [system] Successfully activated service 'com.redhat.SubscriptionManager'
    11. Aug 1 01:08:57 localhost dbus[1124]: [system] Successfully activated service 'com.redhat.SubscriptionManager'

    5.tr命令

    tr命令用于替换文本文件中的字符,格式为“tr [原始字符] [目标字符]”。

    在很多时候,我们想要快速地替换文本中的一些词汇,又或者把整个文本内容都进行替换,如果进行手工替换,难免工作量太大,尤其是需要处理大批量的内容时,进行手工替换更是不现实。这时,就可以先使用cat命令读取待处理的文本,然后通过管道符(详见第3章)把这些文本内容传递给tr命令进行替换操作即可。例如,把某个文本内容中的英文全部替换为大写:

    1. [root@linuxprobe ~]# cat anaconda-ks.cfg | tr [a-z] [A-Z]
    2. #VERSION=RHEL7
    3. # SYSTEM AUTHORIZATION INFORMATION
    4. AUTH --ENABLESHADOW --PASSALGO=SHA512
    5.  
    6. # USE CDROM INSTALLATION MEDIA
    7. CDROM
    8. # RUN THE SETUP AGENT ON FIRST BOOT
    9. FIRSTBOOT --ENABLE
    10. IGNOREDISK --ONLY-USE=SDA
    11. # KEYBOARD LAYOUTS
    12. KEYBOARD --VCKEYMAP=US --XLAYOUTS='US'
    13. # SYSTEM LANGUAGE
    14. LANG EN_US.UTF-8
    15.  
    16. # NETWORK INFORMATION
    17. NETWORK --BOOTPROTO=DHCP --DEVICE=ENO16777728 --ONBOOT=OFF --IPV6=AUTO
    18. NETWORK --HOSTNAME=LOCALHOST.LOCALDOMAIN
    19. # ROOT PASSWORD
    20. ROOTPW --ISCRYPTED $6$PDJJF42G8C6PL069$II.PX/YFAQPO0ENW2PA7MOMKJLYOAE2ZJMZ2UZJ7BH3UO4OWTR1.WK/HXZ3XIGMZGJPCS/MGPYSSOI8HPCT8B/
    21. # SYSTEM TIMEZONE
    22. TIMEZONE AMERICA/NEW_YORK --ISUTC
    23. USER --NAME=LINUXPROBE --PASSWORD=$6$A9V3INSTNBWEIR7D$JEGFYWBCDOOOKJ9SODECCDO.ZLF4OSH2AZ2SS2R05B6LZ2A0V2K.RJWSBALL2FEKQVGF640OA/TOK6J.7GUTO/ --ISCRYPTED --GECOS="LINUXPROBE"
    24. # X WINDOW SYSTEM CONFIGURATION INFORMATION
    25. XCONFIG --STARTXONBOOT
    26. # SYSTEM BOOTLOADER CONFIGURATION
    27. BOOTLOADER --LOCATION=MBR --BOOT-DRIVE=SDA
    28. AUTOPART --TYPE=LVM
    29. # PARTITION CLEARING INFORMATION
    30. CLEARPART --NONE --INITLABEL
    31.  
    32. %PACKAGES
    33. @BASE
    34. @CORE
    35. @DESKTOP-DEBUGGING
    36. @DIAL-UP
    37. @FONTS
    38. @GNOME-DESKTOP
    39. @GUEST-AGENTS
    40. @GUEST-DESKTOP-AGENTS
    41. @INPUT-METHODS
    42. @INTERNET-BROWSER
    43. @MULTIMEDIA
    44. @PRINT-CLIENT
    45. @X11
    46.  
    47. %END

    6.wc命令

    wc命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。

    每次我在课堂上讲到这个命令时,总有同学会联想到一种公共设施,其实这两者毫无关联。Linux系统中的wc命令用于统计文本的行数、字数、字节数等。如果为了方便自己记住这个命令的作用,也可以联想到上厕所时好无聊,无聊到数完了手中的如厕读物上有多少行字。wc的参数以及相应的作用如表2-10所示。

    表2-10 wc的参数以及作用

    参数作用
    -l只显示行数
    -w只显示单词数
    -c只显示字节数

    在Linux系统中,passwd是用于保存系统账户信息的文件,要统计当前系统中有多少个用户,可以使用下面的命令来进行查询,是不是很神奇:

    1. [root@linuxprobe ~]# wc -l /etc/passwd
    2. 38 /etc/passwd

    7.stat命令

    stat命令用于查看文件的具体存储信息和时间等信息,格式为“stat 文件名称”。

    stat命令可以用于查看文件的存储信息和时间等信息,命令stat anaconda-ks.cfg会显示出文件的三种时间状态(已加粗):Access、Modify、Change。这三种时间的区别将在下面的touch命令中详细详解:

    1. [root@linuxprobe ~]# stat anaconda-ks.cfg
    2. File: anaconda-ks.cfg
    3. Size: 1213 Blocks: 8 IO Block: 4096 regular file
    4. Device: fd00h/64768d Inode: 68912908 Links: 1
    5. Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
    6. Context: system_u:object_r:admin_home_t:s0
    7. Access: 2017-07-14 01:46:18.721255659 -0400
    8. Modify: 2017-05-04 15:44:36.916027026 -0400
    9. Change: 2017-05-04 15:44:36.916027026 -0400
    10. Birth: -

    8.cut命令

    cut命令用于按“列”提取文本字符,格式为“cut [参数] 文本”。

    在Linux系统中,如何准确地提取出最想要的数据,这也是我们应该重点学习的内容。一般而言,按基于“行”的方式来提取数据是比较简单的,只需要设置好要搜索的关键词即可。但是如果按列搜索,不仅要使用-f参数来设置需要看的列数,还需要使用-d参数来设置间隔符号。passwd在保存用户数据信息时,用户信息的每一项值之间是采用冒号来间隔的,接下来我们使用下述命令尝试提取出passwd文件中的用户名信息,即提取以冒号(:)为间隔符号的第一列内容:

    1. [root@linuxprobe ~]# head -n 2 /etc/passwd
    2. root:x:0:0:root:/root:/bin/bash
    3. bin:x:1:1:bin:/bin:/sbin/nologin
    4. [root@linuxprobe ~]# cut -d: -f1 /etc/passwd
    5. root
    6. bin
    7. daemon
    8. adm
    9. lp
    10. sync
    11. shutdown
    12. halt
    13. mail
    14. operator
    15. games
    16. ftp
    17. nobody
    18. dbus
    19. polkitd
    20. unbound
    21. colord
    22. usbmuxd
    23. avahi
    24. avahi-autoipd
    25. libstoragemgmt
    26. saslauth
    27. qemu
    28. rpc
    29. rpcuser
    30. nfsnobody
    31. rtkit
    32. radvd
    33. ntp
    34. chrony
    35. abrt
    36. pulse
    37. gdm
    38. gnome-initial-setup
    39. postfix
    40. sshd
    41. tcpdump
    42. linuxprobe

    9.diff命令

    diff命令用于比较多个文本文件的差异,格式为“diff [参数] 文件”。

    在使用diff命令时,不仅可以使用—brief参数来确认两个文件是否不同,还可以使用-c参数来详细比较出多个文件的差异之处,这绝对是判断文件是否被篡改的有力神器。例如,先使用cat命令分别查看diff_A.txt和diff_B.txt文件的内容,然后进行比较:

    1. [root@linuxprobe ~]# cat diff_A.txt
    2. Welcome to linuxprobe.com
    3. Red Hat certified
    4. Free Linux Lessons
    5. Professional guidance
    6. Linux Course
    7. [root@linuxprobe ~]# cat diff_B.txt
    8. Welcome tooo linuxprobe.com
    9.  
    10. Red Hat certified
    11. Free Linux LeSSonS
    12. ////////.....////////
    13. Professional guidance
    14. Linux Course

    接下来使用diff —brief命令显示比较后的结果,判断文件是否相同:

    1. [root@linuxprobe ~]# diff --brief diff_A.txt diff_B.txt
    2. Files diff_A.txt and diff_B.txt differ

    最后使用带有-c参数的diff命令来描述文件内容具体的不同:

    1. [root@linuxprobe ~]# diff -c diff_A.txt diff_B.txt
    2. ** diff_A.txt 2017-08-30 18:07:45.230864626 +0800
    3. --- diff_B.txt 2017-08-30 18:08:52.203860389 +0800
    4. *******
    5. ** 1,5 **
    6. ! Welcome to linuxprobe.com
    7. Red Hat certified
    8. ! Free Linux Lessons
    9. Professional guidance
    10. Linux Course
    11. --- 1,7 ----
    12. ! Welcome tooo linuxprobe.com
    13. !
    14. Red Hat certified
    15. ! Free Linux LeSSonS
    16. ! ////////.....////////
    17. Professional guidance
    18. Linux Course