shell脚本——grep详解
shell脚本——grep详解
⼀、基本⽤法
grep是linux中很常⽤的⼀个命令,主要功能就是进⾏字符串数据的对⽐,能使⽤正则表达式搜索⽂本,并将符合⽤户需求的字符串打印出来。grep全称是Global Regular Expression Print,表⽰全局正则表达式版本,它的使⽤权限是所有⽤户。grep在数据中查出⼀个字符串时,是以整⾏为单位来进⾏数据选取的。
Linux系统中grep命令是⼀种强⼤的⽂本搜索⼯具,它能使⽤正则表达式搜索⽂本,并把匹配的⾏打印出来。grep全称是Global Regular Expression Print,表⽰全局正则表达式版本,它的使⽤权限是所有⽤户。
1、命令格式
grep [cinvs] 'patten' filename
2、主要参数 [options]主要参数:
1  -a或--text  不要忽略⼆进制的数据。
2  -A<;显⽰列数>或--after-context=<;显⽰列数>  除了显⽰符合范本样式的那⼀列之外,并显⽰该列之后的内容。
3  -b或--byte-offset  在显⽰符合范本样式的那⼀列之前,标⽰出该列第⼀个字符的位编号。
4  -B<;显⽰列数>或--before-context=<;显⽰列数>  除了显⽰符合范本样式的那⼀列之外,并显⽰该列之前的内容。
5  -c或--count  计算符合范本样式的列数。
6  -C<;显⽰列数>或--context=<;显⽰列数>或-<;显⽰列数>  除了显⽰符合范本样式的那⼀列之外,并显⽰该列之前后的内容。
7  -d<;进⾏动作>或--directories=<;进⾏动作>  当指定要查的是⽬录⽽⾮⽂件时,必须使⽤这项参数,否则grep指令将回报信息并停⽌动作。
8  -e<;范本样式>或--regexp=<;范本样式>  指定字符串做为查⽂件内容的范本样式。
9  -E或--extended-regexp  将范本样式为延伸的普通表⽰法来使⽤。
10  -f<;范本⽂件>或--file=<;范本⽂件>  指定范本⽂件,其内容含有⼀个或多个范本样式,让grep查符合范本条件的⽂件内容,格式为每列⼀个范本样式。
11  -F或--fixed-regexp  将范本样式视为固定字符串的列表。
12  -G或--basic-regexp  将范本样式视为普通的表⽰法来使⽤。
13  -h或--no-filename  在显⽰符合范本样式的那⼀列之前,不标⽰该列所属的⽂件名称。
14  -H或--with-filename  在显⽰符合范本样式的那⼀列之前,表⽰该列所属的⽂件名称。
15  -i或--ignore-case忽略字符⼤⼩写的差别。
16  -l或--file-with-matches  列出⽂件内容符合指定的范本样式的⽂件名称。
17  -L或--files-without-match  列出⽂件内容不符合指定的范本样式的⽂件名称。
18  -n或--line-number  在显⽰符合范本样式的那⼀列之前,标⽰出该列的列数编号。
19  -q或--quiet或--silent  不显⽰任何信息。
netstat命令详解linux20  -r或--recursive  此参数的效果和指定“-d recurse”参数相同。
21  -s或--no-messages  不显⽰错误信息。
22  -v或--revert-match  反转查。
23  -V或--version  显⽰版本信息。
24  -w或--word-regexp  只显⽰全字符合的列。
25  -x或--line-regexp  只显⽰全列符合的列。
26  -y  此参数的效果和指定“-i”参数相同。
27  --help  在线帮助。
-v或--revert-match  反转查。例如:
1 [alwen@alwen grep]$ grep -Ein '^linux' 
21:linux  is file system
37:Linux flume
4 [alwen@alwen grep]$ grep -Einv '^linux' 
52:haoop is file system
63:java is an languange
74:scala is languange too.
85:python is解释性语⾔。
96:hive  spark kafka
108:zookeeper
119:hbase  linux
1210:flink
1311:c++
1412:azkaban
1513:192.168.17.137
3、 pattern正则表达式主要参数:
1 \:忽略正则表达式中特殊字符的原有含义。
2 ^:匹配正则表达式的开始⾏。
3 $: 匹配正则表达式的结束⾏。
4 \<:从匹配正则表达式的⾏开始。
5 \>:到匹配正则表达式的⾏结束。
6 [ ]:单个字符,如[A]即A符合要求。
7 [ - ]:范围,如[A-Z],即A、B、C⼀直到Z都符合要求。
8 .:所有的单个字符。
9 * :有字符,长度可以为0
注意:[^ ]  :^在[]括号内时表⽰⾮,相反的意思,例如:
1 [alwen@alwen grep]$ grep -Ein '^[^linux]' 
22:haoop is file system
33:java is an languange
44:scala is languange too.
55:python is解释性语⾔。
66:hive  spark kafka
78:zookeeper
89:hbase  linux
910:flink
1011:c++
1112:azkaban
1213:192.168.17.137
1 $ grep ‘test’ d*
2显⽰所有以d开头的⽂件中包含 test的⾏。
3 $ grep ‘test’ aa bb cc
4显⽰在aa,bb,cc⽂件中匹配test的⾏。
5 $ grep ‘[a-z]\{5\}’ aa
6显⽰所有包含每个字符串⾄少有5个连续⼩写字符的字符串的⾏。
7 $ grep ‘w\(es\)t.*\1′ aa
8如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后⾯紧跟
着另外⼀个es(\1),到就显⽰该⾏。如果⽤egrep或grep -E,就不⽤”\”号进⾏转义,直接写成’w(es)t.*\1′就可以了 9    #netstat -nap|grep80
10上⾯命令查询监听80端⼝的⾏。
11      #grep -n "world"
12查询⽂件中含有"world"字符串的⾏,并显⽰⾏号。
13      #grep -n "printf" main.c hello.c world.c
14在源码⽂件main.c、hello.c和world.c中查询调⽤了printf函数的⾏,并显⽰⾏号。
15      #grep -n "printf" *
16在当前⽬录的所有⽂件中查询调⽤了printf函数的⾏,并显⽰⾏号。也可以指定路径,⽐如:/usr/local/include/*。
17    #grep -r "printf" *
18在当前⽬录及所有⼦⽬录下递归查调⽤了printf函数的⾏,并显⽰⾏号。
1假设您正在’/usr/src/Linux/Doc’⽬录下搜索带字符串’magic’的⽂件:
2 $ grep magic /usr/src/Linux/Doc/*
<:* How do I enable the magic SysRQ key?
<:* How do I use the magic SysRQ key?
5其中⽂件’’包含该字符串,讨论的是 SysRQ 的功能。
6默认情况下,’grep’只搜索当前⽬录。如果此⽬录下有许多⼦⽬录,’grep’会以如下形式列出:
7grep: sound: Is a directory
8这可能会使’grep’ 的输出难于阅读。这⾥有两种解决的办法:
9明确要求搜索⼦⽬录:grep -r
10或忽略⼦⽬录:grep -d skip
11如果有很多输出时,您可以通过管道将其转到’less’上阅读:
12$ grep magic /usr/src/Linux/Documentation/* | less
13这样,您就可以更⽅便地阅读。
下⾯还有⼀些有意思的命令⾏参数:
1grep -i pattern files :不区分⼤⼩写地搜索。默认情况区分⼤⼩写,
2grep -l pattern files :只列出匹配的⽂件名,
3grep -L pattern files :列出不匹配的⽂件名,
4grep -w pattern files :只匹配整个单词,⽽不是字符串的⼀部分(如匹配’magic’,⽽不是’magical’),
5grep -C number pattern files :匹配的上下⽂分别显⽰[number]⾏,
6grep pattern1 | pattern2 files :显⽰匹配 pattern1 或 pattern2 的⾏,
7grep pattern1 files | grep pattern2 :显⽰既匹配 pattern1 ⼜匹配 pattern2 的⾏。
8
9grep -n pattern files  即可显⽰⾏号信息
10
11grep -c pattern files  即可查总⾏数
12
13这⾥还有些⽤于搜索的特殊符号:
14 \< 和 \> 分别标注单词的开始与结尾。
15例如:
16grep man * 会匹配 ‘Batman’、’manic’、’man’等,
17grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’,
18grep ‘\<man\>’ 只匹配’man’,⽽不是’Batman’或’manic’等其他的字符串。
19 ‘^’:指匹配的字符串在⾏⾸,
20 ‘$’:指匹配的字符串在⾏尾,
[alwen@alwen grep]$ grep -En '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' 
13:192.168.17.137
匹配空⾏:
1 [alwen@alwen grep]$ grep -En '^$'
212:
313:
匹配指定个数:
1 [alwen@alwen grep]$ grep  -En "a{3,5}"
213:aaa
315:aaaaaa
416:aaaa
518:aaaaaaaa
619:aaaaaaaaaaaa
7 [alwen@alwen grep]$ grep  -En "^a{3,5}$"
813:aaa
916:aaaa
查⽂件或⽂件夹:
1 [alwen@alwen opt]$ ll |grep -En '^-'
22:-rw-rw-r--. 1 alwen alwen  0 6⽉822:57 file
33:-rw-rw-r--. 1 alwen alwen  0 6⽉822:57 file1
44:-rw-rw-r--. 1 alwen alwen  0 6⽉822:57 file2
5 [alwen@alwen opt]$ ll |grep -En '^d'
65:drwxrwxr-x. 2 alwen alwen  22 6⽉822:48 grep
76:drwxrwxr-x+ 2 root  root    6 10⽉312018 rh
87:drwxrwxr-x+ 3 root  root  114 6⽉722:21 shell

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。