Linux命令之grep
grep(global search regular expression and print out the line,全面搜索正则表达式并把行打印)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配到的行打印出来。与之相应的还有egrep和fgrep命令。
grep的工作方式:在一个或多个文本中搜索字符串模板,如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。
命令格式:
grep [option] pattern file
一般情况下,grep命令使用时需要指定文件,若不制定任何文件名称,或是所给予的文件名为“-”,则grep命令会从标准输入设备读取数据。
grep的常用选项:
-A num或--after-context=num 匹配到搜索到的行以及该行下面的num行
-a或--text 不要忽略二进制的数据
-B num或--before-context=num 匹配到搜索到的行以及该行上面的num行
-b或--byte-offset 输出每一个匹配行(或匹配的字符串)时在其前附加上偏移量(从文件第一个字符到该匹配内容之间的字节数),在显示符合样式的那一行之前标示出该行第一个字符的编号
-C num或--context=num或-num 匹配到搜索到的行以及该行上下各num行
-c或--count 抑制正常输出,为每个输入文件打印匹配线的计数,计算符合样式的列数
--color [=WHEN] 让关键字高亮显示,如—color=auto
-d 动作或--directories=动作 当指定要查找的是目录而非文件时,必须使用此项参数,否则grep指令将回报信息并停止动作
-E或--extended-regexp 将样式为延伸的普通表示法来使用
-e 样式或--regexp=样式 使用“样式”作为模式。这可以用于指定多个搜索模式,或保护以连字符“-”开头的图案,指定字符串作为查找文件内容的样式
-F或--fixed-regexp 将样式视为固定字符串的列表
-f 规则文件或--file=规则文件 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式
-G或-basic-regexp 将范本样式视为普通的表示法来使用。这是默认值,加不加都是使用grep
-H或--with-filename 在每一个匹配行之前加上文件名一起输出(针对于查找单个文件),当查找多个文件时默认就会输出文件名
-h或--no-filename 禁止输出文件名的前缀,无论查找几个文件都不会在匹配内容前输出文件名
-i或--ignore-case 搜索的时候忽略大小写的差别
-L或--files-without-match 列出文件内容不符合指定样式的文件名称
-l或--file-with-matches 列出文件内容符合指定样式的文件名称
-m num 当匹配内容的行数达到num行后,grep自动停止搜索,并输出此时搜索到的匹配内容
--label = LABEL 显示实际来自标准输入的输入作为来自文件LABEL的输入。这是特别在实现zgrep等工具时非常有用,例如gzip –cd foo.gz | grep –label = foo -H
-n或--line-number 输出匹配内容的同时输出其所在行号
-o或--only-matching 只输出匹配的具体字符串,匹配行中其他内容不会输出
-q或--quiet或--silent 安静模式,不会有任何输出内容,查找到匹配内容会返回0,未查找到匹配内容就返回非0
-r或--recursive 此参数的效果和指定"-d recurse"参数相同,递归读取每个目录下的所有文件
-s或--no-messages 不会输出查找过程中出现的任何错误消息,-q和-s选项因为与其他系统的grep有兼容问题,shell脚本中应尽量避免使用这两个参数,并且应该将标准和错误输出重定向到/dev/null
-T 初始标签确保实际行内容的第一个字符位于制表位上,以便对齐标签看起来很正常。在匹配信息和其前的附加信息之间加入Tab以使格式整齐
-V或--version 打印grep的版本号
-v或--revert-match 反转匹配,选择没有被匹配到的内容
-w或--word-regexp 只匹配整个单词,单词的两边必须是非字符符号(即不能是字母、数字、下划线)
-x或--line-regexp 仅选择与整行完全匹配的匹配项,即精确匹配整行内容(包括行首行尾那些看不到的空格内容)
-y 和-i效果相同,即忽略大小写
案例:
测试用文件Demo_File.txt
1.从单个文件中国查找指定的字符串
从Demo_File.txt文件中查找“this”字符串
grep “this” Demo_File.txt
2.从多个文件中查找指定的字符串
从Demo_File.txt和Demo_File1.txt中查找“this”字符串
grep “this” Demo_File.txt Demo_File1.txt
或可使用命令 grep “this” Demo_*来完成查找
3.忽略大小写进行查找
在Demo_File.txt文件中使用-i或-y参数查找“the”
4.在文件中匹配正则表达式
在Demo_File.txt文件中匹配所有的以lines开头,empty结尾的数据
grep “lines.*empty” Demo_File.txt
5.用grep –w来查找全匹配
grep –iw “is” Demo_File.txt
6.用grep –A,-B,-C命令来查看文件
以Demo_File2.txt作为测试用文件,文件内容为A~Z,每行一个,共26行
显示匹配行及其后N行
grep -A “J” Demo_File2.txt
显示匹配行及其后N行
grep -B “J” Demo_File2.txt
显示匹配行及其前和其后各N行
grep -C “J” Demo_File2.txt
7.用Grep –options来让查找的项醒目
export GREP_COLOR=’a;b’
默认’a;b’是’1;31’,即高亮的红色,用户还可自己设置醒目的方式
a可以选择0,1,4,5,7,8的值
0 关闭所有属性
1 设置高亮度
4 下划线
5 闪烁
7 反显
8 消隐
b可以选择30~37(设置前景色)或40~47(设置后景色)
30 black
31 red
32 green
33 yellow
34 blue
35 purple
36 cyan
37 white
在Demo_File.txt中查找”this”,并设置醒目
export GREP_OPTIONS=’--color=auto’ GREP_COLOR=‘1,41’
8.用grep -r来搜索所有文件及子目录
9.用grep -v来显示不匹配的项
10.显示所有不匹配的项
grep -v -e “this” -e “IS” -e “All”
11.用grep -c来计算匹配的数量
grep -c “this” Demo_File.txt
12.计算不匹配的模式数
grep –c -v “this” Demo_File.txt
13.使用grep -l显示匹配的文件名
grep -l “this” Demo_File.txt
14.只显示匹配的字符串
grep -o “lines.*empty” Demo_File.txt
15.只显示匹配的字符串,并输出其偏移量
grep -o -b “D” Demo_File2.txt
16.用grep -n显示行数
grep -n “D” Demo_File2.txt
17.查找文件中的所有的空行
grep ^$ Demo_File2.txt
此文件中没有空行
18.使用grep -f参数,用文件来指定待查找的模式
模式文件是:pattern.txt
grep -f pattern.txt Demo_File2.txt
19.使用-r参数查找子目录
grep “ab” 在当前目录下搜索带”ab”的行
grep -r “ab” 在当前目录及其子目录下搜索带”ab”的行
grep -l -r “ab” 在当前目录及其子目录下搜索带”ab”行的文件,但是不显示此行,只显示匹配到的文件名
grep -nr BLOG* . 查找子目录,匹配后输出行号
grep -lr BLOG* . 查找子目录,匹配后只输出文件名
20.grep不显示本身
ps aux | grep ssh | grep -v "grep"
21.查找指定进程
ps -ef | grep bash
21.查找指定进程个数
ps -ef | grep -c bash
22.从文件中读取关键字进行搜索
输出test1.txt文件中含有tets2.txt文件中读取出的关键词的内容行,可用于按指定关键词搜索日志文件
cat tets1.txt | grep -f test2.txt
cat test1.txt | grep -nf test2.txt
23.一次性执行多个命令
显示搜索后的列头和数据