grep学习

要想使用好grep、sed、awk的各种功能,必须把正则表达式了解清楚。

正则表达式分为两类:

基本正则表达式:BRE

扩展正则表达式:ERE

基本正则表达式的元字符:

字符匹配:

.:  匹配任意单个字符;

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

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

[:digit:],[:upper:],[:lower:],[:alpha:],[:alnum:],[:space:],[:punct:]

匹配次数:用在要指定次数的字符后面,用于指定前面的字符出现的次数

*:匹配前面的字符任意次;(0次1次或多次)

例如:grep "x*y"

abxy

xay

xxxxxxxxxy

贪婪模式

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

\?:匹配其前面的字符0或1次;即前面的可有可无

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

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

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

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

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

位置锚定:

^:行首锚定:用于模式的最左侧;

$:行尾锚定:用于模式的最右侧;

^PATTERN$:用于模式匹配整行;

^$:空行;

^[[:apace:]]*$:这个空白可以没有,有任意个都算

\< 或 \b:词首锚定:用于单词模式的左侧;

\> 或 \b:词尾锚定:用于单词模式的右侧;

\<PATTERN\>:匹配整个单词;

分组:

\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;

# grep "\(xy\)\+" grep.txt

\(xy\)*ab

Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3,.....

\1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;

\(ab\+\(xy\)*\):

\1:ab\+\(xy\)*

\2:xy

反向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)

扩展正则表达式的元字符:

字符匹配:

.

[]

[^]

次数匹配:

*

?:0或1次

+:1次或多次

{m}:匹配m次

{m,n]:至少m,至多n次

锚定:

^

$

\<,\b

\>,\b

分组:

()

后向引用:\1,\2, ...

或者:

a|b

C|cat:C或cat

grep:

Linux上文处理三剑客

grep:文本过滤(模式:pattern)工具;

grep,egrep,fgrep

sed:stream editor,文本编辑工具;

awk:Linux上的实现gawk,文本报告生成器;

grep全称:Global search REgular expression and Print Out the line.



作用:文本搜索工具,根据用户指定的“模式”对目标文件逐行进行匹配检查:打印匹配到的行;

模式:由正则表达式字符及文本字符所编写的过滤条件;

REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能;

语法:

grep [OPTIONS] PATTERN [FILE...]

常用选项:

--color=auto:对匹配到的文本着色显示;

-v:显示不能够被pattern匹配到的行;

-i:忽略字符大小写;

-o:仅显示匹配到的字符串

-q:静默模式,不输出任何信息;(可用echo $?查看)

-A #:after,显示匹配的后#行

-B #:beforce,显示匹配的前#行

-C #:context,前后各#行

-E:使用ERE,支持扩展的正则表达式

-h:查询多文件时不显示文件名

-l:只列出符合匹配的文件名,而不列出具体的匹配行

-n:列出所有匹配的行,并显示行号

-s:不显示不存在或无匹配广西的错误信息

-c:只输出匹配行的数量

示例:

各种选项匹配:

[[email protected] ~]# grep root /etc/passwd              #不加任何参数,显示出匹配的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]# grep -v "root" /etc/passwd         #使用-v参数,显示所有不包括root的各行 
bin:x:1:1:bin:/bin:/sbin/nologin                  
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
......以下略
[[email protected] ~]# grep -i ROOT /etc/passwd           #使用-i参数,忽略大小写
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]# grep -o root /etc/passwd           #使用-o参数,仅显示匹配到的字符串
root
root
root
root
[[email protected] ~]# grep -A 2 root /etc/passwd         #使用-A参数,显示匹配的后2行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[[email protected] ~]# grep -B 2 root /etc/passwd         #使用-B参数,显示匹配的前2行
root:x:0:0:root:/root:/bin/bash
--
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]# grep -c root /etc/passwd           #使用-c参数,只显示出匹配行的行数
2
[[email protected] ~]# grep -n "root" /etc/passwd         #使用-n参数,显示满足匹配所有行行数
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin

扩展正则、或匹配:

[[email protected] tmp]# cat 12                   #查看12文件,abxy和root下面为空行
abxy

xay
xxxxxxy
root

#
#
[[email protected] tmp]# grep -n ^$ 12            #使用^$显示出空行所在行号
2:
6:
[[email protected] tmp]# grep -v ^$ 12            #排除空行的显示
abxy
xay
xxxxxxy
root
#
#
[[email protected] tmp]# grep -E -v "^$|\#" 12    #由于|是扩展正则,需要配合-E使用,排除空行和#的行
abxy
xay
xxxxxxy
root
[[email protected] ~]# grep -E "root|nologin" /etc/passwd    #由于|是扩展正则,需要配合-E使用,此行代表显示包含root或nologin的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
.....略

