grep工具

grep是什么

      grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

      grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

选项和语法

语法

语法: grep  [-cinvABC]  'word'  filename

#如grep -c '12345' 1.txt    匹配1.txt文件里符合有12345字符的

选项

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

-i :忽略大小写(匹配的条件字符忽略大小写)

-n :在输出符合要求的行的同时连同行号一起输出(显示行号)

-v :打印不符合要求的行(取反)

-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行

-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行

-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行

-r :  会把目录下面所有的文件全部遍历(加h选项,遍历的时候不会显示文件名,只显示匹配到的字符)

-h:遍历文件时不显示文件名

-l:查询多文件时只输出包含匹配字符的文件名

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

egrep

egrep=grep -E 作用是需要转义但是不输入转义符的时候用可以起到转义特殊符号的作用

如:egrep ‘(aaa|bbb)’1.txt

这个例子的意思是匹配1.txt里的aaa或者bbb,括号为特殊符号需要转义,用egrep也可以达到转义的目的,如图:

9.1-9.7 正则三剑客:grep、sed、awk_centos

特殊符号的含义

\: 忽略正则表达式中特殊字符的原有含义

^:匹配正则表达式的开始行

^放在中括号前面是可以匹配以括号内字符开头的行(图为以字母开头的行)

9.1-9.7 正则三剑客:grep、sed、awk_centos _02

可以把^放到中括号里面,会匹配到除了括号内字符之外的字符(图中为除了字母之外的字符)

9.1-9.7 正则三剑客:grep、sed、awk_grep_03

$: 匹配正则表达式的结束行

9.1-9.7 正则三剑客:grep、sed、awk_grep_04

中括号内^&表示开头到结尾,就会匹配所有行,不加中括号会匹配空行。

9.1-9.7 正则三剑客:grep、sed、awk_grep_05

9.1-9.7 正则三剑客:grep、sed、awk_centos _06

在目录下遍历文件

在etc下遍历以txt为结尾内容包含root的文件:

grep --include "*.txt" -r 'root' /etc/

9.1-9.7 正则三剑客:grep、sed、awk_grep_07

扩展:

把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/


.  

任意一个字符

*  

0个或多个*号前面的字符

.*

  通配 所有的都匹配,没有字符也匹配

{}  

花括号里的数字,表示{}前面的字符范围,前面字符可以用()括起来

+

一个或多个加号前面的字符

?  

0个或1个 问号前面的字符

|  

表示 或者,意思


grep常用用法(一):

1. 过滤出 包含0-9数字的行:grep '[数字范围]' 文件名

[root@gaohanwei grep]#grep '[0-9]' passwd

2. 过滤出 不包含0-9数字的行:grep -v '[数字范围]' 文件名

[root@gaohanwei grep]#grep -v '[0-9]' passwd

^放在方括号里面方括号里面字符的反义(非)

^放在方括号外面方括号里面字符开头

3. 过滤出 #开头的行:grep -n '^#文件名

[root@gaohanwei grep]#grep -n '^#' passwd

4. 过滤出 不以#开头的行:grep -nv '^#文件名

[root@gaohanwei grep]#grep -nv '^#passwd

5. 过滤出 含有非0-9数字行(纯数字行不会显示),非数字字符红色标记:

[root@gaohanwei grep]#grep -n '[^0-9]' passwd

6. 过滤出 含有非a-z字母行(纯字母行不会显示),非字母字符红色标记:

[root@gaohanwei grep]#grep -n '[^a-z]' passwd

7. 过滤出 不以0-9数字开头的行:

[root@gaohanwei grep]#grep -n '^[^0-9]' passwd

8. 过滤出 0-9数字开头的行:

[root@gaohanwei grep]#grep -nv '^[^0-9]' passwd

9. 过滤出 不以a-z字母开头的行:

[root@gaohanwei grep]#grep -n '^[^a-z]' passwd

10. 过滤出 a-z字母开头的行:

[root@gaohanwei grep]#grep -nv '^[^a-z]' passwd


grep常用用法(二):

1. 匹配出 含有关键词.关键词的行(表示任意的一个字符):

grep '关键词.关键词文件名

[root@gaohanwei grep]#grep 'r.opasswd

9.1-9.7 正则三剑客:grep、sed、awk_grep_08

2. 匹配出  含有关键词的行(*左边字符可重复任意次):

[root@gaohanwei grep]#grep 'o*o' passwd

9.1-9.7 正则三剑客:grep、sed、awk_grep_08

3. 匹配出 所有字符所有行都匹配了:

[root@gaohanwei grep]#grep '.*' passwd

