返回顶部
首页 > 资讯 > 服务器 >Shell正则表达式之grep、sed、awk实操笔记
  • 923
分享到

Shell正则表达式之grep、sed、awk实操笔记

笔记正则表达式Shell 2022-06-04 21:06:11 923人浏览 薄情痞子
摘要

最近一直在研究shell脚本这块,刚好闲下来整了下自己手头上比较好的资料中的一些范例,以下是我整理的鸟哥私房菜里面正则表达式里面比较基础的一些语法详解,适合新手查阅。 首先先复制一段范例: # vi re

最近一直在研究shell脚本这块,刚好闲下来整了下自己手头上比较好的资料中的一些范例,以下是我整理的鸟哥私房菜里面正则表达式里面比较基础的一些语法详解,适合新手查阅。

首先先复制一段范例:

# vi regular_express.txt

-------------------------------

"Open Source" is a Good mechanism to develop programs.

apple is my favorite food.

Football game is not use feet only.

this dress doesn't fit me.

However, this dress is about $ 3183 dollars.

GNU is free air not free beer.

Her hair is very beauty.

I can't finish the test.

Oh! The soup taste good.

motorcycle is cheap than car.

This window is clear.

the symbol '*' is represented as start.

Oh!My god!

The gd software is a library for drafting programs.

You are the best is mean you are the no. 1.

The world <Happy> is the same with "glad".

I like dog.

google is the best tools for search keyWord.

goooooogle yes!

go! go! Let's go.

# I am VBird

--------------------------------

设置语系为C
#export LANG=C

grep

1.搜寻特定字符串"the"
注: n为显示行号

# grep -n 'the' regular_express.txt

2.反向搜寻特定字符串"the"

# grep -vn 'the' regular_express.txt

3.取得任意大小写"the"的这个字符串

# grep -in 'the' regular_express.txt

4.利用括号 [] 来搜寻集合字符
搜索test或taste这两个单词时,发现他们有共同的't?st',所以可以这么搜寻

# grep -n 't[ae]st' regular_express.txt

这样其实就是在找t[a]st和t[e]st这两个分开的字符
如果搜索有 oo 的字符时,则可以使用:
# grep -n 'oo' regular_express.txt

如果搜索oo时不想搜到 oo 前面有 g 的话,我们可以利用反向选择[^]来达成:
# grep -n '[^g]oo'  regular_express.txt

如果搜索oo前面不想有小写字符,则:
# grep -n '[^a-z]oo' regular_express.txt

注: 大写英文/小写英文/数字 可以使用 [a-z]/[A-Z]/[0-9]等方式来书写,也可以写在一起
[a-zA-Z0-9]表示要求字符串是数字以及英文
如果我们要取得有数字的那行,则:
# grep -n '[0-9]' regular_express.txt

注:但考虑到语系对编码顺序的影响,因此除了连续编码使用减号[-]外,也可以用[:lower:]代替a-z 以及 [:digit:] 代替0-9 使用
# grep -n '[^[:lower:]]oo' regular_express.txt

# grep -n '[[:digit:]]' regular_express.txt

5.显示行首为'the'的字符串

# grep -n '^the' regular_express.txt

显示行首是小写字符
# grep -n '^[a-z]' regular_express.txt

6.显示行尾为点 . 的那一行

# grep -n '.$' regular_express.txt

7.显示5-9行数据

# cat -An regular_express.txt |head -n 10 |tail -n 6

8.显示空白行

# grep -n '^$' regular_express.txt

9.找出g??d字符串,起头g结束d的四个字符串

# grep -n 'g..d' regular_express.txt

10. o*代表空字符(就是有没有字符都可以)或者一个到N个o字符,所以grep -n 'o*' regular_express.txt就会把所有行全部打印出来,
11.oo*代表o+空字符或者一个到N个o字符,所以grep -n 'oo*' regular_express.txt就会把o,oo,ooo等的行全部打印出来
12."goo*g"代表gog,goog,gooog...等

# grep -n 'goo*g' regular_express.txt

13.找出含g...g字符串的行
注: .代表任意字符, .*则就代表空字符或者一个到N个任意字符

# grep -n 'g.*g' regular_express.txt

14.找出含有数字的行

# grep -n '[0-9][0-9]*' regular_express.txt

或# grep -n '[0-9]' regular_express.txt

15.找出含两个o的字符串
注:{}因为在shell里有特殊意义,所以需要加跳脱符来让其失去意义

