2019-04-21 11:50:48 +08:00

172 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<h1 id="grep">grep</h1>
<p>强大的文本搜索工具</p>
<h2 id="补充说明">补充说明</h2>
<p><strong>grep</strong> global search regular expression(RE) and print out the line全面搜索正则表达式并把行打印出来是一种强大的文本搜索工具它能使用正则表达式搜索文本并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。</p>
<h3 id="选项">选项</h3>
<div class="sourceCode" id="cb1"><pre><code class="language-bash"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="ex">-a</span> --text # 不要忽略二进制数据。</a>
<a class="sourceLine" id="cb1-2" data-line-number="2"><span class="ex">-A</span> <span class="op">&lt;</span>显示行数<span class="op">&gt;</span> --after-context=<span class="op">&lt;</span>显示行数<span class="op">&gt;</span> # 除了显示符合范本样式的那一行之外,并显示该行之后的内容。</a>
<a class="sourceLine" id="cb1-3" data-line-number="3"><span class="ex">-b</span> --byte-offset # 在显示符合范本样式的那一行之外,并显示该行之前的内容。</a>
<a class="sourceLine" id="cb1-4" data-line-number="4"><span class="ex">-B</span><span class="op">&lt;</span>显示行数<span class="op">&gt;</span> --before-context=<span class="op">&lt;</span>显示行数<span class="op">&gt;</span> # 除了显示符合样式的那一行之外,并显示该行之前的内容。</a>
<a class="sourceLine" id="cb1-5" data-line-number="5"><span class="ex">-c</span> --count # 计算符合范本样式的列数。</a>
<a class="sourceLine" id="cb1-6" data-line-number="6"><span class="ex">-C</span><span class="op">&lt;</span>显示行数<span class="op">&gt;</span> --context=<span class="op">&lt;</span>显示行数<span class="op">&gt;</span>或-<span class="op">&lt;</span>显示行数<span class="op">&gt;</span> <span class="co"># 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。</span></a>
<a class="sourceLine" id="cb1-7" data-line-number="7"><span class="ex">-d</span><span class="op">&lt;</span>进行动作<span class="op">&gt;</span> --directories=<span class="op">&lt;</span>动作<span class="op">&gt;</span> # 当指定要查找的是目录而非文件时必须使用这项参数否则grep命令将回报信息并停止动作。</a>
<a class="sourceLine" id="cb1-8" data-line-number="8"><span class="ex">-e</span><span class="op">&lt;</span>范本样式<span class="op">&gt;</span> --regexp=<span class="op">&lt;</span>范本样式<span class="op">&gt;</span> # 指定字符串作为查找文件内容的范本样式。</a>
<a class="sourceLine" id="cb1-9" data-line-number="9"><span class="ex">-E</span> --extended-regexp # 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。</a>
<a class="sourceLine" id="cb1-10" data-line-number="10"><span class="ex">-f</span><span class="op">&lt;</span>范本文件<span class="op">&gt;</span> --file=<span class="op">&lt;</span>规则文件<span class="op">&gt;</span> # 指定范本文件其内容有一个或多个范本样式让grep查找符合范本条件的文件内容格式为每一列的范本样式。</a>
<a class="sourceLine" id="cb1-11" data-line-number="11"><span class="ex">-F</span> --fixed-regexp # 将范本样式视为固定字符串的列表。</a>
<a class="sourceLine" id="cb1-12" data-line-number="12"><span class="ex">-G</span> --basic-regexp # 将范本样式视为普通的表示法来使用。</a>
<a class="sourceLine" id="cb1-13" data-line-number="13"><span class="ex">-h</span> --no-filename # 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。</a>
<a class="sourceLine" id="cb1-14" data-line-number="14"><span class="ex">-H</span> --with-filename # 在显示符合范本样式的那一列之前,标示该列的文件名称。</a>
<a class="sourceLine" id="cb1-15" data-line-number="15"><span class="ex">-i</span> --ignore-case # 忽略字符大小写的差别。</a>
<a class="sourceLine" id="cb1-16" data-line-number="16"><span class="ex">-l</span> --file-with-matches # 列出文件内容符合指定的范本样式的文件名称。</a>
<a class="sourceLine" id="cb1-17" data-line-number="17"><span class="ex">-L</span> --files-without-match <span class="co"># 列出文件内容不符合指定的范本样式的文件名称。</span></a>
<a class="sourceLine" id="cb1-18" data-line-number="18"><span class="ex">-n</span> --line-number # 在显示符合范本样式的那一列之前,标示出该列的编号。</a>
<a class="sourceLine" id="cb1-19" data-line-number="19"><span class="ex">-q</span> --quiet或--silent # 不显示任何信息。</a>
<a class="sourceLine" id="cb1-20" data-line-number="20"><span class="ex">-R/-r</span> --recursive # 此参数的效果和指定“-d recurse”参数相同。</a>
<a class="sourceLine" id="cb1-21" data-line-number="21"><span class="ex">-s</span> --no-messages # 不显示错误信息。</a>
<a class="sourceLine" id="cb1-22" data-line-number="22"><span class="ex">-v</span> --revert-match <span class="co"># 反转查找。</span></a>
<a class="sourceLine" id="cb1-23" data-line-number="23"><span class="ex">-V</span> --version # 显示版本信息。 </a>
<a class="sourceLine" id="cb1-24" data-line-number="24"><span class="ex">-w</span> --word-regexp # 只显示全字符合的列。</a>
<a class="sourceLine" id="cb1-25" data-line-number="25"><span class="ex">-x</span> --line-regexp # 只显示全列符合的列。</a>
<a class="sourceLine" id="cb1-26" data-line-number="26"><span class="ex">-y</span> <span class="co"># 此参数效果跟“-i”相同。</span></a>
<a class="sourceLine" id="cb1-27" data-line-number="27"><span class="ex">-o</span> <span class="co"># 只输出文件中匹配到的部分。</span></a></code></pre></div>
<h3 id="规则表达式">规则表达式</h3>
<div class="sourceCode" id="cb2"><pre><code class="language-bash"><a class="sourceLine" id="cb2-1" data-line-number="1">^ # 锚定行的开始 如:<span class="st">&#39;^grep&#39;</span>匹配所有以<span class="ex">grep</span>开头的行。 </a>
<a class="sourceLine" id="cb2-2" data-line-number="2">$ # 锚定行的结束 如:<span class="st">&#39;grep$&#39;</span>匹配所有以<span class="ex">grep</span>结尾的行。 </a>
<a class="sourceLine" id="cb2-3" data-line-number="3"><span class="bu">.</span> # 匹配一个非换行符的字符 如:<span class="st">&#39;gr.p&#39;</span>匹配<span class="ex">gr</span>后接一个任意字符然后是p。 </a>
<a class="sourceLine" id="cb2-4" data-line-number="4"><span class="ex">*</span> # 匹配零个或多个先前字符 如:<span class="st">&#39;*grep&#39;</span>匹配所有一个或多个空格后紧跟grep的行。 </a>
<a class="sourceLine" id="cb2-5" data-line-number="5"><span class="ex">.*</span> # 一起用代表任意字符。 </a>
<a class="sourceLine" id="cb2-6" data-line-number="6">[] # 匹配一个指定范围内的字符,如<span class="st">&#39;[Gg]rep&#39;</span>匹配<span class="ex">Grep</span>和grep。 </a>
<a class="sourceLine" id="cb2-7" data-line-number="7">[^] # 匹配一个不在指定范围内的字符,如:<span class="st">&#39;[^A-FH-Z]rep&#39;</span>匹配不包含<span class="ex">A-R</span>和T-Z的一个字母开头紧跟rep的行。 </a>
<a class="sourceLine" id="cb2-8" data-line-number="8"><span class="dt">\(</span><span class="ex">..</span><span class="dt">\)</span> # 标记匹配字符,如<span class="st">&#39;\(love\)&#39;</span>love被标记为1。 </a>
<a class="sourceLine" id="cb2-9" data-line-number="9"><span class="dt">\&lt;</span> # 锚定单词的开始,如:<span class="st">&#39;\&lt;grep&#39;</span>匹配包含以<span class="ex">grep</span>开头的单词的行。 </a>
<a class="sourceLine" id="cb2-10" data-line-number="10"><span class="dt">\&gt;</span> # 锚定单词的结束,如<span class="st">&#39;grep\&gt;&#39;</span>匹配包含以<span class="ex">grep</span>结尾的单词的行。 </a>
<a class="sourceLine" id="cb2-11" data-line-number="11"><span class="ex">x</span><span class="dt">\{</span>m<span class="dt">\}</span> # 重复字符xm次<span class="st">&#39;0\{5\}&#39;</span>匹配包含5个o的行。 </a>
<a class="sourceLine" id="cb2-12" data-line-number="12"><span class="ex">x</span><span class="dt">\{</span>m,<span class="dt">\}</span> # 重复字符x,至少m次<span class="st">&#39;o\{5,\}&#39;</span>匹配至少有5个o的行。 </a>
<a class="sourceLine" id="cb2-13" data-line-number="13"><span class="ex">x</span><span class="dt">\{</span>m,n<span class="dt">\}</span> # 重复字符x至少m次不多于n次<span class="st">&#39;o\{5,10\}&#39;</span>匹配5--10个o的行。 </a>
<a class="sourceLine" id="cb2-14" data-line-number="14">\<span class="fu">w</span> # 匹配文字和数字字符,也就是[A-Za-z0-9],如:<span class="st">&#39;G\w*p&#39;</span>匹配以G后跟零个或多个文字或数字字符然后是p。 </a>
<a class="sourceLine" id="cb2-15" data-line-number="15">\<span class="ex">W</span> # \w的反置形式匹配一个或多个非单词字符如点号句号等。 </a>
<a class="sourceLine" id="cb2-16" data-line-number="16">\<span class="ex">b</span> # 单词锁定符,如: <span class="st">&#39;\bgrep\b&#39;</span>只匹配grep。 </a></code></pre></div>
<h2 id="grep命令常见用法">grep命令常见用法</h2>
<p>在文件中搜索一个单词,命令会返回一个包含 <strong>“match_pattern”</strong> 的文本行:</p>
<pre><code class="language-bash">grep match_pattern file_name
grep &quot;match_pattern&quot; file_name
</code></pre>
<p>在多个文件中查找:</p>
<pre><code class="language-bash">grep &quot;match_pattern&quot; file_1 file_2 file_3 ...
</code></pre>
<p>输出除之外的所有行 <strong>-v</strong> 选项:</p>
<pre><code class="language-bash">grep -v &quot;match_pattern&quot; file_name
</code></pre>
<p>标记匹配颜色 <strong>color=auto</strong> 选项:</p>
<pre><code class="language-bash">grep &quot;match_pattern&quot; file_name --color=auto
</code></pre>
<p>使用正则表达式 <strong>-E</strong> 选项:</p>
<pre><code class="language-bash">grep -E &quot;[1-9]+&quot;
egrep &quot;[1-9]+&quot;
</code></pre>
<p>只输出文件中匹配到的部分 <strong>-o</strong> 选项:</p>
<pre><code class="language-bash">echo this is a test line. | grep -o -E &quot;[a-z]+\.&quot;
line.
echo this is a test line. | egrep -o &quot;[a-z]+\.&quot;
line.
</code></pre>
<p>统计文件或者文本中包含匹配字符串的行数 <strong>-c</strong> 选项:</p>
<pre><code class="language-bash">grep -c &quot;text&quot; file_name
</code></pre>
<p>输出包含匹配字符串的行数 <strong>-n</strong> 选项:</p>
<pre><code class="language-bash">grep &quot;text&quot; -n file_name
cat file_name | grep &quot;text&quot; -n
#多个文件
grep &quot;text&quot; -n file_1 file_2
</code></pre>
<p>打印样式匹配所位于的字符或字节偏移:</p>
<pre><code class="language-bash">echo gun is not unix | grep -b -o &quot;not&quot;
7:not
#一行中字符串的字符便宜是从该行的第一个字符开始计算起始值为0。选项 **-b -o** 一般总是配合使用。
</code></pre>
<p>搜索多个文件并查找匹配文本在哪些文件中:</p>
<pre><code class="language-bash">grep -l &quot;text&quot; file1 file2 file3...
</code></pre>
<h3 id="grep递归搜索文件">grep递归搜索文件</h3>
<p>在多级目录中对文本进行递归搜索:</p>
<pre><code class="language-bash">grep &quot;text&quot; . -r -n
# .表示当前目录。
</code></pre>
<p>忽略匹配样式中的字符大小写:</p>
<pre><code class="language-bash">echo &quot;hello world&quot; | grep -i &quot;HELLO&quot;
hello
</code></pre>
<p>选项 <strong>-e</strong> 制动多个匹配样式:</p>
<pre><code class="language-bash">echo this is a text line | grep -e &quot;is&quot; -e &quot;line&quot; -o
is
line
#也可以使用 **-f** 选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
</code></pre>
<p>在grep搜索结果中包括或者排除指定文件</p>
<pre><code class="language-bash">#只在目录中所有的.php和.html文件中递归搜索字符&quot;main()&quot;
grep &quot;main()&quot; . -r --include *.{php,html}
#在搜索结果中排除所有README文件
grep &quot;main()&quot; . -r --exclude &quot;README&quot;
#在搜索结果中排除filelist文件列表里的文件
grep &quot;main()&quot; . -r --exclude-from filelist
</code></pre>
<p>使用0值字节后缀的grep与xargs</p>
<div class="sourceCode" id="cb17"><pre><code class="language-bash"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="co"># 测试文件:</span></a>
<a class="sourceLine" id="cb17-2" data-line-number="2"><span class="bu">echo</span> <span class="st">&quot;aaa&quot;</span> <span class="op">&gt;</span> file1</a>
<a class="sourceLine" id="cb17-3" data-line-number="3"><span class="bu">echo</span> <span class="st">&quot;bbb&quot;</span> <span class="op">&gt;</span> file2</a>
<a class="sourceLine" id="cb17-4" data-line-number="4"><span class="bu">echo</span> <span class="st">&quot;aaa&quot;</span> <span class="op">&gt;</span> file3</a>
<a class="sourceLine" id="cb17-5" data-line-number="5"></a>
<a class="sourceLine" id="cb17-6" data-line-number="6"><span class="fu">grep</span> <span class="st">&quot;aaa&quot;</span> file* -lZ <span class="kw">|</span> <span class="fu">xargs</span> -0 rm</a>
<a class="sourceLine" id="cb17-7" data-line-number="7"></a>
<a class="sourceLine" id="cb17-8" data-line-number="8"><span class="co">#执行后会删除file1和file3grep输出用-Z选项来指定以0值字节作为终结符文件名\0xargs -0 读取输入并用0值字节终结符分隔文件名然后删除匹配文件-Z通常和-l结合使用。</span></a></code></pre></div>
<p>grep静默输出</p>
<div class="sourceCode" id="cb18"><pre><code class="language-bash"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="fu">grep</span> -q <span class="st">&quot;test&quot;</span> filename</a>
<a class="sourceLine" id="cb18-2" data-line-number="2"><span class="co"># 不会输出任何信息如果命令运行成功返回0失败则返回非0值。一般用于条件测试。</span></a></code></pre></div>
<p>打印出匹配文本之前或者之后的行:</p>
<div class="sourceCode" id="cb19"><pre><code class="language-bash"><a class="sourceLine" id="cb19-1" data-line-number="1"><span class="co"># 显示匹配某个结果之后的3行使用 -A 选项:</span></a>
<a class="sourceLine" id="cb19-2" data-line-number="2"><span class="fu">seq</span> 10 <span class="kw">|</span> <span class="fu">grep</span> <span class="st">&quot;5&quot;</span> -A 3</a>
<a class="sourceLine" id="cb19-3" data-line-number="3"><span class="ex">5</span></a>
<a class="sourceLine" id="cb19-4" data-line-number="4"><span class="ex">6</span></a>
<a class="sourceLine" id="cb19-5" data-line-number="5"><span class="ex">7</span></a>
<a class="sourceLine" id="cb19-6" data-line-number="6"><span class="ex">8</span></a>
<a class="sourceLine" id="cb19-7" data-line-number="7"></a>
<a class="sourceLine" id="cb19-8" data-line-number="8"><span class="co"># 显示匹配某个结果之前的3行使用 -B 选项:</span></a>
<a class="sourceLine" id="cb19-9" data-line-number="9"><span class="fu">seq</span> 10 <span class="kw">|</span> <span class="fu">grep</span> <span class="st">&quot;5&quot;</span> -B 3</a>
<a class="sourceLine" id="cb19-10" data-line-number="10"><span class="ex">2</span></a>
<a class="sourceLine" id="cb19-11" data-line-number="11"><span class="ex">3</span></a>
<a class="sourceLine" id="cb19-12" data-line-number="12"><span class="ex">4</span></a>
<a class="sourceLine" id="cb19-13" data-line-number="13"><span class="ex">5</span></a>
<a class="sourceLine" id="cb19-14" data-line-number="14"></a>
<a class="sourceLine" id="cb19-15" data-line-number="15"><span class="co"># 显示匹配某个结果的前三行和后三行,使用 -C 选项:</span></a>
<a class="sourceLine" id="cb19-16" data-line-number="16"><span class="fu">seq</span> 10 <span class="kw">|</span> <span class="fu">grep</span> <span class="st">&quot;5&quot;</span> -C 3</a>
<a class="sourceLine" id="cb19-17" data-line-number="17"><span class="ex">2</span></a>
<a class="sourceLine" id="cb19-18" data-line-number="18"><span class="ex">3</span></a>
<a class="sourceLine" id="cb19-19" data-line-number="19"><span class="ex">4</span></a>
<a class="sourceLine" id="cb19-20" data-line-number="20"><span class="ex">5</span></a>
<a class="sourceLine" id="cb19-21" data-line-number="21"><span class="ex">6</span></a>
<a class="sourceLine" id="cb19-22" data-line-number="22"><span class="ex">7</span></a>
<a class="sourceLine" id="cb19-23" data-line-number="23"><span class="ex">8</span></a>
<a class="sourceLine" id="cb19-24" data-line-number="24"></a>
<a class="sourceLine" id="cb19-25" data-line-number="25"><span class="co"># 如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:</span></a>
<a class="sourceLine" id="cb19-26" data-line-number="26"><span class="bu">echo</span> -e <span class="st">&quot;a\nb\nc\na\nb\nc&quot;</span> <span class="kw">|</span> <span class="fu">grep</span> a -A 1</a>
<a class="sourceLine" id="cb19-27" data-line-number="27"><span class="ex">a</span></a>
<a class="sourceLine" id="cb19-28" data-line-number="28"><span class="ex">b</span></a>
<a class="sourceLine" id="cb19-29" data-line-number="29"><span class="ex">--</span></a>
<a class="sourceLine" id="cb19-30" data-line-number="30"><span class="ex">a</span></a>
<a class="sourceLine" id="cb19-31" data-line-number="31"><span class="ex">b</span></a></code></pre></div>
<!-- Linux命令行搜索引擎https://jaywcjlove.github.io/linux-command/ -->