Grep: Difference between revisions
(Created page with "=Internal= * Linux") |
|||
(25 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
* [[Linux#Commands|Linux]] | * [[Linux#Commands|Linux]] | ||
* [[sed]] | |||
=Overview= | |||
<tt>grep</tt> accepts regular expressions. Both " " and ' ' can be used to enclose the expression to search for. | |||
If the expression is found, the enclosing lines are sent to stdout the command returns 0 (success). | |||
If the expression is NOT found, the command returns 1 (failure). | |||
<pre> | |||
if grep -q "some regex" ./file.txt; then | |||
# do something if expression is found | |||
else | |||
# do something else if the expression is not found | |||
fi | |||
</pre> | |||
=Options= | |||
==-q== | |||
Quiet. | |||
==-v, --invert-match== | |||
Invert the sense of matching, to select non-matching lines. | |||
==<tt>-e</tt>== | |||
GNU grep uses <code>-e</code> to introduce a regular expression to match. Also see: {{Internal|Grep_Regular_Expressions|<tt>grep</tt> Regular Expressions}} | |||
=Regular Expressions= | |||
{{Internal|grep Regular Expressions|grep Regular Expressions}} | |||
=Recipes= | |||
==Including TWO expressions at the same time== | |||
<pre> | |||
cat /proc/cpuinfo | grep 'processor\|siblings' | |||
processor : 0 | |||
siblings : 2 | |||
processor : 1 | |||
siblings : 2 | |||
</pre> | |||
The method works even if there are spaces and other regular expression characters within the alternative regexes: | |||
<pre> | |||
... | grep ' logger: [1-9]\+\.\|(concurrent mode failure)' | |||
</pre> | |||
This will select either "logger: [1-9]\+\." or "(concurrent mode failure)" | |||
==Excluding TWO expressions at the same time== | |||
<pre> | |||
echo "something" | grep -v "blah" | grep -v "blah2" | |||
</pre> | |||
==Do not Send Anything to <tt>stout</tt>== | |||
... and avoid > /dev/null: | |||
<pre> | |||
grep -q | |||
</pre> | |||
==--color== | |||
<pre> | |||
grep --color 'context.layer=' | |||
</pre> | |||
==Prefix the Line with the "Line Number" (-n)== | |||
<tt>-n</tt> prefixes the line with the ''line number''. | |||
<blockquote style="background-color: #f9f9f9; border: solid thin lightgrey;"> | |||
:[[sed#Insert_a_Line.2FAppend_in_a_Specific_Position_.28line_number.29_in_a_file|sed: Insert a Line/Append in a Specific Position (line number) in a file]] | |||
</blockquote> | |||
==Return Only the First Match== | |||
-m means "stop reading the file about num matches. So to return the first match: | |||
<pre> | |||
-m 1 | |||
</pre> | |||
==Print More Lines of Trailing Context after Each Match== | |||
Use -A to print a number of lines of trailing context after each match: | |||
grep -A 10 "something" ./file.txt | |||
==Iterate over Lines Selected by grep== | |||
<syntaxhighlight lang='bash'> | |||
IFS="$(printf '\n\r')"; | |||
for i in $(grep "something ${some_file}); do | |||
... | |||
done | |||
IFS="$(printf ' \t\n')" | |||
</syntaxhighlight> | |||
See also: {{Internal|Bash_Built-In_Variables#IFS|IFS}} |
Latest revision as of 23:41, 29 March 2024
Internal
Overview
grep accepts regular expressions. Both " " and ' ' can be used to enclose the expression to search for.
If the expression is found, the enclosing lines are sent to stdout the command returns 0 (success).
If the expression is NOT found, the command returns 1 (failure).
if grep -q "some regex" ./file.txt; then # do something if expression is found else # do something else if the expression is not found fi
Options
-q
Quiet.
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
-e
GNU grep uses -e
to introduce a regular expression to match. Also see:
Regular Expressions
Recipes
Including TWO expressions at the same time
cat /proc/cpuinfo | grep 'processor\|siblings' processor : 0 siblings : 2 processor : 1 siblings : 2
The method works even if there are spaces and other regular expression characters within the alternative regexes:
... | grep ' logger: [1-9]\+\.\|(concurrent mode failure)'
This will select either "logger: [1-9]\+\." or "(concurrent mode failure)"
Excluding TWO expressions at the same time
echo "something" | grep -v "blah" | grep -v "blah2"
Do not Send Anything to stout
... and avoid > /dev/null:
grep -q
--color
grep --color 'context.layer='
Prefix the Line with the "Line Number" (-n)
-n prefixes the line with the line number.
Return Only the First Match
-m means "stop reading the file about num matches. So to return the first match:
-m 1
Print More Lines of Trailing Context after Each Match
Use -A to print a number of lines of trailing context after each match:
grep -A 10 "something" ./file.txt
Iterate over Lines Selected by grep
IFS="$(printf '\n\r')";
for i in $(grep "something ${some_file}); do
...
done
IFS="$(printf ' \t\n')"
See also: