Linux文本处理工具之grep、egrep和fgrep

一、基本概念

正在表达式:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

grep(global search regular expression(RE) and print out the line):文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行(可以看成一个文本过滤器)

egrep:使用扩展正则表达来构建模式,即grep -E

fgrep: fast, 不解析正则表达式,即grep –F

元字符:不表示字符本身的意义,用于额外功能性的描述

二、grep的使用方式

格式:

grep [OPTIONS] PATTERN [FILE...]

eg.# grep "root" /etc/passwd

常用选项:

-E:使用扩展正则表达来构建模式

-F:使用不解析正则表达式构建模式

-i:不区分字符大小写, ignore-case

-v:反向,显示不能被模式所匹配到的行

-o:仅显示被模式匹配到的字串,而非整行

-A #:匹配到的行和它下面的#行

-B #:匹配到的行和它上面的#行

-C #:匹配到的行和紧挨着它的#行

--color:指定被模式匹配到字符的颜色,参数选项有never,always和auto

标准正在表达式的元字符:
1、字符匹配:

.:任意单个字符

[[email protected] ~]# grep --color=auto "ro.t" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[]:指定范围内的任意单个字符

[0-9], [[:digit:]]:数字字符
[a-z], [[:lower:]]:小写字符
[A-Z], [[:upper:]]:大写字符
[[:alpha:]]:大小写字符
[[:alnum:]]:数字和大小写字符
[[:space:]]:空白字符
[[:punct:]]:标点符号字符

[^]:指定范围外的任意单个字符

2、次数匹配:用来指定匹配其前面的字符的次数

*:前面的字符任意次

注:*前字符的任意次

.*:匹配任意长度的任意字符

\?:前面的字符0次或1次

注:grep模式采用贪婪模式,即尽可能的长的去匹配字符;

\{m\}:匹配m次

\{m,n\}:匹配最少m次,最多n次

\{m,\}:至少m次;

\{0,n\}:至多n次;

3、位置锚定:用于指定字符出现的位置

^:锚定行首

eg. ^Char

$: 锚定行尾

eg. char$

^$:空白行

\<char:锚定词首,\bchar

char\>:锚定词尾,char\b

4、分组:

\(\)

eg. \(ab\)*xy

引用:

\1:后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式所匹配到的内容

\2:后向引用,引用前面的第二个左括号以及与之对应的右括号中的模式所匹配到的内容

...

eg. \(a.b\)xy\1: a6bxya6b

注:匹配那一次刚好匹配的引用,前后字符串一模一样

标准正在表达式的元字符:

字符匹配:

.:任意单个字符

[]:指定范围内的任意单个字符

[^]:指定范围外的任意单个字符

次数匹配:

*:匹配其前面的字符任意次;

?:匹配其前面的字符0或1次;

+:匹配其前面的字符至少1次

{m}:匹配其前面的字符m次;

{m,n}:匹配其前面的字符至少m次,至多n次

{m,}:匹配其前面的字符至少m次;

{0,n}:匹配其前面的字符至多n次;

锚定:

^:行首

$:行尾

\<, \b:词首

\>, \b:词尾

分组:

():分组

|:或者, ac|bc,表示ac或bc,或者整个字符串

eg. grep -E "con(C|c)at"

conC或cat

conCat或concat

三、强化练习

实验环境:

硬件:Thinkpad T430 I5-3320M 4GB RAM 500GB HDD

虚拟机:10.0.2 build-1744117

操作系统:CentOS 6.5

1、显示/proc/meminfo文件中以大小写s开头的行;

# grep "^[sS]" /proc/meminfo

2、取出默认shell为非bash的用户;

# grep -v "bash$" /etc/passwd | cut -d: -f1

3、取出默认shell为bash的且其ID号最大的用户;

# grep "bash$" /etc/passwd | sort -n -t: -k3 | tail -1 | cut -d: -f1

4、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit

5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

# grep "^[[:space:]]\{1,\}[^[:space:]]\{1,\}" /boot/grub/grub.conf

6、找出/etc/passwd文件中一位数或两位数;

# grep --color=auto "\<[0-9]\{1,2\}\>" /etc/passwd

7、找出ifconfig命令结果中的1到255之间的整数;

# ifconfig | grep -E --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

8、查看当前系统上root用户的所有信息;

# grep "^root\>" /etc/passwd

9、添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户;

# grep --color=auto "^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd

10、找出netstat -tan命令执行的结果中以“LISTEN”或“ESTABLISHED”结尾的行;

# netstat -tan | grep -E --color=auto "(LISTEN|ESTABLISHED)[[:space:]]*$"

11、取出当前系统上所有用户的shell,要求:每种shell只显示一次,且按升序显示;

# cut -d: -f7 /etc/passwd | sort -u

12、写一个脚本,分别统计/etc/rc.d/rc.sysinit、/etc/init.d/functions和/etc/fstab文件中各自以#开头的行的行数,以及空白行的行数;

#!/bin/bash
for file in /etc/rc.d/rc.sysinit /etc/init.d/functions /etc/fstab;do
    bashline=`grep -E --color=auto "^#" $file | wc -l`
    spaceline=`grep -E "^#$" $file | wc -l`
    echo "$file has $bashline , $file has $spaceline"
done

13、写一个脚本,分别复制/etc/rc.d/rc.sysinit、/etc/init.d/functions和/etc/fstab文件至/tmp目录中,文件名为原名后跟上当前的日期组成; (例如第一个文件复制后的名称为/tmp/rc.sysinit-2-14-02-16;)

