正规的网站制作服务商,竹子建站怎么样,管理手机网站首页,wordpress子目录建站Linux之grep 命令 1. grep 简介
[grep] (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具#xff0c;它能使用正则表达式搜索文本#xff0c;并把匹配的行打印出来。
命令格式#xff1a;grep […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, --regexpPATTERN 用 PATTERN 来进行匹配操作-f, --fileFILE 从 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-countNUM NUM 次匹配后停止-b, --byte-offset 输出的同时打印字节偏移-n, --line-number 输出的同时打印行号--line-buffered 每行输出清空-H, --with-filename 为每一匹配项打印文件名-h, --no-filename 输出时不显示文件名前缀--labelLABEL 将LABEL 作为标准输入文件名前缀-o, --only-matching show only the part of a line matching PATTERN-q, --quiet, --silent suppress all normal output--binary-filesTYPE assume that binary files are TYPE;TYPE is binary, text, or without-match-a, --text equivalent to --binary-filestext-I equivalent to --binary-fileswithout-match-d, --directoriesACTION how to handle directories;ACTION is read, recurse, or skip-D, --devicesACTION how to handle devices, FIFOs and sockets;ACTION is read or skip-r, --recursive like --directoriesrecurse-R, --dereference-recursivelikewise, but follow all symlinks--includeFILE_PATTERNsearch only files that match FILE_PATTERN--excludeFILE_PATTERNskip files and directories matching FILE_PATTERN--exclude-fromFILE skip files matching any file pattern from FILE--exclude-dirPATTERN 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-contextNUM 打印以文本起始的NUM 行-A, --after-contextNUM 打印以文本结尾的NUM 行-C, --contextNUM 打印输出文本NUM 行-NUM same as --contextNUM--group-separatorSEP 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、从文件中读取关键词进行搜索默认是显示的是行
命令1cat test.txt | grep -f test2.txt
命令2显示行号cat test.txt | grep -nf test2.txt
作用输出test.txt文件中含有从test2.txt文件中读取出的关键词的内容行可用于按指定关键词放到一个文件中搜索日志文件。
-o:只显示被模式匹配到的字符串而不是整个行
\# grep -o root /etc/passwd #加o之后的操作只过滤关键字出来
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:root4、从文件中查找关键词忽略大小写默认情况区分大小写
命令1grep ‘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 ‘ab’ * #在当前目录搜索带ab行的文件
# grep -r ‘ab’ * #在当前目录及其子目录下搜索ab行的文件
# grep -l -r ‘ab’ * #在当前目录及其子目录下搜索ab行的文件但是不显示匹配的行只显示匹配的文件
# grep -nr BLOG* . # 查找子目录匹配后输出行号这里的点表示当前目录
# grep -lr BLOG* . #查找子目录匹配后只输出文件名
查询不包含某个目录
#grep -R --exclude-dirnode_modules some pattern /path/to/search #不包含txt目录 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 #不分大小写。test.txt里面包含abc过滤条件的为2行
2
# grep -yc abc test.txt #-c呢就是不显示行的内容直接显示有几行
# grep -c ^.*$ /etc/passwd #那么我们除了wc -l用来统一一个文件有多少行以外又多了一种统计文件多少行的方法
55
# cat /etc/passwd|wc -l 9、 -m的使用
# grep -m 3 abc test2.txt #只匹配到了第三行就退出了
abc 1
abc 2
abc 33. 与正则表达式结合**
grep的规则表达式:
\ 反义字符如\\表示匹配[ - ] 匹配一个范围[0-9a-zA-Z]匹配所有数字和字母* 所有字符长度可为0 前面的字符出现了一次或者多次^ #匹配行的开始 如^grep匹配所有以grep开头的行。
$ #匹配行的结束 如grep$匹配所有以grep结尾的行。
. #匹配一个非换行符的字符 如gr.p匹配gr后接一个任意字符然后是p。
* #匹配零个或多个先前字符 如*grep匹配所有一个或多个空格后紧跟grep的行。
.* #一起用代表任意字符。
[] #匹配一个指定范围内的字符如[Gg]rep匹配Grep和grep。
[^] #匹配一个不在指定范围内的字符如[^A-FH-Z]rep匹配不包含A-R和T-Z的一个字母开头紧跟rep的行。
\(..\) #标记匹配字符如\(love\)love被标记为1。
\ #到匹配正则表达式的行开始如:\grep匹配包含以grep开头的单词的行。
\ #到匹配正则表达式的行结束如grep\匹配包含以grep结尾的单词的行。
x\{m\} #重复字符xm次如0\{5\}匹配包含5个o的行。
x\{m,\} #重复字符x,至少m次如o\{5,\}匹配至少有5个o的行。
x\{m,n\} #重复字符x至少m次不多于n次如o\{5,10\}匹配5--10个o的行。
\w #匹配文字和数字字符也就是[A-Za-z0-9]如G\w*p匹配以G后跟零个或多个文字或数字字符然后是p。
\W #\w的反置形式匹配一个或多个非单词字符如点号句号等。
\b #单词锁定符如: \bgrep\b只匹配grep。
2.1 常用命令
首与行尾字节 ^ $^ 符号在字符类符号(括号[])之内与之外是不同的 在 [] 内代表『反向选择』在 [] 之外则代表定位在行首的意义
$ ls -l | grep \^a\
$ ls -l | grep ^a
$ ls -l | grep -v \^a\ #输出非a开头的行反向选择
$ grep -n ^$ a.txt #找出空白行因为只有行首跟行尾 (^$)
$ grep \test\ d* #显示所有以d开头的文件中包含test的行。
$ cat test.txt |grep hat$ #输出以hat结尾的行内容
$ grep \test\ aa bb cc #显示在aabbcc文件中匹配test的行
$ 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 #显示包含ed或者at字符的内容行
$ grep w(es)t.*\1 aa #如果west被匹配则es就被存储到内存中并标记为1然后搜索任意个字符.*这些字符后面紧跟着另外一个es1找到就显示该行
grep [a-z]\{7\} *.txt #显示当前目录下面以.txt 结尾的文件中的所有包含每个字符串至少有7个连续小写字符的字符串的行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正则匹配
[rootcn01 test]# ip a|grep -oP ([0-9]{1,3}\.){3}[0-9]{1,3}
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 #要找出 g 后面接 2 到 5 个 o 然后再接一个 g 的字串
$ grep -n go\{2,\}g regular_express.txt #想要的是 2 个 o 以上的 goooo....g 呢除了可以是 gooo*g