Grep 总有你不知道的

本文详细介绍了Linux下grep命令的使用方法,包括基本用法、正则表达式、输出控制选项等,帮助读者掌握grep的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

grep

grep ”
grep “”
grep -v ”
-i 忽略大小写
-w 匹配单词
-G 普通正则
-f obtain PATTERN from FILE

output 输出选项:

-n print line number with output lines
-H print file name with output lines 一般会输出名字
-h 不输出文件名前缀
-o show only the part of a line matching PATTERN
-B 打印文本及前面几行 # backgroud
-A 打印文本及后面几行 #ahead
-m 输出匹配的前多少行 =grep chr file|head -n int

‘egrep’即‘grep -E’
egrep ‘chr{2,}’ file 或egrep ‘chr{2,4}’ file #{min,max} 大于等于min小于等于max。详情请参考下面截图示例。
grep -e ” -e ” # either or both match output [grep的或选项]
grep ” |grep ” [grep 的和选项]
本人常用:
-A // grep chr -A1 ref.fa
-B //
-h //
-w //grep -w “chr1” ref.fa
-v 去除match
-n 输出match的行数
grep –color //我一般会把它键入环境变量 .bashrc [alias grep = ‘grep –color=auto’]
-E
-c 计算match 数 不含-A/-B行数。相当于grep chr file|wc -l
-l grep的内容列出文件名,有点像win系统的查找内容显示文件名 //-L反向功能
-o 只输出匹配上的字符
grep -E “[1-9]+” == egrep “[1-9]+” || echo this is a test line. | grep -o -E “[a-z]+.”

切记grep ‘>’file一定要加‘’,否则清空文件,因为我总用grep > file 这么清空文件!!哈哈

这里写图片描述 这里写图片描述

这里写图片描述

这里写图片描述 多匹配请使用双引号

这里写图片描述

这里写图片描述

echo gun is not unix | grep -b -o “not”
7:not

一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 -b -o 一般总是配合使用。

grep “text” . -r -n

.表示当前目录。

cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o

grep “main()” . -r –include *.{php,html}
grep “main()” . -r –exclude “README”
grep “main()” . -r –exclude-from filelist

只在目录中所有的.php和.html文件中递归搜索字符”main()”
在搜索结果中排除所有README文件
在搜索结果中排除filelist文件列表里的文件
:参看参数 -R –include=FILE_PATTERN等。

grep -w ‘[vV]ivek[0-9]’
grep ‘^\s[a-z]*’ ref.changelog.2
schr012 chr012 ^\s以空格开头
$ grep ‘\< chr.1\ >’ ref.changelog.2
schr11 chr11

\< 匹配单词前面的空字符串
\ > 匹配单词后面的空字符串 #之间没有空格

grep ‘^..$’ 文件名

打印出只有两个字符的所有行:

egrep ‘[[:digit:]]{1,3}.’ file # eg168.

egrep ‘co{1,2}l’ file
输出co和l中有一个或者2个字符的行

//以下内容单纯粘贴,

正则表达式限定符

限定符

描述

. 匹配任意的一个字符。
? 匹配前面的子表达式,最多一次。
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
{N} 匹配前面的子表达式 N 次。
{N,} 匹配前面的子表达式 N 次到多次。
{N,M} 匹配前面的子表达式 N 到 M 次,至少 N 次至多 M 次。
- 只要不是在序列开始、结尾或者序列的结束点上,表示序列范围。
^ 匹配一行开始的空字符串;也表示字符不在要匹配的列表中。
$ 匹配一行末尾的空字符串。
\b 匹配一个单词前后的空字符串。
\B 匹配一个单词中间的空字符串。
\< 匹配单词前面的空字符串。
> 匹配单词后面的空字符串。

grep 和 egrep

egrep 等同于 grep -E 。它会以扩展的正则表达式的模式来解释模式。下面来自 grep 的帮助页:

