多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 11.6 本章习题 ( 要看答案请将鼠标移动到“答:”下面的空白处,按下左键圈选空白处即可察看 ) * 情境仿真题一:通过 grep 搜寻特殊字串,并配合数据流重导向来处理大量的文件搜寻问题。 * 目标:正确的使用正则表达式; * 前提:需要了解数据流重导向,以及通过子指令 $(command) 来处理文件名的搜寻; 我们简单的以搜寻星号 (*) 来处理下面的任务: 1. 利用正则表达式找出系统中含有某些特殊关键字的文件,举例来说,找出在 /etc 下面含有星号 (*) 的文件与内容: 解决的方法必须要搭配万用字符,但是星号本身就是正则表达式的字符,因此需要如此进行: ``` [dmtsai@study ~]$ grep '\*' /etc/* 2> /dev/null ``` 你必须要注意的是,在单引号内的星号是正则表达式的字符,但我们要找的是星号,因此需要加上跳脱字符 (\)。但是在 /etc/* 的那个 * 则是 bash 的万用字符! 代表的是文件的文件名喔!不过由上述的这个结果中,我们仅能找到 /etc 下面第一层子目录的数据,无法找到次目录的数据, 如果想要连同完整的 /etc 次目录数据,就得要这样做: ``` [dmtsai@study ~]$ grep '\*' $(find /etc -type f ) 2> /dev/null # 如果只想列出文件名而不要列出内容的话,使用下面的方式来处理即可喔! [dmtsai@study ~]$ grep -l '\*' $(find /etc -type f ) 2> /dev/null ``` 2. 但如果文件数量太多呢?如同上述的案例,如果要找的是全系统 (/) 呢?你可以这样做: ``` [dmtsai@study ~]$ grep '\*' $(find / -type f 2> /dev/null ) -bash: /usr/bin/grep: Argument list too long ``` 真要命!由于命令行的内容长度是有限制的,因此当搜寻的对象是整个系统时,上述的指令会发生错误。那该如何是好? 此时我们可以通过管线命令以及 xargs 来处理。举例来说,让 grep 每次仅能处理 10 个文件名,此时你可以这样想: 1. 先用 find 去找出文件; 2. 用 xargs 将这些文件每次丢 10 个给 grep 来作为参数处理; 3. grep 实际开始搜寻文件内容。 所以整个作法就会变成这样: ``` [dmtsai@study ~]$ find / -type f 2> /dev/null | xargs -n 10 grep '\*' ``` 3. 从输出的结果来看,数据量实在非常庞大!那如果我只是想要知道文件名而已呢?你可以通过 grep 的功能来找到如下的参数! ``` [dmtsai@study ~]$ find / -type f 2> /dev/null | xargs -n 10 grep -l '\*' ``` * 情境仿真题二:使用管线命令配合正则表达式创建新指令与新变量。我想要创建一个新的指令名为 myip , 这个指令能够将我系统的 IP 捉出来显示。而我想要有个新变量,变量名为 MYIP ,这个变量可以记录我的 IP 。 处理的方式很简单,我们可以这样试看看: 1. 首先,我们依据本章内的 ifconfig, sed 与 awk 来取得我们的 IP ,指令为: ``` [dmtsai@study ~]$ ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g'| sed 's/ *netmask.*$//g' ``` 2. 再来,我们可以将此指令利用 alias 指定为 myip 喔!如下所示: ``` [dmtsai@study ~]$ alias myip="ifconfig eth0 | grep 'inet ' | sed 's/^.*inet //g'| \ > sed 's/ *netmask.*$//g' ``` 3. 最终,我们可以通过变量设置来处理 MYIP 喔! ``` [dmtsai@study ~]$ MYIP=$( myip ) ``` 4. 如果每次登陆都要生效,可以将 alias 与 MYIP 的设置那两行,写入你的 ~/.bashrc 即可! * * * 简答题部分: * 我想要知道,在 /etc 下面,只要含有 XYZ 三个字符的任何一个字符的那一行就列出来,要怎样进行?grep [XYZ] /etc/* * 将 /etc/kdump.conf 内容取出后,(1)去除开头为 # 的行 (2)去除空白行 (3)取出开头为英文字母的那几行 (4)最终统计总行数该如何进行?grep -v '^#' /etc/kdump.conf | grep -v '^$' | grep '^[[:alpha:]]' | wc -l