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.
In this case since the log file has a known structure, one option is to use cut
to pull out the 7th column (fields are denoted by tabs by default).
grep GET log.txt | cut -f 7
I was trying to do this and came across this link: https://www.unix.com/shell-programming-and-scripting/153101-print-next-word-after-found-pattern.html
Summary: use grep to find matching lines, then use awk to find the pattern and print the next field:
grep pattern logfile | \
awk '{for(i=1; i<=NF; i++) if($i~/pattern/) print $(i+1)}'
If you want to know the unique occurrences:
grep pattern logfile | \
awk '{for(i=1; i<=NF; i++) if($i~/pattern/) print $(i+1)}' | \
sort | \
uniq -c