grep命令的介绍
grep(Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrep和fgrep。grep是一个全局查找正则表达式并且打印结果行的命令。它的输入是一个文件或者是一个标准输入,它的输出一般是打印在屏幕上。
grep是如何工作:
grep命令在一个或者多个文件中查找某个字符模式。如果这个模式中包含空格,就必须用引号把它括起来。grep命令中,模式可以是一个被引号括起来的字符串,也可以是单个词,位于模式之后所有的单词都被视为文件名。grep将输出发送到屏幕,它不会对输入文件进行任何修改或变化。
格式:
grep [选项] 模式 [文件...]
参数:
- -a 或 --text : 不要忽略二进制的数据。
- -A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
- -b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
- -B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
- -c 或 --count : 计算符合样式的列数。
- -C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
- -d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
- -e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
- -E 或 --extended-regexp : 将样式为延伸的普通表示法来使用。
- -f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
- -F 或 --fixed-regexp : 将样式视为固定字符串的列表。
- -G 或 --basic-regexp : 将样式视为普通的表示法来使用。
- -h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
- -H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
- -i 或 --ignore-case : 忽略字符大小写的差别。
- -l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
- -L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
- -n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
- -o 或 --only-matching : 只显示匹配PATTERN 部分。
- -q 或 --quiet或--silent : 不显示任何信息。
- -r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
- -s 或 --no-messages : 不显示错误信息。
- -v 或 --revert-match : 显示不包含匹配文本的所有行。
- -V 或 --version : 显示版本信息。
- -w 或 --word-regexp : 只显示全字符合的列。
- -x --line-regexp : 只显示全列符合的列。
- -y : 此参数的效果和指定"-i"参数相同。
小提示一:测试之前可以设置grep查找之后,输出的内容带有颜色,方便观察,设置如下:
方法一:设置环境变量 export GREP_OPTIONS="--color=auto"
如果想要取消使用-n参数 export -n GREP_OPTIONS="--color=auto"
方法二:修改~/.bashrc 添加如下内容 alias grep='grep --color=auto',退出保存 ,让文件生效:source ~/.bashrc
小提示二:linux中的grep命令,单引号,双引号,和不加引号的区别
单引号:单引号是全引用,被单引号括起来的内容不管是常量还是变量都不会发生替换
双引号:双引号是部分引用,如果内容中有命令或者变量等,会先把命令解析出来,然后输出最终内容,被双引号括起来的内容常量还是常量,变量会发生替换,替换成变量内容。
不加引号:不会将空格的字符串视为一个整体输出,如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。
一般情况下只有常量用单引号括起来,如果有变量使用双引号括起来
grep的个别参数使用
测试文件如下:
1.显示grep的版本号,使用参数-V
2.找出文本中带有wo的行(不区分大小写),使用参数 -i
3.显示不包含wo的行 使用参数 -v
4.统计带有 Wo 的行的个数,参数 -c
5.打印带有hello的行,并且所在的行号,使用参数 -n
正则表达式元字符
元字符 | 功能 | 示例 | 示例的匹配对象 |
---|---|---|---|
^ | 行首定位符 | /^test/ | 匹配所有test开头的行 |
$ | 行尾定位符 | /test$/ | 匹配所有test结尾的行 |
. | 匹配除换行外的单个字符 | /t..t/ | 匹配包含字符t、后跟两个任意字符、在跟字母t的行 |
* | 匹配零个或多个前边的字符 | /test*/ | 匹配test字符,并且最后一个t可以是0或者多个 |
[] | 匹配指定字符组内任一字符 | [Tt]est | 匹配test或者Test |
[^] | 匹配不在指定字符组内任一字符 | [^123]test | 匹配包含test,但是前边的字符不是123 |
x\{m\} | 连续m个x | a\{5\} | 连续5个a |
x\{m,\} | 至少m个x | a\{5,\} | 至少有连续的5个a |
x\{m,n\} | 至少m个x,最多n个x | a\{5,10\} | 最少5个a,但是不超过10个a |
(pattern) | 匹配pattern并获取这一匹配 | ([0-9]).*\1 | 匹配数字0-9,\1表示匹配与前面相同的数字 |
实例:
以下是测试过程中会用到的测试文件内容,(这里特地创建一个目录linux_test用来存放测试文件,测试文件名为grep.txt,文件内容是复制的/etc/passwd文件的前十条内容,如下显示):
问题一:.打印文件grep.txt文件中,包含正则表达式no的行
问题二:打印字母a开头的行,使用^行首定位符
问题三:打印login结尾的行,并显示所在行号,使用$行尾定位符
问题四:打印带有字符bin的行,并且在bin后面跟上任意一个字符
问题五:打印连续两个字母o字符所在行
问题六:打印至少一个字母o,o*表示匹配字母o,并且后面可以跟另个或者多个o
问题七:匹配字符o,并且匹配o后面所有的内容,.*匹配所有内容
问题八:匹配字符bin,并且前边的字符是/或者是s
问题九:匹配字符bin,并且前边的字符不是/,s
问题十:显示/proc/meminfo文件中不区分大小写,并且以s开头的
问题十一:显示/etc/passwd文件中以nologin结尾的行
问题十二:显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意字符的行;
问题十三:显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
问题十四:显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
问题十五:显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;
问题十六:匹配以数字开头,后面跟一个小写字母,最后在匹配与前面相同的字母
(\2表示匹配前面第2个()里面的内容,()需要使用\进行转义)
问题十七:使用ifconfig eth0获得有关ip的信息,并且去获取10.0.0.110
这里结合cut使用,-d后边代表的是分隔符 -f后面的数字表示的是分割的列数