shell学习第三天――grep、sed、awk

时间:2022-11-13 20:53:19

grep

以前我们用grep在一个文件中找出包含某些字符串的行,比如在头文件中找出符合某个模式(Pattern)的一类字符串,例如找出所有符合xxxx@xxxx.xxx模式的字符串(也就是email地址),要求x字符是可以是字母、数字、下划线、小数点。

字符类限定符(Character Class):如上例的x和y,他们在模式中表示一个字符,但是在取值范围是一类字符中的任意一个。

数量限定符(Quantifier):邮箱地址的每一部分可以有一个或者多个x字符。

位置限定符(Achor):描述各个字符类以及普通字符之间的位置关系,例如邮件地址分为三部分,用普通字符@和.隔开。

每一部分可以用字符类和数量限定符描述,为了表述位置关系,需要位置限定符。(有了三个概念,每次写正则表达式就不会乱了思绪)

exe

192.168.1.11234.234.04.5678
123.4234.045.678
abcde

执行的命令为:

[12][0-9]{0,2}\.[12][0-9]{0,2}\.[12][0-9]{0,2}' exe

执行结果为:

shell学习第三天――grep、sed、awk

我们知道C的变量和shell脚本变量的定义和使用方法很不同,表达能力也不相同,C变量有各种类型,而shell脚本变量都是字符串。

字符类

字符
含义
.
匹配任意一个字符
[]
匹配括号中的任意一个字符
-
在[]括号内表示字符范围
^
位于[]内的开头,匹配出括号中的字符之外的任意一个字符

具体使用例子

shell学习第三天――grep、sed、awk

数量限定符

字符
含义
举例

紧跟在它前面的单元匹配零次或一次
localhost bash]$ echo "hello" | grep -E --color 'hell?'
hello
+
紧跟在它前面的单元应匹配一次或多次
[lh@localhost bash]$ echo "helloooo" | grep -E --color 'hello+'
helloooo

*
紧跟它前面的单元应匹配零次或多次
[lh@localhost bash]$ echo "helloooo" | grep -E --color 'hello*'
helloooo
[lh@localhost bash]$ echo "helloooo" | grep -E --color 'helo*'
helloooo

位置限定符

字符
含义
^
匹配行首的位置
$
匹配行末的位置
\<
匹配单词开头的位置
\>
匹配单词结尾的位置
\b
匹配单词开头或结尾的位置
\B
匹配单词开头和结尾的位置

演示结果

shell学习第三天――grep、sed、awk

例子:

用下面的命令查找否和标准的IP号

 grep -E '[1,2][0-9]{0,2}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' exe

寻找否合标准的手机号

 grep -E '1[34578][0-9]{9}' exe

寻找否和标准的邮箱号

grep -E '[123456789][0-9]{4,11}@qq\.com$'

sed

sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为一种格式输出。sed和vi都源于 早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。

/pattern/action

其中pattern是正则表达式,action是编辑操作。sed程序一行一行读出待处理文件,如果某一行 与pattern匹配,则执行相应的action,如果一条命令没有pattern而只有action,这个action将作用于待处理文件的每一行。sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)

1. /pattern/p :打印匹配pattern的行(加-n后不打印原内容)

shell学习第三天――grep、sed、awk

2. /pattern/d :删除匹配pattern的行

shell学习第三天――grep、sed、awk

3./pattern/s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配pattern1的字符串替换pattern2

shell学习第三天――grep、sed、awk

定址
定址用于决定对哪些行进行编辑,地址的形式可以是数字,正则表达式,或者二者的结合

shell学习第三天――grep、sed、awk

以上分别是打印第三行,打印1~3行,删除2~4行

正则表达式

^:行首定位符:/^my/ 匹配所有以my开头的行

$:行尾定位符:/my$/ 匹配所有以my结尾的行

shell学习第三天――grep、sed、awk

 .:匹配除换行符以外的单个字符: /m..y/ 匹配包含字母m,后跟两个任意字符,再跟字
母y的行

shell学习第三天――grep、sed、awk

awk

sed以行为单位处理文件,awk比sed强的地在于不仅能以行为单位还能以列为单位处理文件。awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab,但是行分隔符和列分隔符都可以自定义

/pattern/{actions}

和sed类似,pattern是正则表达式,actions是一系列操作。awk程序一行一行读出待处理文件,如果某一行与pattern匹配,或者满足condition条件,则执行相应的actions,如果一条awk命令只 有actions部分,则actions作用于待处理文件的每一行。

shell学习第三天――grep、sed、awk

注:自动变量$1,$2分别表示第一列、第二列等,类似于shell脚本的位置参数,而$0表示整个位置参数。

例子:区分出出价格小于等于2的和大于2的

shell学习第三天――grep、sed、awk

cut

定义:正如其名,cut的工作就是剪,具体的说就是在文件中负责剪切数据,cut是以行作为处理对象的,这种机制和sed是一样的。

cut命令主要接受三个定位方法:字节(bytes)用选项-b,字符(character)用选项-c

shell学习第三天――grep、sed、awk

sort

sort将文件的每一行作为一个单位,相互比较,比较原则是首字符向后,依次按ASCII码比较,最后按升序输出。

shell学习第三天――grep、sed、awk

sort 的-u选项(作用;就是在输出行中除去重复行)

shell学习第三天――grep、sed、awk

sort的-r选项(sort默认排序方式是升序,如果想改成降序,加上选项-r)

sort -r test

sort的-o选项(用于将结果写入文件)

sort -r test -o newtest

sort的-n选项

之前有些的排序将数字按字符来排序,使得10排在2前面,加上-n选项后,使得排序按数值来排序。

sort的-t选项和-k选项

例子:以第二行为例进行排序

shell学习第三天――grep、sed、awk

分析:

sort -n -t':'-k 2 product

-n:以整数排列

-t:以分隔符“:”进行排列

-k:对第二列进行sort操作

shell学习第三天――grep、sed、awk

按照第一列的第二个进行排列,日过相同,则值按照第三列降序排列。

sort -t':' -k 1.2,1.2 -k 3.3nr product

uniq

说明:这个命令读取输入文件,并比较相邻的行,在正常情况下第二个及以后的重复行都将内删去。

-c:显示输出中,在每行行加上文本中出现的次数。取代-u,-d选项。

-d:值显示重复行

-u:只显示文件中不重复的行

sort ptr | uniq -u   #显示不重复的行sort ptr | uniq -d   #显示重复行sort ptr | uniq -c   #计数出现的次数

shell学习第三天――grep、sed、awk