一天一个shell命令 linux文本内容操作系列-grep命令详解
从这篇开始,是文本内容操作,区别于文本操作。
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是GlobalRegularExpressionPrint,表示全局正则表达式版本,它的使用权限是所有用户。
shell,perl,python,一直都是文本操作的专家语言,而我们今后学习的的将是shell的噱头--文本操作。下面提到最常见的一个:
grep
这算是文本内容的一个重量级选手,能根据某些规格在上千行的文本文件中查找所需要的数据。他能接受正则表达式和通配符。
础实例:
1.命令翻译包含给定match_pattern的文本行,如我在grep.txt中查找PATTERN
grepPATTERNgrep.txt
orgrep"PATTERN"grep.txt
2.匹配多个文件
grepPATTERNgrep.txtgrep1.txt
3.从stdin中读取
echo–e"thisisaword\nnextline"|grepword
打印:thisisaword
4.grep与正则表达式
grep–E"[a-z]+"
或者
egrep"[a-z]+"
5.只输出匹配部分,而不是匹配的当前行
echothisisline.|greip–o–E"[a-z]+\."
输出:line
6.打印除包含match_pattern的行之外的所有行,可使用
grep-vmatch_patternfile
8.打印行号
grep"text"-nfilename
9.搜2个文件,以及他们的行号,输出会打印文件名
grep"text"–ns1.txts2.txt
10.如果你只想知道哪些文件有单词PATTERN
grep–lPATTERs1.txts2.txt
-L则返回的不匹配文件列表
11.可以再整个目录下查找单词PATTERN在那些文件里
grepPATTERN.-R-n
12同时多个匹配查找
echothisisalineoftext|grep-e"this"-e"line"-o
打印:
this
line
13只在某些合适的文件中搜索
grep"main()".-r--include*.{c,cpp}
只在.c和.cpp结尾的文件中搜索main()
14进行搜索排除某些文件
grep"main()".-r--exclude"README"
排除了所有文件名为"README"的文件
15打印匹配之前或之后的3行
seq10|grep5–A3之前
seq10|grep6–B3之后
16打印匹配前后3行,同时输出
seq10|grep5–C3
我们来看下--help
用法:grep[选项]...PATTERN[FILE]...
在每个FILE或是标准输入中查找PATTERN。
默认的PATTERN是一个基本正则表达式(缩写为BRE)。
例如:grep-i'helloworld'menu.hmain.c
正则表达式选择与解释:
-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字节的数据行,但不是空行
杂项:
-s,--no-messages 不显示错误信息
-v,--invert-match 选中不匹配的行
-V,--version 显示版本信息并退出
--help 显示此帮助并退出
--mmap 忽略向后兼容性
Outputcontrol:
-m,--max-count=NUM stopafterNUMmatches
-b,--byte-offset printthebyteoffsetwithoutputlines
-n,--line-number printlinenumberwithoutputlines
--line-buffered flushoutputoneveryline
-H,--with-filename printthefilenameforeachmatch
-h,--no-filename suppressthefilenameprefixonoutput
--label=LABEL useLABELasthestandardinputfilenameprefix
-o,--only-matching 只显示一行中匹配PATTERN的部分
-q,--quiet,--silent 不显示所有输出
--binary-files=TYPE 假定二进制文件的TYPE类型;
TYPE可以是`binary',`text',或`without-match'
-a,--text 等同于--binary-files=text
-I 等同于--binary-files=without-match
-d,--directories=ACTION 操作目录的方式;
ACTION可以是`read',`recurse',或`skip'
-D,--devices=ACTION 操作设备、先入先出队列、套接字的方式;
ACTION可以是`read'或`skip'
-R,-r,--recursive 等同于--directories=recurse
--include=FILE_PATTERN 只查找匹配FILE_PATTERN的文件
--exclude=FILE_PATTERN 跳过匹配FILE_PATTERN的文件和目录
--exclude-from=FILE 跳过所有除FILE以外的文件
--exclude-dir=PATTERN 跳过所有匹配PATTERN的目录。
-L,--files-without-match 只打印不匹配FILEs的文件名
-l,--files-with-matches 只打印匹配FILES的文件名
-c,--count 只打印每个FILE中的匹配行数目
-T,--initial-tab 行首tabs分隔(如有必要)
-Z,--null 在FILE文件最后打印空字符
文件控制:
-B,--before-context=NUM 打印以文本起始的NUM行
-A,--after-context=NUM 打印以文本结尾的NUM行
-C,--context=NUM 打印输出文本NUM行
-NUM 等同于--context=NUM
--color[=WHEN],
--colour[=WHEN] 使用标志高亮匹配字串;
WHEN可以是`always',`never'或`auto'
-U,--binary 不要清除行尾的CR字符(MSDOS模式)
-u,--unix-byte-offsets 当CR字符不存在,报告字节偏移(MSDOS模式)
‘egrep'即‘grep-E'。‘fgrep'即‘grep-F'。
直接使用‘egrep'或是‘fgrep'均已不可行了。
不带FILE参数,或是FILE为-,将读取标准输入。如果少于两个FILE参数
就要默认使用-h参数。如果选中任意一行,那退出状态为0,否则为1;
如果有错误产生,且未指定-q参数,那退出状态为2。
大多数功能已经在实例中贴出,我的这个博文中,主要参考书籍《linuxshell脚本攻略》
如果你觉得更是个学习时间比较充裕,不妨直接购买此书。