一、Linux文本处理三剑客

linux上主要处理文件的工具主要有grep家族(grep,egrep,fgrep)、awk、sed

grep:文本搜索工具;根据给定的”pattern“对文本进行搜索

sed:主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作

awk:是一个强大的文本分析工具

二、文本查找工具grep

grep:(Globally search a Regular Expression and Print);

作用:文本搜索工具,根据用户所指定的pattern(过滤条件)对目标文本逐行进行匹配查;                打印出符合条件的行;grep支持正则表达式,正则表达式一般趋向于最大长度匹配,也就是                所谓的贪婪模式。

正则表达式:Regular Expression

正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,可以让用户轻易达     到查找、删除、替换某特定字符串的处理程序

分类:

基本正则表达式:BRE Basic Regular Expression

扩展正则表达式:ERE  Expand Regular Expression

grep家族:

grep:  支持使用基本正则表达式

egrep:支持使用扩展正则表达式

fgrep:不支持使用正则表达式

二grep命令的主要参数:

grep  [OPTIONS]  PATTERN  [FILE...]

PATTERN是过滤的条件,可以理解为我们想要找到的内容。

常用选项:

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

[root@localhost ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'

# alias是查看系统中的有哪些命令被替换了;如果不需要命令替换可以使用unalias NAME 删除替换。

-i:忽略字符大小写

[root@localhost ~]# grep "oot" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin

# 可以看出只要包含pattern,也就是oot的行都会被匹配到,这一特性就是正则表达式的贪婪模式。

-o:仅显示匹配 到的文本自身

[root@localhost ~]# grep -o "oot" /etc/passwd
oot
oot
oot
oot
oot
oot

# -o选项列出所有匹配pattern中的内容,而不是行!

-v, --invert-match:反向匹配

[root@localhost ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes[root@localhost ~]# grep -v "E" /etc/default/useradd
# useradd defaults file
GROUP=100

-E:支持扩展的正则表达式

# grep -e=egrep

-q, --quiet, --silient:静默模式,不输出任何信息

[root@localhost ~]# grep -q "O" /etc/default/useradd
[root@localhost ~]# echo $?
0
[root@localhost ~]# grep -q "OOO" /etc/default/useradd
[root@localhost ~]# echo $?
1

# grep 静默模式不会有信息打印到屏幕上,但是我们可以通过执行结果得知grep是否匹配到。通过echo "$?" 显示出上个命令执行结果,0表示上条命令执行成功,1表示失败。

-P  支持使用prel正则表达式

-e  PATTERN 进行多模式匹配

[root@localhost ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yesgrep -e "HO" -e "RO" /etc/default/useradd
GROUP=100
HOME=/home

匹配上下文:

-A NUM 连同后面#行显示 #为非负整数

[root@localhost ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes[root@localhost ~]# grep -A 2 "IN" /etc/default/useradd
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash

-B NUM 连同前面#行显示 #为非负整数

[root@localhost ~]# grep -B 2 "IN" /etc/default/useradd
GROUP=100
HOME=/home
INACTIVE=-1

-C NUM 连同前后#行一起显示 #为非负整数

[root@localhost ~]# grep -C 2 "IN" /etc/default/useradd
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash

三、基本正则表达式 :

①字符匹配:

.:匹配任意单个字符

[root@localhost ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes[root@localhost ~]# grep "M" /etc/default/useradd
HOME=/home
CREATE_MAIL_SPOOL=yes[root@localhost ~]# grep "M..L" /etc/default/useradd
CREATE_MAIL_SPOOL=yes

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

[root@localhost ~]# grep "[MS]" /etc/default/useradd
HOME=/home
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

^ :匹配范围外的任意单个字符

[root@localhost ~]# grep "^[MS]" /etc/default/useradd
SHELL=/bin/bash
SKEL=/etc/skel

[:digit:]:所有数字

[root@localhost ~]# grep "[[:digit:]]" /etc/default/useradd
GROUP=100
INACTIVE=-1

[:lower:]:所有小写字母

[root@localhost ~]# grep "[[:lower:]]" /etc/default/useradd
# useradd defaults file
HOME=/home
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[:upper:]:所有大写字母

[root@localhost ~]# grep "[[:upper:]]" /etc/default/useradd
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[:alpha:]:所有字母

[root@localhost mnt]# cat test
innode innode table innode table
superblock  ext2 exr3
83 82 5400 7200[root@localhost mnt]# grep "[[:alpha:]]" /mnt/test
innode innode table innode table
superblock  ext2 ext3

[:alnum:]:所有字母和数字

[root@localhost mnt]# grep "[[:alnum:]]" /mnt/test
innode innode table innode table
superblock  ext2 exr3
83 82 5400 7200

[:space:]:空白

[:blank:]:空格和TAB

[:punct:]:所有标点符号

②匹配次数: 非负整数

用限制其前面的字符要出现的次数;默认工作于贪婪模式(只要找到符合的内容整行显示出来);

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

[root@localhost mnt]# cat test3
c
abcd
acccd
bccca[root@localhost mnt]# cat test3
c
abcd
acccd
bccca

#前面的字符可以0次,1次....N次

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

[root@localhost mnt]# grep "d\+" /mnt/test3
abcd
acccd

\?:匹配前面的0次或1次

[root@localhost mnt]# grep "d\?" /mnt/test3
c
abcd
acccd
bccca

\{m\}:其前面的字符出现m次

[root@localhost mnt]# grep "c\{3\}" /mnt/test3
acccd
bccca

\{m,n\}:其前面的字符出现m-n次 [m,n]

[root@localhost mnt]# grep "c\{1,3\}" /mnt/test3
c
abcd
acccd
bccca

\{0,n\}:出现0-n次

[root@localhost mnt]# grep "c\{0\}d" /mnt/test3
abcd
acccd

\{m,\}:至少出现m次

[root@localhost mnt]# grep "c\{3,\}d" /mnt/test3
acccd

③位置锚定

用来限制所匹配到的文本所出现在目标文本的位置。

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

[root@localhost mnt]# tail -6  /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
tom:x:1000:1000:mageedu:/home/mageedu:/bin/bash[root@localhost mnt]# tail -6  /etc/passwd | grep "^n"
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin

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

[root@localhost mnt]# tail -6  /etc/passwd | grep "n$"
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin

^PATTERN$:要让PATTERN完全匹配一整行

[root@localhost mnt]# cat  test4
root
root 123
root1234[root@localhost mnt]# grep "^root1234$" test4
root1234

^$:空行

[root@localhost mnt]# cat /etc/issue
\S
Kernel \r on an \m Welcome[root@localhost mnt]# grep -v "^$" /etc/issue
\S
Kernel \r on an \m
Welcome

# -v用来匹配pattern以外的内容 用来显示出空行 ,配合wc可以计算空白行的数量

^[[:space:]]*$ 用于使用^$查找不到空白行的情况

[root@localhost mnt]# cat  test4
rootroot 123root1234[root@localhost mnt]# grep "^$"  /mnt/test4 |wc -l
0[root@localhost mnt]# grep "^[[:space:]]*$"  /mnt/test4 |wc -l
2

\<或\b:词首锚定,用于限制匹配单词左侧,\<PATTERN, \bPATTERN

[root@localhost mnt]# grep "\<c" /etc/passwd
colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin
chrony:x:993:990::/var/lib/chrony:/sbin/nologin

\>或\b:词尾锚定,用于限制匹配单词右侧,PATTERN\>, PATTERN\b

[root@localhost mnt]# grep "S\>" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

\<PATTERN\>:单词锚定,精确匹配整个单词

[root@localhost mnt]# grep "\<root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

④分组与引用:

\(PATTERN\):将此PATTERN匹配到的字符当作一个整体,分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中

可以理解为一个括号对应一个变量,变量为$1,$2,$3.....

pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)

\1: \(pat2\)pat3\(pat4\(pat5\)pat6\)匹配到的结果

\2:\(pat4\(pat5\)pat6\)匹配到的结果

....

[root@localhost mnt]# grep "^\([[:alnum:]]\{1,\}\)\>.*\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

四、文本查找工具egrep :

支持使用扩展正则表达式的grep命令,相当于grep -E;使用的方法和grep基本上没什么不同,\除了词首锚定和词尾锚定都可以去除。

egrep [OPTIONS] PATTERN [FILE...]

①字符匹配:

.:匹配任意单个字符

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

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

[:digit:]:数字

[:lower:]:所有小写字母

[:upper:]:所有大写字母

[:alpha:]:所有字母

[:alnum:]:所有字母和数字

[:space:]:空白

[:blank:]:空格和TAB

[:punct:]:所有标点符号

②匹配次数:

用限制其前面的字符要出现的次数;默认工作于贪婪模式(只要找到符合的内容整行显示出来)

*:匹配前面的字符任意次(0,+∞)

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

?:匹配前面的0次或1次

{m}:其前面的字符出现m次,m为非负整数

{m,}:其前面的字符出现m次,m为非负整数[m,n]

③位置锚定

用来限制模式所匹配到的文本只能出现于目标文本的位置

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

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

^PATTERN$:要让PATTERN完全匹配一整行

^$:空行

^[[:space:]]*$

\<或\b:词首锚定,用于限定单词的左侧,\<PATTERN, \bPATTERN

\>或\b:词尾锚定,用于限定单词的右侧,PATTERN\>, PATTERN\b

\<PATTERN\>:单词锚定,精确匹配整个单词

④分组与引用:

(PATTERN):将此PATTERN匹配到的字符当作一个整体,分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部的变量中

可以理解为一个括号对应一个变量,变量为$1,$2,$3.....

a|b:a或者b

C|cat:表示C或cat

(C|c)at:表示Cat或cat

这里就用之前grep的例子作为比较

1.分组中\可以去掉

[root@localhost mnt]# egrep "^([[:alnum:]]{1,})\>.*\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

2.词首词尾的锚定\不能去掉

[root@localhost mnt]# egrep "\<root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3.查找UID大于1000的数字

[root@localhost mnt]# egrep -v "\<([0-9]|[1-9][0-9]|[1-9][0-9][0-9])\>" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

转载于:https://blog.51cto.com/protestor/1750515

Linux文本处理三剑客之grep相关推荐

  1. linux文本三剑客,Linux文本处理三剑客之grep

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配到的行打印出来. grep的全称是:Global Search Regular Expression and ...

  2. linux 删除所有a字符串,linux文本处理三剑客(grep、sed、akw)命令选项整理

    摘要:Linux中最重要的三个命令:awk,sed,grep,在业界被称为"三剑客". 1.grep和egrep(过滤器) grep: grep [选项][匹配条件][file1 ...

  3. linux 下 grep -c sh* /etc/passwd,Linux文本处理三剑客--grep

    稍微接触过linux都会知道有三个非常强大文本处理工具,那就是grep.sed和awk,想必都有听说过吧. Linux文本处理三剑客: grep, egrep, fgrep:文本过滤工具(模式:pat ...

  4. Linux文本处理三剑客之sed

    推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...

  5. linux文本处理工具之grep与正则表达式语法

    Grep 介绍 Linux 文本处理三剑客之一,文件过滤工具(另外两剑客为sed:文本编辑工具,awk:文本报告生成器) 拥有着,根据用户指定的"模式"对目标文本逐行进行匹配检查: ...

  6. linux创建文件内容三行,Linux 文本处理三剑客

    grep.awk.sed 是 linux 中进行文本处理的三大利器,称为 linux 三剑客.grep 适合单纯的文本查找和匹配,awk 适合用于格式化文本,sed 适合编辑匹配的文本. grep g ...

  7. Linux文本处理三剑客(awk、grep、sed)

    目录 grep 简介 实际使用 小结 sed awk 名字由来 强大的文本处理工具 语法 域 模式&动作 结合正则 复合表达式 printf 格式化输出 内置变量 内置函数 awk脚本 gre ...

  8. Linux中锚定符号的作用,Linux基础(9)文本处理三剑客之grep

    grep的作用:根据指定的模式搜索文本,将匹配到的文本行显示出来 语法格式:grep [options] "PATTERN" file PATTERN为正则表达式,grep一般是与 ...

  9. Linux基础(9)文本处理三剑客之grep

    grep的作用:根据指定的模式搜索文本,将匹配到的文本行显示出来 语法格式:grep [options] "PATTERN" file PATTERN为正则表达式,grep一般是与 ...

  10. 9、Linux文本处理三剑客之sed命令

    Linux 用于处理文本数据的三剑客,分别为 grep 命令.awk 命令和 sed 命令,再加上正则表达式,就可以处理文本文件中各种常见的数据需求了.一般来说,grep 命令倾向于查找,sed 命令 ...

最新文章

  1. CNN 的一些可视化方法!
  2. fdquery update
  3. HDOJ_2010_大二写_水仙花数
  4. Java web 三大框架异常学习总结
  5. python创建矩阵行向量_python矩阵和向量的转置问题
  6. 你了解VLSM多少(1)
  7. 编写java判断闰年_编写java程序判断闰年。
  8. C++字符串输入输出转换
  9. struts2 中的 addActionError 、addFieldError、addActionMessage方法的区别添加错误信息
  10. 学STM32(STM32F103RCT6)
  11. 微信表情存入mysql
  12. 运维工程师绩效考核表_IT运维绩效考核表
  13. 再见python你好julia_再见 Python 2,你好 Python 3
  14. centos大小写混乱问题
  15. RK3288 开发板 排插物理引脚对应图以及如何进入android6.0.1内核终端、uboot终端
  16. 不得不了解的HTTP协议
  17. javamail写邮件/邮箱验证报错javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection
  18. python轮子下载教程
  19. Springboot 系列(十二)使用 Mybatis 集成 pagehelper 分页插件和 mapper 插件
  20. ubuntu系统声音_Ubuntu Linux系统提示声音设置

热门文章

  1. openwrt设置DNS
  2. sai文字图层、钢笔图层如何转普通图层
  3. 微信浏览量服务器,微信uv和pv是什么?独立访客(UV)数据页面浏览数(PV)的关系
  4. C语言中char字符为0时的情况,c语言中char的用法
  5. Windows下NexusPHP搭建PT站过程
  6. 畅购商城项目v1-环境搭建
  7. 外包,你是外包,麻烦你不要偷吃公司零食,注意素质...
  8. 计算机的学情分析报告,计算机教学计划合集总结5篇
  9. 什么是软件测试吞吐量,在软件测试中吞吐量与TPS有什么区别与联系
  10. MPI + OpenMP实现快速排序