sed ( GNU BSD/macOS sed - -E):
sed -E 's/.* to=<(.*)>.*/\1/' file
, , ( ) , .
, , , -
sed -E 's/.* to=<([^>]*).*/\1/' file
, POSIX, - , BRE ( ):
sed 's/.* to=<\(.*\)>.*/\1/' file
fedorqui GNU grep:
grep -Po ' to=<\K[^>]*' file
\K, , , , look-behind ((?<=...), - - ( , : . ).
.
, , :
, , , . . script, , 27- iMac 27 2010 , 250 000 , , 10 .
Mawk 0.364s
GNU grep, \K, non-backtracking 0.392s
GNU awk 0.830s
GNU grep, \K 0.937s
GNU grep, (?>=...) 1.639s
BSD grep + cut 2.733s
GNU grep + cut 3.697s
BSD awk 3.785s
BSD sed, non-backtracking 7.825s
BSD sed 8.414s
GNU sed 16.738s
GNU sed, non-backtracking 17.387s
:
- .
grep , cut- , , .
- GNU
sed , GNU awk BSD awk. , () GNU sed.
script, ; , g -prefixed - GNU, macOS Homebrew; , mawk Homebrew.
, "non-backtracking" .
#!/usr/bin/env bash
test01=( 'BSD sed' sed -E 's/.*to=<(.*)>.*/\1/' )
test02=( 'BSD sed, non-backtracking' sed -E 's/.*to=<([^>]*).*/\1/' )
test03=( 'GNU sed' gsed -E 's/.*to=<(.*)>.*/\1/' )
test04=( 'GNU sed, non-backtracking' gsed -E 's/.*to=<([^>]*).*/\1/' )
test05=( 'BSD awk' awk -F' to=<|>,' '{print $2}' )
test06=( 'GNU awk' gawk -F' to=<|>,' '{print $2}' )
test07=( 'Mawk' mawk -F' to=<|>,' '{print $2}' )
test08=( 'GNU grep, (?>=...)' ggrep -Po '(?<= to=<).*(?=>)' )
test09=( 'GNU grep, \K' ggrep -Po ' to=<\K.*(?=>)' )
test10=( 'GNU grep, \K, non-backtracking' ggrep -Po ' to=<\K[^>]*' )
test11=( 'BSD grep + cut' "{ grep -o ' to=<[^>]*' | cut -d'<' -f2; }" )
test12=( 'GNU grep + cut' "{ ggrep -o ' to=<[^>]*' | gcut -d'<' -f2; }" )
inFile='file'
outFile="/tmp/out.$$"
TIMEFORMAT='%6R'
runs=10
echo "Warming up the cache..."
cat "$inFile" >/dev/null
echo "Running $(awk '{print NF}' <<<"${!test*}") test(s), averaging the timings of $runs run(s) each; this may take a while..."
{
for n in ${!test*}; do
arrRef="$n[@]"
test=( "${!arrRef}" )
printf '%s\t' "${test[0]}"
if (( ${#test[@]} == 2 )); then
time for (( n = 0; n < runs; n++ )); do eval "${test[@]: 1}" < "$inFile" >"$outFile"; done
else
time for (( n = 0; n < runs; n++ )); do "${test[@]: 1}" "$inFile" >"$outFile"; done
fi
done
} 2>&1 |
sort -t$'\t' -k2,2n |
awk -v runs="$runs" '
BEGIN{FS=OFS="\t"} { avg = sprintf("%.3f", $2/runs); print $1, avg "s" }
' | column -s$'\t' -t