Skip to content

Commit cb2b5d9

Browse files
added 22nd CLI tip
1 parent 6f8839f commit cb2b5d9

File tree

13 files changed

+114
-11
lines changed

13 files changed

+114
-11
lines changed

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ I'm addicted to reading fantasy/sci-fi books, so I have a [blog](https://learnby
6464

6565
## Tips
6666

67+
* [CLI tip 22: grep options to suppress stdout and stderr](https://learnbyexample.github.io/tips/cli-tip-22/)
6768
* [Python tip 22: possessive quantifiers](https://learnbyexample.github.io/tips/python-tip-22/)
6869
* [Vim tip 20: character based motions within the current line](https://learnbyexample.github.io/tips/vim-tip-20/)
6970
* [CLI tip 21: inplace file editing with GNU awk](https://learnbyexample.github.io/tips/cli-tip-21/)

Diff for: atom.xml

+60-2
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,73 @@
55
<link href="https://learnbyexample.github.io/atom.xml" rel="self" type="application/atom+xml"/>
66
<link href="https://learnbyexample.github.io"/>
77
<generator uri="https://www.getzola.org/">Zola</generator>
8-
<updated>2023-01-21T00:00:00+00:00</updated>
8+
<updated>2023-01-25T00:00:00+00:00</updated>
99
<id>https://learnbyexample.github.io/atom.xml</id>
10+
<entry xml:lang="en">
11+
<title>CLI tip 22: grep options to suppress stdout and stderr</title>
12+
<published>2023-01-25T00:00:00+00:00</published>
13+
<updated>2023-01-25T00:00:00+00:00</updated>
14+
<link rel="alternate" href="https://learnbyexample.github.io/tips/cli-tip-22/" type="text/html"/>
15+
<id>https://learnbyexample.github.io/tips/cli-tip-22/</id>
16+
<content type="html">&lt;p&gt;While writing scripts, sometimes you just need to know if a file contains the pattern and act based on the exit status of the command. Instead of redirecting the output to &lt;code&gt;&#x2F;dev&#x2F;null&lt;&#x2F;code&gt; you can use the &lt;code&gt;-q&lt;&#x2F;code&gt; option. This will avoid printing anything on &lt;code&gt;stdout&lt;&#x2F;code&gt; and also provides speed benefit as processing would be stopped as soon as the given condition is satisfied.&lt;&#x2F;p&gt;
17+
&lt;pre data-lang=&quot;ruby&quot; style=&quot;background-color:#f5f5f5;color:#1f1f1f;&quot; class=&quot;language-ruby &quot;&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span&gt;$ cat find.txt
18+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;The&lt;&#x2F;span&gt;&lt;span&gt; find command is more versatile than recursive options &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;and
19+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;and &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b39f04;&quot;&gt;extended&lt;&#x2F;span&gt;&lt;span&gt; globs. &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;Apart&lt;&#x2F;span&gt;&lt;span&gt; from searching based on filename, it
20+
&lt;&#x2F;span&gt;&lt;span&gt;has provisions to &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b39f04;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span&gt; based on the the file characteristics
21+
&lt;&#x2F;span&gt;&lt;span&gt;like size &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;and&lt;&#x2F;span&gt;&lt;span&gt; time.
22+
&lt;&#x2F;span&gt;&lt;span&gt;
23+
&lt;&#x2F;span&gt;&lt;span&gt;$ grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;wE &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;(\w+) \1&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; find.txt
24+
&lt;&#x2F;span&gt;&lt;span&gt;has provisions to &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b39f04;&quot;&gt;match&lt;&#x2F;span&gt;&lt;span&gt; based on the the file characteristics
25+
&lt;&#x2F;span&gt;&lt;span&gt;$ grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;qwE &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;(\w+) \1&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; find.txt
26+
&lt;&#x2F;span&gt;&lt;span&gt;$ echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;$?
27+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b3933a;&quot;&gt;0
28+
&lt;&#x2F;span&gt;&lt;span&gt;
29+
&lt;&#x2F;span&gt;&lt;span&gt;$ grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;q &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;xyz&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; find.txt
30+
&lt;&#x2F;span&gt;&lt;span&gt;$ echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;$?
31+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b3933a;&quot;&gt;1
32+
&lt;&#x2F;span&gt;&lt;span&gt;
33+
&lt;&#x2F;span&gt;&lt;span&gt;$ grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;qwE &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;(\w+) \1&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; find.txt &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;Repeated words found!&amp;#39;
34+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;Repeated&lt;&#x2F;span&gt;&lt;span&gt; words found!
35+
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
36+
&lt;p&gt;The &lt;code&gt;-s&lt;&#x2F;code&gt; option will suppress the error messages that are intended for the &lt;code&gt;stderr&lt;&#x2F;code&gt; stream.&lt;&#x2F;p&gt;
37+
&lt;pre data-lang=&quot;ruby&quot; style=&quot;background-color:#f5f5f5;color:#1f1f1f;&quot; class=&quot;language-ruby &quot;&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span style=&quot;color:#7f8989;&quot;&gt;# when the input file doesn&amp;#39;t exist
38+
&lt;&#x2F;span&gt;&lt;span&gt;$ grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;in&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; xyz.txt
39+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b3933a;&quot;&gt;grep:&lt;&#x2F;span&gt;&lt;span&gt; xyz.txt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;No&lt;&#x2F;span&gt;&lt;span&gt; such file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span&gt; directory
40+
&lt;&#x2F;span&gt;&lt;span&gt;$ grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;s &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;in&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; xyz.txt
41+
&lt;&#x2F;span&gt;&lt;span&gt;$ echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;$?
42+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b3933a;&quot;&gt;2
43+
&lt;&#x2F;span&gt;&lt;span&gt;
44+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#7f8989;&quot;&gt;# when sufficient permission is not available
45+
&lt;&#x2F;span&gt;&lt;span&gt;$ touch &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;.txt
46+
&lt;&#x2F;span&gt;&lt;span&gt;$ chmod &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;r &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;.txt
47+
&lt;&#x2F;span&gt;&lt;span&gt;$ grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;rose&amp;#39; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;.txt
48+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b3933a;&quot;&gt;grep: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;.txt&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;Permission&lt;&#x2F;span&gt;&lt;span&gt; denied
49+
&lt;&#x2F;span&gt;&lt;span&gt;$ grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;s &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;rose&amp;#39; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;.txt
50+
&lt;&#x2F;span&gt;&lt;span&gt;$ echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;$?
51+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b3933a;&quot;&gt;2
52+
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
53+
&lt;p&gt;Errors regarding regular expressions and invalid options will be on the &lt;code&gt;stderr&lt;&#x2F;code&gt; stream even when the &lt;code&gt;-s&lt;&#x2F;code&gt; option is used.&lt;&#x2F;p&gt;
54+
&lt;pre data-lang=&quot;ruby&quot; style=&quot;background-color:#f5f5f5;color:#1f1f1f;&quot; class=&quot;language-ruby &quot;&gt;&lt;code class=&quot;language-ruby&quot; data-lang=&quot;ruby&quot;&gt;&lt;span&gt;$ grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;sE &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;a(&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; find.txt
55+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b3933a;&quot;&gt;grep: &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;Unmatched &lt;&#x2F;span&gt;&lt;span&gt;( &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;or&lt;&#x2F;span&gt;&lt;span&gt; \(
56+
&lt;&#x2F;span&gt;&lt;span&gt;
57+
&lt;&#x2F;span&gt;&lt;span&gt;$ grep &lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt;sE &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d07711;&quot;&gt;&amp;#39;a(&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; find.txt &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b3933a;&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#c49a39;&quot;&gt;&#x2F;dev&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#72ab00;&quot;&gt;nu&lt;&#x2F;span&gt;&lt;span&gt;ll
58+
&lt;&#x2F;span&gt;&lt;span&gt;$ echo &lt;&#x2F;span&gt;&lt;span style=&quot;color:#5597d6;&quot;&gt;$?
59+
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b3933a;&quot;&gt;2
60+
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
61+
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;info.svg&quot; alt=&quot;info&quot; &#x2F;&gt; Check out my &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;learnbyexample&#x2F;command_help&#x2F;blob&#x2F;master&#x2F;ch&quot;&gt;&lt;code&gt;ch&lt;&#x2F;code&gt; command line tool&lt;&#x2F;a&gt; for a practical example of using the &lt;code&gt;-q&lt;&#x2F;code&gt; option.&lt;&#x2F;p&gt;
62+
&lt;p&gt;&lt;strong&gt;Video demo&lt;&#x2F;strong&gt;:&lt;&#x2F;p&gt;
63+
&lt;p align=&quot;center&quot;&gt;&lt;iframe width=&quot;560&quot; height=&quot;315&quot; loading=&quot;lazy&quot; src=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;Pjud7hEjZ6Q&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;&#x2F;iframe&gt;&lt;&#x2F;p&gt;
64+
&lt;br&gt;
65+
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;info.svg&quot; alt=&quot;info&quot; &#x2F;&gt; See my &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;learnbyexample&#x2F;learn_gnugrep_ripgrep&quot;&gt;GNU GREP and RIPGREP&lt;&#x2F;a&gt; ebook if you are interested in learning about &lt;code&gt;GNU grep&lt;&#x2F;code&gt; and &lt;code&gt;ripgrep&lt;&#x2F;code&gt; commands in more detail.&lt;&#x2F;p&gt;
66+
</content>
67+
</entry>
1068
<entry xml:lang="en">
1169
<title>Python Regular Expressions Gotchas</title>
1270
<published>2023-01-21T00:00:00+00:00</published>
1371
<updated>2023-01-21T00:00:00+00:00</updated>
1472
<link rel="alternate" href="https://learnbyexample.github.io/python-regex-surprises/" type="text/html"/>
1573
<id>https://learnbyexample.github.io/python-regex-surprises/</id>
16-
<content type="html">&lt;p&gt;Regular expressions can get quite complicated and cryptic. So, it is natural to assume you have made a mistake if something isn&#x27;t working as expected. However, sometimes it might just be one of the quirky corner cases discussed in this post.&lt;&#x2F;p&gt;
74+
<content type="html">&lt;p&gt;Regular expressions can get quite complicated and cryptic. And sometimes it might become worse due to one of the quirky corner cases discussed in this post.&lt;&#x2F;p&gt;
1775
&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;&#x2F;images&#x2F;python_regex_gotchas.png&quot; alt=&quot;Python Regular Expressions Gotchas&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
1876
&lt;p align=&quot;center&quot;&gt;&lt;i&gt;Poster created using &lt;a href=&quot;https:&#x2F;&#x2F;www.canva.com&#x2F;&quot;&gt;Canva&lt;&#x2F;a&gt;&lt;&#x2F;i&gt;&lt;&#x2F;p&gt;
1977
&lt;p&gt;If you are not familiar with regular expressions, check out my &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;learnbyexample&#x2F;py_regular_expressions&quot;&gt;Understanding Python re(gex)?&lt;&#x2F;a&gt; ebook.&lt;&#x2F;p&gt;

Diff for: images/books/all_books_bundle.png

-1.65 KB
Loading

0 commit comments

Comments
 (0)