实际示例:

1、显示/proc/meminfo文件中以大小S开头的行;(要求:使用两种方式)

[[email protected] ~]# grep -i ‘^s‘ /proc/meminfo            #方法一,-i忽略大小写,^s以s为开头
[[email protected] ~]# grep -i ‘^s‘ /proc/meminfo            #方法二

2、显示/etc/passwd文件中不以/bin/bash结尾的行;

[[email protected] ~]# grep -v ‘/bin/bash$‘ /etc/passwd      #-v参数是排除包含关键字的行

3、显示/etc/passwd文件中ID号最大的用户的用户名;

[[email protected] ~]# sort -t: -k3 -n /etc/passwd             #-t:指定分隔符,-k3指定字段,-n以数值大小排序
[[email protected] ~]# sort -t: -k3 -n /etc/passwd | tail -1   #上面的命令把最大的排在最后,tail -1显示最后一条数据
bash:x:2019:2019::/home/bash:/bin/bash
[[email protected] ~]# sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1   #-d:指明分隔符,-f1指定字段
bash

4、如果用户root存在,显示其默认的shell程序;

[[email protected] ~]# grep "^root\>" /etc/passwd        #词首和词尾锚定匹配root
root:x:0:0:root:/root:/bin/bash
[[email protected] ~]# id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7    #id查找,如果root存储,就显示root的默认shell
/bin/bash

5、找出/etc/passwd中的两位或三位数