# grep -n 'o{2}'  regular_express.txt

找出g后含2到5个o然后以g结尾的字符串
# grep -n 'go{2,5}g'  regular_express.txt

找出g后含2以上的o然后以g结尾的字符串
# grep -n 'go{2,}g'  regular_express.txt

总结
^word 表示带搜寻的字符串(word)在行首
word$ 表示带搜寻的字符串(word)在行尾
. 表示1个任意字符
表示转义字符,在特殊字符前加会将原本的特殊字符意义去除
* 表示重复0到无穷多个前一个RE(正则表达式)字符
[list] 表示搜索含有list的字符串
[n1-n2] 表示搜索指定的字符串范围,例如[0-9] [a-z] [A-Z]等
[^list] 表示反向字符串的范围,例如[0-9]表示非数字字符,[A-Z]表示非大写字符范围
{n,m} 表示找出n到m个前一个RE字符
{n,} 表示n个以上的前一个RE字符
egrep总结:
+ 表示重复一个或一个以上的前一个RE字符
范例:egrep 'go+d' regular_express.txt
表示搜寻(god)(good)(goood)...等等字符串,o+代表[一个以上的o]
? 表示重复零个或一个的前一个RE字符
范例:egrep 'go?d' regular_express.txt
表示搜寻(gd)(god)字符串,o?代表[空的或1个o]
注:egrep下'go+d'和'go?d'的结果集合就等于grep下的'go*d'
| 表示用或(or)的方式找出数个字符串
范例:egrep 'gd|good|dog' regular_express.txt
表示搜寻(gd)或(god)或(god)字符串,|代表或
() 表示找出群组字符串
范例:egrep 'g(la|oo)d' regular_express.txt
表示搜寻(glad)或(good)字符串
() +表示找出多个重复群组的判别
范例: echo 'AxyzxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
表示搜寻开头是A结尾是C,中间有一个以上的'xyz'字符串

sed:

插入:

1.将/etc/passwd 的内容列出并打印行号,同时,将2-5行删除显示

# nl /etc/passwd | sed '2,5d'

注: sed是sed -e的简写, 后接单引号
同上删除第2行
# nl /etc/passwd | sed '2d'

同上删除第三行到最后一行
# nl /etc/passwd | sed '3,$d'

2.在第二行后加上一行test

# nl /etc/passwd | sed '2a test'

在第二行前加上一行test
# nl /etc/passwd | sed '2i test'

在第二行后加入两行test
# nl /etc/passwd | sed '2a test 

> test'

替换行:

3.将2-5行内容取代为 No 2-5 number

# nl /etc/passwd | sed '2,5c No 2-5 number'

4 列出/etc/passwd 内第5-7行

# nl /etc/passwd |sed -n '5,7p'

替换字符串:

sed 's/被替换字符串/新字符串/g'

1.获取本机IP的行

# /sbin/ifconfig eth0 |grep 'inet addr'

将IP前面的部分予以删除
# /sbin/ifconfig eth0 |grep 'inet addr'| sed 's/^.*addr://g'

将IP后面的部分删除
# /sbin/ifconfig eth0 |grep 'inet addr'| sed 's/^.*addr://g'| sed 's/Bcast:.*$//g'

-------------------

192.168.100.74

-------------------

2.用grep将关键词MAN所在行取出来

# cat /etc/man.config |grep 'MAN'

删除批注行
# cat /etc/man.config |grep 'MAN'| sed 's/^#.*$//g'

删除空白行
# cat /etc/man.config |grep 'MAN'| sed 's/^#.*$//g'| sed '/^$/d'

3.利用sed将regular_express.txt内每一行若为.的换成!
注:-i参数会直接修改文本,而并非直接输出

# sed -i 's/.*.$/!/g' regular_express.txt

4.利用sed在文本最后一行加入 #This is a test
注: $代表最后一行 a代表行后添加

# sed -i '$a #This is a test' regular_express.txt

将selinux配置文件enforcing改成disabled
# sed -i '6,6c SELINUX=disabled' /etc/selinux/config

延伸正规表示法:
# grep -v '^$' regular_express.txt |grep -v '^#'

延伸写法:
# egrep -v '^$'|'^#' regular_express.txt

1. +表示重复一个或一个以上的前一个RE字符

例如:egrep -n 'go+d' regular_express.txt
普通写法: grep -n 'goo*d' regular_express.txt

2. ?表示重复零个或一个前一个RE字符

例如: egrep -n 'go?d' regular_express.txt

