How to grep netcat output
Answer is here: grep not matching in nc output
netcat outputs verbose logs to standard error, so we need to capture errors before we pipe to grep.
$ netcat -zv localhost 1-9000 2>&1 | grep succeeded
You could use the read
command (bash
builtin) to force characters to be read one by one :
netcat localhost 9090 | (
cnt=0
line=
while read -N 1 c; do
line="$line$c"
if [ "$c" = "{" ]; then
cnt=$((cnt+1))
elif [ "$c" = "}" ]; then
cnt=$((cnt-1))
if [ $cnt -eq 0 ]; then
printf "%s\n" "$line"
line=
fi
fi
done
) | grep sender
This script should print every full output with balancing {
and }
, but you can change the script to do whatever you want. This script would NOT do well on a benchmark compared to pretty much anything, but it's pretty simple and seems to work for me...
Note that your test sample didn't have matching {
and }
, so if this is the case of the real input, you might want to change the criteria to print the line.
I think the issue is the absence of newlines in the netcat
output. I can see two workarounds:
Insert a newline every
x
seconds (with unfortunate consequences if the newline is inserted in the middle ofsource
):( while sleep 1; do echo; done & netcat ... ) | grep source
Use
awk
with an RS other than newline:netcat ... | awk -v RS='}' -v ORS='}' '/source/'