9.1-9.7 正则三剑客:grep、sed、awk_grep_08

4. 匹配出 包含关键词.*关键词

grep '关键词.*关键词文件名

[root@gaohanwei grep]#grep 'hao.*bash' passwd

9.1-9.7 正则三剑客:grep、sed、awk_grep_08

5. {}里的数字,表示{}前面关键词的重复范围:

[root@gaohanwei grep]#grep 'o\{2\}' passwd

或[root@gaohanwei grep]#egrep 'o\{2\}' passwd

或[root@gaohanwei grep]#grep -E 'o\{2\}' passwd


6. oo组合的2次重复,匹配出不少于4个o的行:

[root@gaohanwei grep]#egrep '(oo){2}' passwd

9.1-9.7 正则三剑客:grep、sed、awk_grep_08

7. +(加号)左边关键词可1次或多次重复,后面匹配关键词t

[root@gaohanwei grep]#egrep 'o+tpasswd

9.1-9.7 正则三剑客:grep、sed、awk_grep_08

8. 前面字符的重复次数为0或1,

[root@gaohanwei grep]#egrep 'o?2o' passwd

9.1-9.7 正则三剑客:grep、sed、awk_grep_08

9. 或者匹配出包含关键词

      (或者)匹配出关键词

      (或者)匹配出包含关键词的行

[root@gaohanwei grep]#grep -E 'root|nologin|haopasswd

9.1-9.7 正则三剑客:grep、sed、awk_grep_08

sed工具(默认记住sed -n ' 'p)

sed是什么

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

选项

转义(类似egrep)

sed -r

打印某行

用vim的时候,可以查找也可以替换,但是只局限于在文本内部来操作,而不能输出到屏幕上。sed工具可以

sed -n 'n'p filename 单引号内的n是一个数字,表示第几行:

9.1-9.7 正则三剑客:grep、sed、awk_centos _16

要想把所有行都打印出来可以使用 sed -n '1,$'p filename

9.1-9.7 正则三剑客:grep、sed、awk_grep_17

也可以指定一个区间:

9.1-9.7 正则三剑客:grep、sed、awk_正则_18

打印包含某个字符串的行

9.1-9.7 正则三剑客:grep、sed、awk_centos _19

PS:grep中使用的特殊字符,如 ^ $ . * 等同样也能在sed中使用

9.1-9.7 正则三剑客:grep、sed、awk_正则_20

-e可以实现多个行为

9.1-9.7 正则三剑客:grep、sed、awk_grep_21

删除某行或者多行

9.1-9.7 正则三剑客:grep、sed、awk_正则_22

PS:‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行。

替换字符或字符串

9.1-9.7 正则三剑客:grep、sed、awk_centos _23

上例中的 ‘s’ 就是替换的命令, ‘g’ 为本行中全局替换,如果不加 ‘g’ 只换该行中出现的第一个。除了可以使用 ‘/’ 作为分隔符外,还可以使用其他特殊字符例如 ‘#’ 或者 ‘@’ 都没有问题。

9.1-9.7 正则三剑客:grep、sed、awk_正则_24

删除文档中的所有数字或者字母

9.1-9.7 正则三剑客:grep、sed、awk_grep_25

不能用sed '/[0-9]/'d test 这样是把包含数字的行全部删除,也会删掉其中的字母。

PS:[0-9]表示任意的数字。也可以写成[a-zA-Z]甚至[0-9a-zA-Z]

9.1-9.7 正则三剑客:grep、sed、awk_正则_26

调换两个字符串的位置

9.1-9.7 正则三剑客:grep、sed、awk_centos _27

上例中用 () 把所想要替换的字符括起来成为一个整体,因为括号在sed中属于特殊符号,所以需要在前面加脱意字符 ‘’, 替换时则写成 ‘1’, ‘‘2’, ‘‘3’ 的形式。

9.1-9.7 正则三剑客:grep、sed、awk_centos _28

直接修改文件的内容

9.1-9.7 正则三剑客:grep、sed、awk_grep_29

这样就可以直接更改test.txt文件中的内容了。由于这个命令可以直接把文件修改,所以在修改前最好先复制一下文件以免改错。

整理:sed常用

sed '1,5s/^/#/g' 1.txt   注释1到5行,先匹配,然后开头替换#符号,常用

sed '1,3d' file //删除1-3行 

sed '/[Aa]bc/p' file //打印包含Abc或者abc的行 

sed '/ABC/d' //删除包含ABC的行 

sed '/ABC/!d' //不删除包含ABC的行 