#!/bin/bash
for path in /etc/rc.d/rc.sysinit /etc/init.d/functions /etc/fstab;do
        fileName=`basename $path`
        cp $path /tmp/$fileName`date +-%y-%m-%d`
done

14、写一个脚本

显示当前系统上所有默认shell为bash的用户的用户名、UID以及其在/etc/passwd文件中的行号;

#!/bin/bash
cat -n /etc/passwd | grep --color=auto "bash$" | cut -d: -f1,3

挑战题:写一个模式,能匹配真正意义上的IP地址;(1.0.0.1--223.255.255.254)

#grep -E --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-2][0-3])\>(.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\>){2}.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-4])\>"

扩展:写一个脚本,判断用户输入的IP地址是否合法

#!/bin/bash
read -p "Enter a IP Address:" ipAddress
if [[ -n `echo $ipAddress | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-2][0-3])\>(.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\>){2}.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-4])\>"` ]];then
echo "This is a valid ip address!"
else
echo "This is a invalid ip address!"
fi
时间: 2024-08-27 10:27:13

Linux文本处理工具之grep、egrep和fgrep的相关文章

&nbsp; &nbsp; linux 中的文本处理工具,grep,egrep

一:grep与egrep简介:                    grep与egrep是在linux中对linux文本搜索用的比较多的一个工具.它结合正则表达式实现与模型匹配的行. 二:语法格式: grep [option]... 'PATTERN' FILE... 支持基本正则表达式                  egrep [option]... 'PATTERN' FILE...支持扩展正则表达式                  [option]常用的主要有:          

Linux 文本处理三剑客之grep &nbsp; egrep

Linux 文本处理三剑客之grep   egrep grep: Global search REgular expression andPrint out the line. 作用:文本搜索工具,根据用户指定的"模式(pattern)"逐行去搜索目标文本,打印匹配到的行. 模式:由正则表达式的元字符及文本字符所编写的过元字符,其中正则表达示分基本正则表达式,和扩展正则正则表达式2类 元字符不表示其字面意义,而用于表示通配或控制功能滤条件.元字符有下面一些 字符匹配: .:匹配任意单个

Linux文本处理工具之grep

文本处理三剑客之GREP 文本过滤工具:glob 用于实现bash中的文件名通配 通配符: *:任意长度的任意字符 ?:任意单个字符 [ ]:明确指明匹配范围内的单个字符 [abc]:abc中的任意一个 注:要匹配通配符本身,需要使用%转义 常用的字符集合表示法: [:alpha:]:任意字母 [:alnum:]:任意数字和字母 [:blank:]:任意空白字符 [:cntrl:]:任意控制字符 [:digit:]:任意数字 [:lower:]:任意小写字母 [:upper:]:任意大写字母 [

【Linux相识相知】文本处理工具之grep\egrep\fgrep及正则表达式

常说Linux上有文本处理的三剑客,grep.sed和awk,本文就grep做出详细的描述,并引出正则表达式. grep NAME:打印模式匹配的行 SYNOPISIS: grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] 常用选项: --color=auto:对匹配到的文本着色后进行高亮显示,默认已被别名alias grep='grep --color=auto' -i:忽略字符的大小

Linux文本处理工具grep

文件查看工具:cat 将[文件]或标准输入组合输出到标准输出. -A, --show-all                                  等于-vET -b, --number-nonblank                           对非空输出行编号 -e                                              等于-vE -E, --show-ends                                 在每行结

Linux文本处理工具——Grep

Grep简介 全名:Global search Regular expression and Print out the line. 功能:文本搜索工具,根据用户指定的文本模式(搜索条件)对目标文件进行逐行搜索,显示能匹配到的行. Linux的三大文本处理工具之一,可以说学好grep命令无疑是重要的,可以说学好grep也是不容易的,因为grep里面要用到最烦人的正则表达式. grep语法格式 grep [option]... 'PATTERN' FILE... [option]:表示可以跟选项,

linux文本处理工具

linux文本处理工具 1.Linux 文件系统上的特殊权限: SUID     SGID   Sticky 进程的安全上下文:(1)任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行去权限 (2)启动为进程后,其属主为发起者,属组为发起者所属的组 (3)进程访文件的权限,取决于进程的发起者 (a)  进程的发起者,同文件的属主:则应用文件属主权限                                            (b)  进程的发起者,属于文件属组:则

Linux文本处理三剑客之grep一族与正则表达式

一,grep一族是什么? Linux上有三种常用的文本处理工具,分别为:grep(egrep.fgrep).sed.awk.这三者被称为Linux文本处理三剑客. grep一族:文本搜索工具 grep:支持使用基本正则表达式: egrep:支持使用扩展正则表达式,相当于grep -E: fgrep:不支持使用正则表达式,相当于grep -F; [PS:fgrep不需要加载正则表达式引擎,因此速度较快,fgrep的搜索效率在当文件达到几亿行时就能体现出来.(大型web网站一天的日志量都是几亿行的,

文本处理工具之一grep命令详解

grep(Globel Search Regular Expression and Printing out the line)全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,是一个对行进行操作的搜索工作,它能使用正则表达式搜索文本,并把匹配的行打印出来.Unix的grep家族包括grep.egrep和fgrep. egrep表示扩展的grep,相比grep支持更多的元字符,"grep -E"相当于egrep.fgrep是fast grep,不支持元字符,但是搜索速度更快.