Linux学习十七、正规表达式练习题
2016-12-01 00:00
225 查看
情境模拟题一:透过 grep 搜寻特殊字串,并配合数据流重导向来处理大量的文件搜寻问题。
目标:正确的使用正规表示法;
前提:需要了解数据流重导向,以及透过子命令 $(command) 来处理档名的搜寻;
我们简单的以搜寻星号 (*) 来处理底下的任务:
利用正规表示法找出系统中含有某些特殊关键字的文件,举例来说,找出在 /etc 底下含有星号 (*) 的文件与内容:
解决的方法必须要搭配万用字节,但是星号本身就是正规表示法的字符,因此需要如此进行:
你必须要注意的是,在单引号内的星号是正规表示法的字符,但我们要找的是星号,因此需要加上跳脱字符 (\)。但是在 /etc/* 的那个 * 则是 bash 的万用字节! 代表的是文件的档名喔!不过由上述的这个结果中,我们仅能找到 /etc 底下第一层子目录的数据,无法找到次目录的数据, 如果想要连同完整的 /etc 次目录数据,就得要这样做:
但如果文件数量太多呢?如同上述的案例,如果要找的是全系统 (/) 呢?你可以这样做:
真要命!由於命令列的内容长度是有限制的,因此当搜寻的对象是整个系统时,上述的命令会发生错误。那该如何是好? 此时我们可以透过管线命令以及 xargs 来处理。举例来说,让 grep 每次仅能处理 10 个档名,此时你可以这样想:
先用 find 去找出文件;
用 xargs 将这些文件每次丢 10 个给 grep 来作为参数处理;
grep 实际开始搜寻文件内容。
所以整个作法就会变成这样:
从输出的结果来看,数据量实在非常庞大!那如果我只是想要知道档名而已呢?你可以透过 grep 的功能来找到如下的参数!
情境模拟题二:使用管线命令配合正规表示法创建新命令与新变量。我想要创建一个新的命令名为 myip , 这个命令能够将我系统的 IP 捉出来显示。而我想要有个新变量,变量名为 MYIP ,这个变量可以记录我的 IP 。
处理的方式很简单,我们可以这样试看看:
首先,我们依据本章内的 ifconfig, sed 与 awk 来取得我们的 IP ,命令为:
再来,我们可以将此命令利用 alias 指定为 myip 喔!如下所示:
最终,我们可以透过变量配置来处理 MYIP 喔!
如果每次登陆都要生效,可以将 alias 与 MYIP 的配置那两行,写入你的 ~/.bashrc 即可!
简答题部分:
我想要知道,在 /etc 底下,只要含有 XYZ 三个字节的任何一个字节的那一行就列出来,要怎样进行?
grep [XYZ] /etc/*
将 /etc/termcap 内容取出后,(1)去除开头为 # 的行 (2)去除空白行 (3)取出开头为英文字母的那几行 (4)最终统计总行数该如何进行?
grep -v '^#' /etc/termcap | grep -v '^$' | grep '^[[:alpha:]]' | wc -l
或
grep -v '^[#$]' /etc/termcap | grep '^[a-zA-Z]' | wc -l
目标:正确的使用正规表示法;
前提:需要了解数据流重导向,以及透过子命令 $(command) 来处理档名的搜寻;
我们简单的以搜寻星号 (*) 来处理底下的任务:
利用正规表示法找出系统中含有某些特殊关键字的文件,举例来说,找出在 /etc 底下含有星号 (*) 的文件与内容:
解决的方法必须要搭配万用字节,但是星号本身就是正规表示法的字符,因此需要如此进行:
[root@www ~]# grep '\*' /etc/* |
[root@www ~]# grep '\*' $(find /etc -type f) |
[root@www ~]# grep '\*' $(find / -type f) -bash: /bin/grep: Argument list too long |
先用 find 去找出文件;
用 xargs 将这些文件每次丢 10 个给 grep 来作为参数处理;
grep 实际开始搜寻文件内容。
所以整个作法就会变成这样:
[root@www ~]# find / -type f | xargs -n 10 grep '\*' |
[root@www ~]# find / -type f | xargs -n 10 grep -l '\*' |
处理的方式很简单,我们可以这样试看看:
首先,我们依据本章内的 ifconfig, sed 与 awk 来取得我们的 IP ,命令为:
[root@www ~]# ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*inet addr://g'| cut -d ' ' -f1 |
[root@www ~]# alias myip="ifconfig eth0 | grep 'inet addr' | \ > sed 's/^.*inet addr://g'| cut -d ' ' -f1 " |
[root@www ~]# MYIP=$( myip ) |
简答题部分:
我想要知道,在 /etc 底下,只要含有 XYZ 三个字节的任何一个字节的那一行就列出来,要怎样进行?
grep [XYZ] /etc/*
将 /etc/termcap 内容取出后,(1)去除开头为 # 的行 (2)去除空白行 (3)取出开头为英文字母的那几行 (4)最终统计总行数该如何进行?
grep -v '^#' /etc/termcap | grep -v '^$' | grep '^[[:alpha:]]' | wc -l
或
grep -v '^[#$]' /etc/termcap | grep '^[a-zA-Z]' | wc -l
相关文章推荐
- Linux学习十七、正规表达式练习题
- Linux学习十七、正规表达式练习题
- Linux实践工程师学习笔记十七
- Linux Socket学习(十七)
- 【Linux学习笔记十七】Linux交换分区的创建和管理
- Linux学习笔记三:gvim中到跳转命令和部分正则表达式
- Vbird的Linux私房菜学习笔记之正则表达式-awk
- C# 学习笔记 -- 第六天 正规表达式
- Linux系统学习之正则表达式笔记
- 学习 Linux,101: 使用正则表达式搜索文本文件
- 【学习笔记——Linux】Linux正则表达式和文件格式化处理
- 鸟哥的 Linux 私房菜第12章-正规表示法与文件格式化处理 学习笔记
- java 正规表达式学习
- [linux学习笔记]第3天:变量分类,重定向,管道命令,程序执行流,文本处理类命令, 正则表达式,短路操作符
- 正规表达式学习日志摘要
- linux学习日记九 正则表达式介绍
- Linux实践工程师学习笔记十七
- Linux grep命令与正则表达式学习
- 正则表达式学习指南(十七)----Atomic Grouping
- Vbird的Linux私房菜学习笔记之正则表达式-grep