sed '5,$d' //从第五行到最后一行全部删除 

sed 1q  //显示第一行 

sed 's/$/.../g' //每行的最后面添加 ... 

sed 's/d.(sk)/1&/g' //满足d*sk的单词,在单词前添加sk 

sed 's/<[^>]*>//g' //去除html标签 

sed '/ABC/a123' //在包含ABC的行后面添加一行数值为123的行 

sed '/ABC/i123' //跟a不同的是i是插入当前行的前面 

sed '/ABC/c123' //包含ABC的行将更改为123 

sed '/ABC/{n;s/123/ABC/g}' //精确匹配包含ABC的下一行,将123全部替换成ABC 

sed '/ABC/{s/A/a/}' //在包含ABC的行将A替换成a 

sed -e '/ABC/h' -e '$g' //将包含ABC的行复制,在最后一行添加. 

sed -e '/ABC/{h;d}' -e '/123/G' //将包含ABC的行复制并删除,在包含123的行后添加. 

g等于在当前行覆盖,G是在符合条件的行后新增加一行. 

sed 's/^/ /g' //每行前面增加一个空格 

sed 's/.(.)$/*1/' //将倒数第二位换成* 

sed '/ABC/!s/1/*/g' //在不包含ABC的行里,将所有的1替换成* 

sed 's/1|2|3/*/g' //在GNU里将不管是1或2或者是3替换成*

9.1-9.7 正则三剑客:grep、sed、awk_正则_30


awk命令

awk是什么

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

常用的命令有哪些

$0代表整行,$1代表第一列$2和之后的数字都代表第几列。

截取文档中的的某段

awk -F ':' '{print $1}' 1.txt

说明: -F 指定分隔符号为 :

9.1-9.7 正则三剑客:grep、sed、awk_grep_31

PS:如果什么选项都不加 默认是以空格为分隔符(如图)

9.1-9.7 正则三剑客:grep、sed、awk_grep_32

也可以使用自定义字符连接每个段

awk -F ':' '{OFS="#"} {print $3,$4}' 1.txt

说明: OFS="#" #为自定义分隔符,并不等于文档内部的分隔符,只输出在屏幕上而已,这是使用内部变量来指定分隔符

匹配字符或字符串

awk '/oo/' 1.txt

匹配多个字符串(如匹配root和user)

awk '/root|user/' 1.txt

针对某个段匹配

awk -F ':' '$1 ~/oo/' 1.txt

多次匹配

awk -F ':' '/root/ {print $1,$2}; $1 ~/test/; $3 ~/20/' 1.txt

条件操作符 ==,>,<,!=,>=;<=

条件:第三段为0

awk -F ':' '$3==0 {print $3}' 1.txt;

条件:第三段大于等于500

awk -F':' '$3>=500 {print $3}' 1.txt;

说明:当比较数字时,不能加双引号,如果写成$3>="500"就不符合我们的要求了。

条件:第七段不是'/sbin/nologin/'

awk -F ':' '$7!="/sbin/nogin"' 1.txt

条件:第三段小于第四段

awk -F ':' '$3<$4' 1.txt

条件:第三段大于5,并且第三段小于7

awk -F ':' '$3>5 && $3<7' 1.txt

第三段大于5或者第七段为‘bin/bash’

awk -F ':' '$3>"5" || $7=="bin/bash"' 1.txt

PS:要在条件后面加上打印print,要不然会输出整行,如下

awk -F ':' '$3=="0" {print $3}' 1.txt;

awk内置变量 NF(段数) NR(行数)

head -n3 1.txt | awk -F ':' '{print NF}'

head -n3 1.txt | awk -F ':' '{print $NF}'

head -n3 1.txt | awk -F ':' '{print NR}'

打印20行以后的行

awk -F 'NR>20' 1.txt

打印20行以后并且第一段包含'ssh'的行

awk -F ':' 'NR>20 && $1 ~/ssh/' 1.txt

更改某个段的值

awk -F ':' '$1="root"' 1.txt

数学计算,把第三段和第四段值相加,并赋予第七段

awk -F ':' '{$7=$3+$4; print $0}'1.txt

但是这样的话,相当于改变了原来文本的结构,所以print $0的时候就不在有分隔符显示,如果想要显示分隔符就需要借助OFS

awk -F ':' '{OFS=":"} {$7=$3+$4; print $0}' 1.txt

$NF表示最后一列,如图:

9.1-9.7 正则三剑客:grep、sed、awk_grep_33

有的时候我们懒得去数最后一段,就用变量NF。

拓展:

awk详细资料:http://man.linuxde.net/awk