[[email protected] ~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd        #如果不使用\<,\>词首词尾锚定,就有可能会匹配4位中的3位。

6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行

[[email protected] ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

7、找出“netstat -tan”命令的结果中以‘LISTEN‘后跟0、1或多个空白字符结尾的行;

[[email protected] ~]# netstat -tan | grep "LISTEN[[:space:]]*$"      #空格后面的*$表示结尾有多个空格
[[email protected] ~]# netstat -tan | grep "LISTEN[[:space:]]*$"
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN

8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;

[[email protected] ~]# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd     #做分组中间可出现任意内容,结尾匹配行首
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:2019:2019::/home/bash:/bin/bash

9、显示当前系统root、centos或user1用户的默认shell和UID;

[[email protected] ~]# grep -E ‘^(root|centos|user)\>‘ /etc/passwd | cut -d: -f1,3,7  #(root|centos|user)这个属于扩展正则表达式,所以要使用egrep或grep -E
root:0:/bin/bash
centos:2008:/bin/bash

10、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行(C6上)

[[email protected] ~]# grep -E -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions
checkpid()
__pids_var_run()
__pids_pidof()
daemon()

11、使用echo输出一绝对路径,使用egrep取出其基名;(基名就是/etc/passwd passwd就是)

[[email protected] ~]# echo "/mnt/sdc" | grep -E "[^/]+$"           #行尾的字符串,[^/]除了/斜线的任意内容,+代表这个/至少出现1次
/mnt/sdc
[[email protected] ~]# echo "/mnt/sdc" | grep -E -o "[^/]+$"        #sdc是基名
sdc
# echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1   #以/作为分隔符,来取sdc
[[email protected] ~]# echo "/mnt/sdc/" | grep -E "[^/]+/?$"        #万一还带一个/,就用/?可有可无
/mnt/sdc/

进一步地:使用egrep取出路径的目录名,类似于dirname命令的结果

12、找出ifconfig命令结果中1-255之间的数值;

[[email protected] ~]# ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
192
168
2
127
....略

13、找出ifconfig命令结果中的IP地址

[[email protected] ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:E0:3C:EC  
          inet addr:192.168.88.66  Bcast:192.168.88.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fee0:3cec/64 Scope:Link
....略
[[email protected] ~]# ifconfig eth0 | grep "inet addr" | cut -d: -f 2|cut -d" " -f 1  #" "表示分隔符是空格
192.168.88.66
时间: 2024-08-08 16:02:47

grep学习的相关文章

linux grep学习整理

第一部分:补充 umask  遮罩码 目录权限为777-umask 用户为 666-umask       如果某一类用户的权限有执行权限,会自动加1 管理员的遮罩码为0022     普通用户的为0002 第二部分:文本处理工具 1.定义: Linux文件三个本地处理工具 A:grep 文本过滤工具 ,搜索工具 B:sed文件编辑工具 C:awk文本报告生成器 Grep :Global research regular expression and printing简写 根据用户指定的模式(p

grep学习笔记

grep        grep一般格式为: grep [选项]基本正则表达式[文件] 基本正则表达式可为字符串. grep常用选项:        -c    # 只输出匹配行的计数 -i    # 不区分大小写 -h    # 查询多文件时不显示文件名 -l    # 查询多文件时只输出包含匹配字符的文件名 -n    # 显示匹配行及行号 -s    # 不显示不存在或无匹配文本的错误信息 -v    # 反向查找 -e    # 使用正则表达式 -w    # 精确匹配 -o    #

grep 学习笔记

grep是UNIX和LINUX中使用最广泛的命令之一grep允许对文本文件进行模式查找.如果找到匹配模式,grep打印包含模式的所有行.grep支持基本正则表达式,也支持其扩展集. 测试文件datafile,如下 1.grep一般格式为:grep[选项]基本正则表达式[文件]这里基本正则表达式可为字符串. 2.在grep命令中输入字符串参数时,最好将其用双引号括起来.一是以防被误解为shell命令二是可以用来查找多个单词组成的字符串在调用变量时,也应该使用双引号 3.grep常用选项常用的gre

正则表达式grep学习(一)

文本处理三剑客grep       文本过滤sed       流过滤awk       格式处理 正则表达式就是一些特殊字符组成的模式,赋予了他特定的含义 在大多数程序里,正则表达式都被置于两个正斜杠之间:例如/l[o0]ve/就是由正斜杠界定的正则表达式,它将匹配被查找的行中任何位置出现的相同模式.在正则表达式中,元字符是最重要的概念. 正则表达式的作用: 在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量带有字符串的文本配置.程序.命令输出以及日志文件等,而我们经常会有迫切的

20145239 《信息安全系统设计基础》第1周学习总结

20145239 <信息安全系统设计基础>第1周学习总结 教材学习内容总结 常用快捷键 Ctrl+Alt+T: 打开终端 Ctrl+D: 键盘输入结束或退出终端 Ctrl+S: 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+C: 中断程序运行 Ctrl+Z: 将当前程序放到后台运行,恢复到前台为命令fg Ctrl+A: 将光标移至输入行头,相当于Home键 Ctrl+E: 将光标移至输入行末,相当于End键 Ctrl+K: 删除从光标所在位置到行末 Ctrl+Shift+T: 新建标签页

awk学习笔记【转】

Awk学习笔记 整理:Jims of 肥肥世家 <[email protected]> Copyright © 2004 本文遵从GPL协议,欢迎转载.修改.散布. 第一次发布时间:2004年8月6日 Table of Contents 1. awk简介 2. awk命令格式和选项 2.1. awk的语法有两种形式 2.2. 命令选项 3. 模式和操作 3.1. 模式 3.2. 操作 4. awk的环境变量 5. awk运算符 6. 记录和域 6.1. 记录 6.2. 域 6.3. 域分隔符

20145235《信息安全系统设计基础》第1周学习总结

 Linux系统 Linux通过进程.虚拟内存和文件三个重要抽象管理计算机的CPU.内存.I/O设备. Linux通过为用户提供shell,为程序员提供系统调用. shell:在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe.它接收用户命令,然后调用相应的应用程序. Ubuntu有几个快捷键: CTRL+ALT+T:打开终端,天天使用终端,用鼠标打开太低效了: CTRL+SHIFT+T:新建标

20165231 预习作业3 linux安装及学习

linux安装 由于以前稍微关注过虚拟机相关知识,所以大致知道虚拟机软件的相关知识.目前我已知的普遍使用的虚拟机软件是VMware Workstation(下文简称VM),VirtualBox(下文简称VB).其余的可能很多人用但是我没用过就不提了. 我也在VM和VB之间做过比较.VB开源,免费,且安装后体积较小,操作简单适合新手:VM功能强大,可以随时调整虚拟机的配置,完全隔离并保护主机与虚拟机的文件等,但是占用空间较大,且不免费需要破解(虽然破解不难但是本着支持正版维护版权,且后期遇到一些问

【转载 更新】Linux工具之AWK 2.基础知识

1. awk简介 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入.一个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本来使用.awk的处理文本和数据的方式是这样的,它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作.如果没有指定处理动作,则把匹配的行显示到标准输出(屏幕),如果没有指定模式,则所有被操作所指