Linux之grep 命令
1. grep 简介
[grep] (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
命令格式:grep [option] pattern file;
正则表达式选择与解释:
-E, --extended-regexp PATTERN 是一个可扩展的正则表达式(缩写为 ERE)
-F, --fixed-strings PATTERN 是一组由断行符分隔的定长字符串。
-G, --basic-regexp PATTERN 是一个基本正则表达式(缩写为 BRE)
-P, --perl-regexp PATTERN 是一个 Perl 正则表达式
-e, --regexp=PATTERN 用 PATTERN 来进行匹配操作
-f, --file=FILE 从 FILE 中取得 PATTERN
-i, --ignore-case 忽略大小写
-w, --word-regexp 强制 PATTERN 仅完全匹配字词
-x, --line-regexp 强制 PATTERN 仅完全匹配一行
-z, --null-data 一个 0 字节的数据行,但不是空行
Miscellaneous:
-s, --no-messages suppress error messages
-v, --invert-match select non-matching lines
-V, --version display version information and exit
--help display this help text and exit
输出控制:
-m, --max-count=NUM NUM 次匹配后停止
-b, --byte-offset 输出的同时打印字节偏移
-n, --line-number 输出的同时打印行号
--line-buffered 每行输出清空
-H, --with-filename 为每一匹配项打印文件名
-h, --no-filename 输出时不显示文件名前缀
--label=LABEL 将LABEL 作为标准输入文件名前缀
-o, --only-matching show only the part of a line matching PATTERN
-q, --quiet, --silent suppress all normal output
--binary-files=TYPE assume that binary files are TYPE;
TYPE is 'binary', 'text', or 'without-match'
-a, --text equivalent to --binary-files=text
-I equivalent to --binary-files=without-match
-d, --directories=ACTION how to handle directories;
ACTION is 'read', 'recurse', or 'skip'
-D, --devices=ACTION how to handle devices, FIFOs and sockets;
ACTION is 'read' or 'skip'
-r, --recursive like --directories=recurse
-R, --dereference-recursive
likewise, but follow all symlinks
--include=FILE_PATTERN
search only files that match FILE_PATTERN
--exclude=FILE_PATTERN
skip files and directories matching FILE_PATTERN
--exclude-from=FILE skip files matching any file pattern from FILE
--exclude-dir=PATTERN directories that match PATTERN will be skipped.
-L, --files-without-match print only names of FILEs containing no match
-l, --files-with-matches print only names of FILEs containing matches
-c, --count print only a count of matching lines per FILE
-T, --initial-tab make tabs line up (if needed)
-Z, --null print 0 byte after FILE name
文件控制:
-B, --before-context=NUM 打印以文本起始的NUM 行
-A, --after-context=NUM 打印以文本结尾的NUM 行
-C, --context=NUM 打印输出文本NUM 行
-NUM same as --context=NUM
--group-separator=SEP use SEP as a group separator
--no-group-separator use empty string as a group separator
--color[=WHEN],
--colour[=WHEN] use markers to highlight the matching strings;
WHEN is 'always', 'never', or 'auto'
-U, --binary do not strip CR characters at EOL (MSDOS/Windows)
-u, --unix-byte-offsets report offsets as if CRs were not there
(MSDOS/Windows)
grep的常用选项:
-E: 解释PATTERN作为扩展正则表达式,也就相当于使用egrep
匹配控制选项:
-e : 使用PATTERN作为模式。这可以用于指定多个搜索模式,或保护以连字符( - )开头的图案。指定字符串做为查找文件内容的样式。
-i : 搜索时候忽略大小写
-v: 反转匹配,选择没有被匹配到的内容。
-w:匹配整词,精确地单词,单词的两边必须是非字符符号(即不能是字母数字或下划线)
-x:仅选择与整行完全匹配的匹配项。精确匹配整行内容(包括行首行尾那些看不到的空格内容都要完全匹配)
一般输出控制选项:
-c: 抑制正常输出;而是为每个输入文件打印匹配线的计数。
-m num:当匹配内容的行数达到num行后,grep停止搜索,并输出停止前搜索到的匹配内容
-o: 只输出匹配的具体字符串,匹配行中其他内容不会输出
-q:安静模式,不会有任何输出内容,查找到匹配内容会返回0,未查找到匹配内容就返回非0
-s:不会输出查找过程中出现的任何错误消息,-q和-s选项因为与其他系统的grep有兼容问题,shell脚本应该避免使用-q和-s,并且应该将标准和错误输出重定向到/dev/null 代替。
输出线前缀控制:
-b:输出每一个匹配行(或匹配的字符串)时在其前附加上偏移量(从文件第一个字符到该匹配内容之间的字节数)
-H:在每一个匹配行之前加上文件名一起输出(针对于查找单个文件),当查找多个文件时默认就会输出文件名
-h:禁止输出上的文件名的前缀。无论查找几个文件都不会在匹配内容前输出文件名
-n:输出匹配内容的同时输出其所在行号。
-A num:匹配到搜索到的行以及该行下面的num行
-B num:匹配到搜索到的行以及该行上面的num行
-C num:匹配到搜索到的行以及上下各num行
2. 使用实例:
1、查找指定进程
命令:ps -ef|grep java
2、查找指定进程个数
命令:ps -ef|grep -c java
3、从文件中读取关键词进行搜索,默认是显示的是行
命令1:cat test.txt | grep -f test2.txt
命令2(显示行号):cat test.txt | grep -nf test2.txt
作用:输出test.txt文件中含有从test2.txt文件中读取出的关键词的内容行,可用于按指定关键词(放到一个文件中)搜索日志文件。
-o:只显示被模式匹配到的字符串,而不是整个行
\# grep -o "root" /etc/passwd
root
root
root
root
\# grep -o "root:.*0" /etc/passwd
root:x:0:0
\# grep -o "root" -b /etc/passwd
-b和-o一般是配合使用的,一行中字符串的字符是从该行的第一个字符开始计算,起始值为0。这里左边的数字就是此关键字在此文件中的起始位置,第一个root出现在0位置,然后字符字母有一个算一个,你就一个个的向右数吧,下一个root出现在11位置以此类推。
0:root
11:root
17:root
414:root
4、从文件中查找关键词,忽略大小写,默认情况区分大小写
命令1:grep ‘linux’ test.txt
命令2(从多个文件中查找):grep ‘linux’ test.txt test2.txt
命令3(忽略大小写):grep -i ‘linux’ test.txt
命令:find . -name “.log” | grep -i error | grep -vi “info”
1)使用find -name 来列出所有log文件,重定向给grep 2)使用grep -i 来查找包含error的行 3)使用grep -vi 来查找不包含info的行
5、grep不显示本身
命令:
ps aux | grep ssh | grep -v “grep” #不包含grep ssh这条命令
grep -v root /etc/passwd | grep -v nologin #将/etc/passwd,将没有出现 root 和nologin的行取出来;
6、-r 递归查找子目录
查找当前目录及其子目录下面包含匹配字符的文件
查询不包含某个目录
grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行
egrep '123|abc' filename // 用egrep同样可以实现
awk '/123|abc/' filename // awk 的实现方式;
7、与操作**
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行;
8、-c 统计行数
grep -i "abc" test.txt|wc -l
2
55
9、 -m的使用
abc 1
abc 2
abc 3
3. 与正则表达式结合**
grep的规则表达式:
\ 反义字符:如"\"\""表示匹配""
[ - ] 匹配一个范围,[0-9a-zA-Z]匹配所有数字和字母
* 所有字符,长度可为0
+ 前面的字符出现了一次或者多次
^
$
.
*
.*
[]
[^]
\(..\)
\<
\>
x\{m\}
x\{m,\}
x\{m,n\}
\w
\W
\b
2.1 常用命令
首与行尾字节 ^ $,^ 符号,在字符类符号(括号[])之内与之外是不同的! 在 [] 内代表『反向选择』,在 [] 之外则代表定位在行首的意义!
$ ls -l | grep \'^a\'
$ ls -l | grep ^a
$ ls -l | grep -v \'^a\'
$ grep -n '^$' a.txt
$ grep \'test\' d*
$ cat test.txt |grep hat$
$ grep \'test\' aa bb cc
$ grep \'[a-z]{5}\' aa
$ grep -n '[0-9]' regular_express.txt
$ grep -n '^[a-z]' regular_express.txt
$ grep -n '^[^a-zA-Z]' regular_express.txt
$ grep -n '\.$' regular_express.txt
cat test.txt |grep -E "ed|at"
$ grep 'w(es)t.*\1' aa
grep '[a-z]\{7\}' *.txt
2.2 运维中常见的邮箱和IP地址的获取
这里用到了-o和-P命令 man grep查看 -o, --only-matching: Show only the part of a matching line that matches PATTERN. -P, --perl-regexp: Interpret PATTERN as a Perl regular expression.
也就是说-o,只显示匹配行中匹配正则表达式的那部分,-P,作为Perl正则匹配
[root@cn01 test]
127.0.0.1
192.168.10.11
192.168.10.255
grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+" file.txt
$ grep -n 'o\{2\}' regular_express.txt
$ grep -n 'go\{2,5\}g' regular_express.txt
$ grep -n 'go\{2,\}g' regular_express.txt
|