Linux学习十七、正规表达式练习题
- 情境模拟题一:透过 grep 搜寻特殊字串,并配合数据流重导向来处理大量的文件搜寻问题。
- 目标:正确的使用正规表示法;
- 前提:需要了解数据流重导向,以及透过子命令 $(command) 来处理档名的搜寻;
我们简单的以搜寻星号 (*) 来处理底下的任务:
- 利用正规表示法找出系统中含有某些特殊关键字的文件,举例来说,找出在 /etc 底下含有星号 (*) 的文件与内容:
解决的方法必须要搭配万用字节,但是星号本身就是正规表示法的字符,因此需要如此进行:[root@www ~]# grep '\*' /etc/*
你必须要注意的是,在单引号内的星号是正规表示法的字符,但我们要找的是星号,因此需要加上跳脱字符 (\)。但是在 /etc/* 的那个 * 则是 bash 的万用字节! 代表的是文件的档名喔!不过由上述的这个结果中,我们仅能找到 /etc 底下第一层子目录的数据,无法找到次目录的数据, 如果想要连同完整的 /etc 次目录数据,就得要这样做:
[root@www ~]# grep '\*' $(find /etc -type f)
- 但如果文件数量太多呢?如同上述的案例,如果要找的是全系统 (/) 呢?你可以这样做:
[root@www ~]# grep '\*' $(find / -type f)
-bash: /bin/grep: Argument list too long真要命!由於命令列的内容长度是有限制的,因此当搜寻的对象是整个系统时,上述的命令会发生错误。那该如何是好? 此时我们可以透过管线命令以及 xargs 来处理。举例来说,让 grep 每次仅能处理 10 个档名,此时你可以这样想:
- 先用 find 去找出文件;
- 用 xargs 将这些文件每次丢 10 个给 grep 来作为参数处理;
- grep 实际开始搜寻文件内容。
所以整个作法就会变成这样:
[root@www ~]# find / -type f | xargs -n 10 grep '\*'
- 从输出的结果来看,数据量实在非常庞大!那如果我只是想要知道档名而已呢?你可以透过 grep 的功能来找到如下的参数!
[root@www ~]# find / -type f | xargs -n 10 grep -l '\*'
- 情境模拟题二:使用管线命令配合正规表示法创建新命令与新变量。我想要创建一个新的命令名为 myip , 这个命令能够将我系统的 IP 捉出来显示。而我想要有个新变量,变量名为 MYIP ,这个变量可以记录我的 IP 。
处理的方式很简单,我们可以这样试看看:- 首先,我们依据本章内的 ifconfig, sed 与 awk 来取得我们的 IP ,命令为:
[root@www ~]# ifconfig eth0 | grep 'inet addr' | \
> sed 's/^.*inet addr://g'| cut -d ' ' -f1 - 再来,我们可以将此命令利用 alias 指定为 myip 喔!如下所示:
[root@www ~]# alias myip="ifconfig eth0 | grep 'inet addr' | \
> sed 's/^.*inet addr://g'| cut -d ' ' -f1 " - 最终,我们可以透过变量配置来处理 MYIP 喔!
[root@www ~]# MYIP=$( myip )
- 如果每次登陆都要生效,可以将 alias 与 MYIP 的配置那两行,写入你的 ~/.bashrc 即可!
- 首先,我们依据本章内的 ifconfig, sed 与 awk 来取得我们的 IP ,命令为:
简答题部分:
- 我想要知道,在 /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学习8-正则表达式基础
正则表达式基础 实验介绍 虽然我们这一节的标题是正则表达式,但实际这一节实验只是介绍grep,sed,awk这三个命令,而正则表达式作为这三个命令的一种使用方式(命令输出中可以包含正则表达式).正则表 ...
- Linux学习之RPM包管理-yum管理(十七)
Linux学习之RPM包管理-yum管理 目录 IP地址配置 网络yum源 yum命令 光盘yum源搭建 IP地址配置 IP+子网掩码就可以在局域网(内网)使用. IP+子网掩码+网关+DNS就可以访 ...
- linux学习笔记【转】
学习计时:共24小时 读书:1小时 代码:8小时 作业:3小时 博客:12小时 一.学习目标 1. 能够独立安装Linux操作系统 2. 能够熟练使用Linux系统的基本命令 3. 熟练使用L ...
- Linux学习之CentOS(二十)------vi/vim 按键说明
vi/vim 按键说明 除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用. 第一部份:一般模式可用的光标移动.复制粘贴.搜索替换等 移动光标的方法 h 或 向左 ...
- deepin linux 学习笔记(二)——文本编辑器
目录 deepin linux 学习笔记(二)--文本编辑器 前言 nano 小巧的命令行编辑器 通用 编辑 定位 排版 配置 vim 思路独特的超级编辑器 命令模式 插入模式 底线模式(末行模式) ...
- Linux 学习笔记之超详细基础linux命令 Part 10
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 9----------------- ...
- xiaoluo同志Linux学习之CentOS6.4
小罗同志写的不错,弄个列表过来啊 Linux学习之CentOS(三十六)--FTP服务原理及vsfptd的安装.配置 xiaoluo501395377 2013-06-09 01:04 阅读:56 ...
- (转)Linux最常用指令及快捷键 Linux学习笔记
Linux最常用指令及快捷键 Linux学习笔记 原文:http://blog.csdn.net/yanghongche/article/details/50827478 [摘自 鸟叔的私房菜]--转 ...
- JAVA8学习——深入浅出Lambda表达式(学习过程)
JAVA8学习--深入浅出Lambda表达式(学习过程) lambda表达式: 我们为什么要用lambda表达式 在JAVA中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法. 在 ...
随机推荐
- WMI问题终极解决
1. 如果用JInterOp,先用这篇文章叙述的: http://m.oschina.net/blog/73163 2.另外开启这个: https://dev.c-ware.de/confluence ...
- QT多重继承的时候,要把QObject放在最前面,否则报错——C++认为人性本恶,默认都是私有的,这点和Delphi的世界观不一样
在买来的控件(没有源码)的基础上,想加入QObject的一些特性,不得不多继承: class MyProgress : public CProgress, public QObject 但总是报错: ...
- delete 多表删除的使用(连表删除)
delete 多表删除的使用 1.从数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉 DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或 DELETE ...
- Java缓存
Java中要用到缓存的地方很多,首当其冲的就是持久层缓存,针对持久层谈一下: 要实现java缓存有很多种方式,最简单的无非就是static HashMap,这个显然是基于内存缓存,一个map就可以搞定 ...
- Linux进程间通信——信号集函数
一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...
- 面向对象继承实例(a如何继承b)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- android 自定义圆形进度条
一.通过动画实现 定义res/anim/loading.xml如下: [html] view plain copy print ? <?xml version="1.0" ...
- php算法之快速排序
/** * 快速排序 * 原理: * 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). * 最差时间复杂度 O(n*n) * ...
- C++求二叉树的最大高度差
#include <iostream> #include <string.h> using namespace std; template<typename Type&g ...
- SOA架构有基本的要求
SOA在相对较粗的粒度上对应用服务或业务模块进行封装与重用: 服务间保持松散耦合,基于开放的标准, 服务的接口描述与具体实现无关: 灵活的架构 -服务的实现细节,服务的位置乃至服务请求的底层协议都应该 ...