grep
以前我们用grep在一个文件中找出包含某些字符串的行,比如在头文件中找出符合某个模式(Pattern)的一类字符串,例如找出所有符合[email protected]模式的字符串(也就是email地址),要求x字符是可以是字母、数字、下划线、小数点。
字符类限定符(Character Class):如上例的x和y,他们在模式中表示一个字符,但是在取值范围是一类字符中的任意一个。
数量限定符(Quantifier):邮箱地址的每一部分可以有一个或者多个x字符。
位置限定符(Achor):描述各个字符类以及普通字符之间的位置关系,例如邮件地址分为三部分,用普通字符@和.隔开。
每一部分可以用字符类和数量限定符描述,为了表述位置关系,需要位置限定符。(有了三个概念,每次写正则表达式就不会乱了思绪)
exe
192.168.1.1 1234.234.04.5678 123.4234.045.678 abcde
执行的命令为:
[12][0-9]{0,2}\.[12][0-9]{0,2}\.[12][0-9]{0,2}' exe
执行结果为:
我们知道C的变量和shell脚本变量的定义和使用方法很不同,表达能力也不相同,C变量有各种类型,而shell脚本变量都是字符串。
字符类
字符 |
含义 |
. |
匹配任意一个字符 |
[] |
匹配括号中的任意一个字符 |
- |
在[]括号内表示字符范围 |
^ |
位于[]内的开头,匹配出括号中的字符之外的任意一个字符 |
具体使用例子
数量限定符
字符 |
含义 |
举例 |
? |
紧跟在它前面的单元匹配零次或一次 |
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 |
匹配单词开头和结尾的位置 |
演示结果
例子:
用下面的命令查找否和标准的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后不打印原内容)
2. /pattern/d :删除匹配pattern的行
3./pattern/s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配pattern1的字符串替换pattern2
定址
定址用于决定对哪些行进行编辑,地址的形式可以是数字,正则表达式,或者二者的结合
以上分别是打印第三行,打印1~3行,删除2~4行
正则表达式
^:行首定位符:/^my/ 匹配所有以my开头的行
$:行尾定位符:/my$/ 匹配所有以my结尾的行
.:匹配除换行符以外的单个字符: /m..y/ 匹配包含字母m,后跟两个任意字符,再跟字
母y的行
awk
sed以行为单位处理文件,awk比sed强的地在于不仅能以行为单位还能以列为单位处理文件。awk缺省的行分隔符是换行,缺省的列分隔符是连续的空格和Tab,但是行分隔符和列分隔符都可以自定义
/pattern/{actions}
和sed类似,pattern是正则表达式,actions是一系列操作。awk程序一行一行读出待处理文件,如果某一行与pattern匹配,或者满足condition条件,则执行相应的actions,如果一条awk命令只 有actions部分,则actions作用于待处理文件的每一行。
注:自动变量$1,$2分别表示第一列、第二列等,类似于shell脚本的位置参数,而$0表示整个位置参数。
例子:区分出出价格小于等于2的和大于2的
cut
定义:正如其名,cut的工作就是剪,具体的说就是在文件中负责剪切数据,cut是以行作为处理对象的,这种机制和sed是一样的。
cut命令主要接受三个定位方法:字节(bytes)用选项-b,字符(character)用选项-c
sort
sort将文件的每一行作为一个单位,相互比较,比较原则是首字符向后,依次按ASCII码比较,最后按升序输出。
sort 的-u选项(作用;就是在输出行中除去重复行)
sort的-r选项(sort默认排序方式是升序,如果想改成降序,加上选项-r)
sort -r test
sort的-o选项(用于将结果写入文件)
sort -r test -o newtest
sort的-n选项
之前有些的排序将数字按字符来排序,使得10排在2前面,加上-n选项后,使得排序按数值来排序。
sort的-t选项和-k选项
例子:以第二行为例进行排序
分析:
sort -n -t':'-k 2 product
-n:以整数排列
-t:以分隔符“:”进行排列
-k:对第二列进行sort操作
按照第一列的第二个进行排列,日过相同,则值按照第三列降序排列。
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 #计数出现的次数