Using grep to get the next WORD after a match in each line
Assuming you have gnu grep, you can use perl-style regex to do a positive lookbehind:
grep -oP '(?<=GET\s/)\w+' file
If you don't have gnu grep, then I'd advise just using sed:
sed -n '/^.*GET[[:space:]]\{1,\}\/\([-_[:alnum:]]\{1,\}\).*$/s//\1/p' file
If you happen to have gnu sed, that can be greatly simplified:
sed -n '/^.*GET\s\+\/\(\w\+\).*$/s//\1/p' file
The bottom line here is, you certainly don't need pipes to accomplish this. grep
or sed
alone will suffice.
Use grep to get next word after match
For "normal" integers and float values, you may use
grep -oP '(?<="USD":)\d+(?:\.\d+)?' file
If your numbers can have no integer part and can start with a .
, use
grep -oP '(?<="USD":)\d*\.?\d+' file
An optional -
:
grep -oP '(?<="USD":)-?\d*\.?\d+' file
See IDEONE demo
How to grep for contents after pattern?
grep 'potato:' file.txt | sed 's/^.*: //'
grep
looks for any line that contains the string potato:
, then, for each of these lines, sed
replaces (s///
- substitute) any character (.*
) from the beginning of the line (^
) until the last occurrence of the sequence :
(colon followed by space) with the empty string (s/...//
- substitute the first part with the second part, which is empty).
or
grep 'potato:' file.txt | cut -d\ -f2
For each line that contains potato:
, cut
will split the line into multiple fields delimited by space (-d\
- d
= delimiter, \
= escaped space character, something like -d" "
would have also worked) and print the second field of each such line (-f2
).
or
grep 'potato:' file.txt | awk '{print $2}'
For each line that contains potato:
, awk
will print the second field (print $2
) which is delimited by default by spaces.
or
grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'
All lines that contain potato:
are sent to an inline (-e
) Perl script that takes all lines from stdin
, then, for each of these lines, does the same substitution as in the first example above, then prints it.
or
awk '{if(/potato:/) print $2}' < file.txt
The file is sent via stdin
(< file.txt
sends the contents of the file via stdin
to the command on the left) to an awk
script that, for each line that contains potato:
(if(/potato:/)
returns true if the regular expression /potato:/
matches the current line), prints the second field, as described above.
or
perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt
The file is sent via stdin
(< file.txt
, see above) to a Perl script that works similarly to the one above, but this time it also makes sure each line contains the string potato:
(/potato:/
is a regular expression that matches if the current line contains potato:
, and, if it does (&&
), then proceeds to apply the regular expression described above and prints the result).
get the next word after grep matching
iw dev wlan0 station dump | grep -Po '(?<=Station\s|signal avg:\s)[^\s]*'
This regexp uses a so-called lookbehind
syntax. You can read about it here
Example output:
00:11:22:33:44:55
-40
Update:
Thanks for voting this answer up. Now I know another solution:
iw dev wlan0 station dump | grep -Po '(Station\s|signal avg:\s)\K[^\s]*'
Which is actually a shorthand for the solution above. \K
basically means "forget everything before its occurance".
Grep next word after pattern match
Referencing @sundeep answer
grep -Eo '"name":"[^"]+"'
resulted in the expected output
Grep and print only matching word and the next words
This is arguably, easier to do with sed
:
sed -n 's/.*EndPatch, //p' install.history
to get the word after EndPatch:
sed -n 's/.*EndPatch, \([^,]*\).*/\1/p' install.history
or:
sed -n 's/.*EndPatch, //p' install.history | cut -d, -f
grep after match
$ grep -Po '(?<=myname\s)\w+' inputFile
Use grep to extract first word after match
Don't use grep. This is tailor-made job for Awk:
awk '$1 == "FROM" { print $2 }'
EDIT Thanks to @rojo for this suggestion
awk 'BEGIN{FS="from|FROM|where|WHERE"} /from|FROM/ {print $2}'
EDIT 2: WIth filename and line #
awk 'BEGIN{FS="from|FROM|where|WHERE"}
/from|FROM/ {printf ("%s:%d:%s\n", FILENAME, NR, $2)}'
grep match next word after pattern until first space
You could use awk
if you are pretty sure if the words are de-limited by space, since by default awk
splits up fields in input line by a white-space characters. For your given input all you need is
awk '{ for( i=1; i<=NF ;i++ ) if ( $i == "MODULE" ) { print $(i+1); break } }'
The for
loop just runs up to NF
which basically means run till the last row entry in the current line split by the white-space character.
If you are still persistent on using grep
, you could improve the regex by doing below. In PCRE you can use ?
to match the variable number of white-space characters by doing (\s+)?
and get only the part without the white-space.
grep -oP '(?<=MODULE)(\s+)?\K([^ ]*)'
See the Regular Expression from regex101 working for your given input.
Related Topics
How to Escape Single Quotes in Bash/Grep
Quickly Create a Large File on a Linux System
Command Not Found When Using Sudo
[ :Unexpected Operator in Shell Programming
Find Multiple Files and Rename Them in Linux
Maximum Number of Processes in Linux
How to Configure Apache 2 to Run Perl Cgi Scripts
Is There Really No Asynchronous Block I/O on Linux
How to Use Debug Version of Libc
The Bash Command :(){ :|:& };: Will Spawn Processes to Kernel Death. Can You Explain the Syntax
Error When Using Git Credential Helper With Gnome-Keyring as Sudo
Linux/Unix Command to Determine If Process Is Running
How to Preserve Line Breaks When Storing Command Output to a Variable