一天一个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脚本攻略》
如果你觉得更是个学习时间比较充裕,不妨直接购买此书。