基本的正则表达式元字符 ?、+、 {、 |、 ( 和 ) 已经失去了它们原来的意义,要使用的话用反斜线的版本 \?、+、{、|、( 和 ) 来代替。 传统的 egrep 并不支持 { 元字符,一些 egrep 的实现是以 { 替代的,所以一个可移植的脚本应该避免在 grep -E 使用 { 符号,要匹配字面的 { 应该使用 [}]。

GNU grep -E 试图支持传统的用法,如果 { 出在在无效的间隔规范字符串这前,它就会假定 { 不是特殊字符。

例如,grep -E ‘{1’ 命令搜索包含 {1 两个字符的串,而不会报出正则表达式语法错误。

POSIX.2 标准允许这种操作的扩展,但在可移植脚本文件里应该避免这样使用。

参考:
•grep 和 regex 帮助手册页(7)
•grep 的 info 页

参考:http://man.linuxde.net/grep
https://linux.cn/article-6941-1.html

那么问题来了:
用linux命令查看一个字符串在文件里出现的次数,并只输出match的字符??

04-26
### 关于 `grep` 命令的使用方法 #### 基本语法 `grep` 的基本语法如下所示: ```bash grep [选项] 模式 文件名 ``` 其中,`模式` 表示要搜索的内容,可以是一个简单的字符串或者复杂的正则表达式。 --- #### 常见选项及其功能说明 1. **显示匹配行的行号** 使用 `-n` 参数可以在输出中显示每行对应的行号[^3]。 ```bash grep -n "pattern" filename ``` 2. **忽略大小写** 如果希望区分大小写进行匹配,则可使用 `-i` 参数。 ```bash grep -i "Pattern" filename ``` 3. **递归搜索目录中的所有文件** 当需要在一个目录下递归地查找包含某些内容的文件时,可以使用 `-r` 或者 `--recursive` 选项[^1]。 ```bash grep -r "search_term" /path/to/directory/ ``` 4. **只显示文件名** 若只需要知道哪些文件包含了某个特定字符串而需要看到具体内容,那么可以通过添加 `-l` 来实现这一点[^2]。 ```bash grep -rl "string_to_search_for" . ``` 5. **统计匹配次数** 若要了解某字符串在整个文档里出现了多少次,可以用到 `-c` 这个参数来计数而是打印出具体的每一行[^1]。 ```bash grep -c "word_or_phrase" textfile.txt ``` 6. **高亮显示关键词** 添加 `--color=auto` 可让终端自动给找到的结果加上颜色标记以便更直观地区分它们;另外也可以通过设置环境变量简化操作流程。 ```bash GREP_OPTIONS='--color=always'; export GREP_OPTIONS grep --color=always 'keyword' somefile.log ``` 7. **前后上下文展示** 对于想要查看目标词句周围的更多信息的情况来说非常有用。比如下面的例子会连同匹配项之后紧接着的五行为止一并呈现出来: ```bash grep -A5 "context_word" source_code.cpp ``` 8. **排除二进制数据处理** 默认情况下如果遇到二进制类型的资料可能会引发警告消息干扰正常阅读体验,此时加入 `--text` 就能够强制将其当作纯文本对待从而避免此类情况发生[^2]. ```bash grep --text "binary_content_check" suspicious_binary_file.dat ``` 9. **静默模式 (仅返回状态码)** 在脚本编写过程中有时并关心具体结果而是单纯依赖执行成功与否作为判断依据的话可以选择启用此特性即附加 `-q`, 它会有任何屏幕上的反馈除非调用失败才会退出非零值表示错误[^1]. ```bash if grep -q "error_message" log_output; then echo "Error detected"; fi ``` --- #### 实际应用案例分析 假设有一个名为 `access_log` 的日志文件,我们想从中提取访问 IP 地址的信息: ```bash cat access_log | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" ``` 这里运用到了管道符以及扩展型正则表达式的概念共同完成任务需求[^2]. 另一个例子是从多个配置文件当中定位含有敏感权限设定的位置: ```bash find . -name "*.conf" -exec grep -Hn "root|sudo" {} \; ``` 这段命令先利用 find 查找当前路径下的所有 `.conf` 结尾的文件再逐一对这些候选对象实施精确检索并将发现位置告知用户. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值