3. |表示用或的方式找出数个字符串

例如: egrep -n 'gd|good' regular_express.txt

4. ()表示找出群组字符串

例如: egrep -n 'g(la|oo)d' regular_express.txt
也就是搜寻(glad)或good这两个字符串

5. ()+多个重复群组判别

例如: echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C'

也就是要找开头是A结尾是C 中间有一个以上的'xyz'字符串的意思

awk:

1.用last取出登陆数据前五行

# last -n 5

取出账号与登陆者IP,且账号与IP之间以TAB隔开
# last -n 5 |awk '{print $1 "t" $3}'

注:$1代表用空格或TAB隔开的第一个字段,以此类推。。
$0代表该行全部字段
# last -n 5 |awk '{print $1 "t lines:" NR "t columes:" NF}'

注: NF代表每一行的$0的字段总数
NR代表目前awk所处的是第几行数据
FS代表目标分隔符,默认为空格

2.在/etc/passwd中以:来作为分段字符,则我们要查阅第三栏小于10以下的数据,并只列出账号与第三栏

# cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "t t"$3}'

注:查询结果未显示第一行数据,是因为我们虽然定义了FS=":" 但却只能在第二行生效
想读取第一行就需要BEGIN这个关键词:
# cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10 {print $1 "t t"$3}'

df:
比较两个文件的差异:

# diff /etc/rc3.d/ /etc/rc5.d/

-------------------

Only in /etc/rc3.d/: K30spice-vdagentd

Only in /etc/rc5.d/: S70spice-vdagentd

-------------------

实例:
1。统计tcp连接状态

# netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

/^tcp/

过滤出以tcp开头的行,“^”为正则表达式用法,以...开头,这里是过滤出以tcp开头的行。
S[]
定义了一个名叫S的数组,在awk中,数组下标通常从 1 开始,而不是 0。
NF
当前记录里域个数,默认以空格分隔,如上所示的记录,NF域个数等于
$NF
表示一行的最后一个域的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是SYN_RECV或TIME_WAIT等。
S[$NF]
表示数组元素的值,如上所示的记录,就是S[TIME_WAIT]状态的连接数
++S[$NF]
表示把某个数加一,如上所示的记录,就是把S[TIME_WAIT]状态的连接数加一
结果就是显示S数组中最终的数组值
例:S[TIME_WAIT]=最终值 S[TESTABLISHED]=最终值
END
for(key in S)
遍历S[]数组
print key,”t”,S[key]
打印数组的键和值,中间用t制表符分割,显示好一些。

--结束END--

本文标题: Shell正则表达式之grep、sed、awk实操笔记

