# 本章练习

# 情景题 1

情景模拟题:通过 grep 搜索特殊字符串,并配合数据流重导向来处理大量的文件搜索问题

  • 目标:正确使用正则表示法
  • 前提:需要了解数据流重导向,以及通过子指令 ${command} 来处理文件名的搜索

搜索 * 号来处理下面的任务

  1. 利用正则表示法找出系统中含有某些特殊关键词的文件

    找出 /etc 下含有星号的文件与内容,

    解决方法必须搭配通配符,但是星号本身就是正则表示法中特殊字符

    # 需要记得 2> /dev/null 表示的是,标准输出错误 不显示在屏幕上
    # 由于该条命令只能搜索文件内容,而不能对目录进行搜索,遇到目录会报错
    [mrcode@study testpw]$ grep '\*' /etc/* 2> /dev/null
    
    1
    2
    3

    上述指令只能寻找 /etc 层级下的文件,而不能让子目录下的文件也被搜索到

    # 使用子命令找到 /etc/ 下包含子目录的所有文件
    grep '\*' $(find /etc/ type f) 2> /dev/null
    
    # 可以使用 -l 只列符合条件的文件名
    grep -l '\*' $(find /etc/ type f) 2> /dev/null
    
    1
    2
    3
    4
    5
  2. 如果文件数量太多,如找的是全系统 ( / )

    [mrcode@study testpw]$ grep '\*' $(find / type f 2> /dev/null)
    -bash: /usr/bin/grep: 参数列表过长
    # 指令内容长度是有限制的,可以通过管线命令以及 xargs 来处理
    # 1. 先用 find 找出文件
    # 2. 用 xargs 将这些文件每次只给 10 个给 grep 作为参数
    # 3. grep 开始搜索文件内容
    find / -type f 2> /dev/null | xargs -n 10 grep '\*'
    
    1
    2
    3
    4
    5
    6
    7
  3. 从输出的结果看,数据量很大,只需要知道文件名的话,同样可以使用 grep -l 参数

# 情景模拟 2

使用年限命令配合正则表示法建立新指令与新变量。想要建立一个新的指令名为:myip,这个指令能将我系统的 IP 找出来显示。新变量名为 MYIP,该变量可以记录我的 IP

处理格式很简单,可以这样试试看:

  1. 首先,使用 ifconfig、sed 与 awk 来取得我们的 IP

    # 这里就是将 ip 前的文字和 ip 后的文字使用 sed 替换成空
    # 注意这里的开头和结尾 .* 表示任意字符出现 0 次多次
    [mrcode@study testpw]$ ifconfig enp0s3 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'
    192.168.4.223
    
    1
    2
    3
    4
  2. 将此命令使用 alias 指定为 myip

    [mrcode@study testpw]$ alias myip="ifconfig enp0s3 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'"
    
    1
  3. 最终,通过变量设置

    [mrcode@study testpw]$ MYIP=$(myip)
    [mrcode@study testpw]$ echo ${MYIP}
    192.168.4.223
    
    1
    2
    3
  4. 将别名永久生效,需要将 alias 与 MYIP 的设置写入你的 ~/.bashrc 文件中

# 简答题

  1. 在 /etc 下,含有 XYZ 三个字符的任何一个字符的文件就列出来

    grep -l [XYZ] /etc/* 2> /dev/null
    
    1
  2. 将 /etc/kdump.conf 内容取出后

    1. 去除开头为 # 号的行
    2. 去除空白行
    3. 取出开头为英文字母的行
    4. 统计总行数
    
    [mrcode@study ~]$ grep -v '^#' /etc/kdump.conf | grep -v '^$' | wc -l
    2
    
    1
    2
    3
    4
    5
    6
    7

中文维基百科 ASCII:https://zh.wikipedia.org/w/index.php?title=ASCII