本文链接: https://lsjlt.com/news/18222.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Shell正则表达式之grep、sed、awk实操笔记
    最近一直在研究shell脚本这块,刚好闲下来整了下自己手头上比较好的资料中的一些范例,以下是我整理的鸟哥私房菜里面正则表达式里面比较基础的一些语法详解,适合新手查阅。 首先先复制一段范例: # vi re...
    99+
    2022-06-04
    笔记 正则表达式 Shell
  • Shell正则表达式中grep、sed、awk怎么用
    这篇文章主要介绍了Shell正则表达式中grep、sed、awk怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先先复制一段范例:代码如下:# vi regular_e...
    99+
    2023-06-09
  • Shell—正则表达式(grep命令、sed工具)
    正则表达式是一种用于匹配、查找和替换文本的强大工具。在Shell中,可以使用grep命令和sed工具来应用正则表达式。1. grep...
    99+
    2023-09-22
    Shell
  • Shell中正则表达式及sed和awk常见问题
    目录1 正则表达式中的+、?、*分别表示什么含义?2 如何编写正则表达式匹配11位的手机号?3 简述sed定址符的作用及表示方式。4 如何使用sed提取文本中的偶数行?5 如何使用s...
    99+
    2024-04-02
  • Shell正则表达式学习笔记
    正规表示法(或称为常规表示法)是透过一些特殊字符的排列,用以搜寻/取代/删除一列或多列文字字符串, 简单的说,正规表示法就是用在字符串的处理上面的一项『表示式』。正规表示法并不是一个工具程序, 而是一个字符...
    99+
    2022-06-04
    学习笔记 正则表达式 Shell
  • Shell中正则表达式及sed和awk常见问题有哪些
    这篇文章主要介绍了Shell中正则表达式及sed和awk常见问题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1 正则表达式中的+、?、*分别表示什么含义?这三个字符用...
    99+
    2023-06-20
  • python3正则表达式笔记
    \d可以匹配一个数字,\w可以匹配一个子字母和数字.可以匹配任意字符\d{3}匹配3个字符\s匹配一个空格,\s+至少有一个空格\s{3,8}匹配3到8的数字\d{3}\-\d{3,8}'010-12345'\d{3}\-\d{3,8}[0...
    99+
    2023-01-31
    笔记 正则表达式
  • Python 爬虫学习笔记之正则表达式
    正则表达式的使用 想要学习 Python 爬虫 , 首先需要了解一下正则表达式的使用,下面我们就来看看如何使用。 . 的使用这个时候的点就相当于一个占位符,可以匹配任意一个字符,什么意思呢?看个例子就知道 ...
    99+
    2022-06-04
    爬虫 学习笔记 正则表达式
  • linux 正则表达式grep实例分析
    在很多技术领域(如:自然语言处理,数据存储等),正则表达式可以很方便的提取我们想要的信息,所以正则表达式是一个很重要的知识点! 一、概念 正则表达式(Regular Expression)是用于描述一组字符串特征的模...
    99+
    2022-06-03
    linux 正则表达式 grep
  • javascript学习笔记(五)正则表达式
    常用到的元字符有: •. 查找单个字符,除了换行和行结束符; •\w 匹配字母、汉字、数字、下划线等符号; •\s 匹配空白符(包含空格、制表符等...
    99+
    2022-11-21
    正则表达式
  • Linux行处理工具之grep 正则表达式详解
    目录正则表达式在grep应用以及差别匹配案例fgrep总结之前我们学习了linux grep的基本操作,以及提及了linux grep的孪生兄弟egrep 和 fgrep,这次我们来...
    99+
    2022-11-13
    linux grep 正则表达式 grep 正则表达式
  • 详解Linux--shell脚本之正则表达式
    一、正则表达式的概念及特点: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。规定一...
    99+
    2022-06-04
    详解 脚本 正则表达式
  • Linux Shell脚本的编程之正则表达式
    一 正则表达式与通配符 1 正则表达式是用在文件中匹配符合条件的字符串,正则是包含匹配,grep,awk,sed等命令可以支持正则表达式 2 通配符是用来匹配符合条件的文件名,通配符是完全匹配,ls,fin...
    99+
    2022-06-04
    脚本 正则表达式 Linux
  • grep正则表达式匹配中括号的方法实例
    目录1. 匹配中括号,例如匹配 String[] args2. 匹配大括号,例如匹配 {abc 123}3. 同时匹配中括号和大括号,例如匹配 new byte[]{6, 55, 7...
    99+
    2024-04-02
  • PHP学习笔记:字符串处理与正则表达式
    在PHP开发中,字符串处理和正则表达式是非常重要的技巧之一。无论是对用户输入的数据进行处理,还是对文本进行搜索和替换,字符串处理和正则表达式都能帮助我们实现更加灵活和高效的操作。本文将介绍一些常用的字符串处理函数和正则表达式的用法,并提供具...
    99+
    2023-10-21
    正则表达式 处理 PHP 学习笔记:字符串
  • Linux--shell脚本之正则表达式的示例分析
    小编给大家分享一下Linux--shell脚本之正则表达式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、正则表达式的概念及特点:正则表达式是对字符串...
    99+
    2023-06-09
  • Java正则表达式之Pattern类实例详解
    目录前言Pattern 概述Pattern 匹配模式(Pattern flags)代码示例多行模式:Pattern.MULTILINE 示例忽略大小写:Pattern.CASE_IN...
    99+
    2024-04-02
  • 【MongoDB学习笔记16】MongoDB的查询:find中的正则表达式
    MongoDB中find查询使用Perl兼容的正则表达式perl中正则表达式简述:http://www.chinaunix.net/old_jh/25/159388.html 示例:>&nb...
    99+
    2024-04-02
  • grep正则表达式怎么实现查找某个特定的IP地址
    本篇内容主要讲解“grep正则表达式怎么实现查找某个特定的IP地址”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“grep正则表达式怎么实现查找某个特定的IP地址”吧!下面会举几个在grep命令中...
    99+
    2023-06-13
  • linux中shell如何实现路径截取正则表达式
    小编给大家分享一下linux中shell如何实现路径截取正则表达式,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!file=/dir1/dir2/dir3/my.file.txt我们可以用${ }分别替换获得不同的值:${f...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作