mmhh, bonne remarque, j'étais parti sur l'exemple donné par l'auteur de la question :p
Cela étant, ta commande avec sed ne va pas virer les lignes qui ne contiennent pas ERROR ! Il faut au moins ça :
sed -n 's/.*ERROR \(.*\)/\1/p'
En revanche, pas la peine d'avoir les parenthèses et le \1:
C'est quand même plus rapide !
De plus, j'aurais tendance à sécuriser un peu la chose pour éviter de retourner des mots comme SYSERROR ou ERRORTOTAL ou autres (bien que le problème initial n'en tienne pas compte) :
sed -n 's/.*\bERROR\W//p' $1
Par exemple...
Mais encore une fois, grep sera plus rapide :
grep -o "\bERROR\W.*" test |cut -c 7-
Les \W étant à adapter en fonction du format des erreurs possibles...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| $ wc -l test
10000000 test
$ time grep -o "\bERROR\W.*" test |cut -c 7- > test_grep
real 0m26.637s
user 0m4.860s
sys 0m19.270s
$ time sed -n 's/.*\bERROR\W\(.*\)/\1/p' test > test_sed1
real 1m45.931s
user 1m4.990s
sys 0m39.000s
$ time sed -n 's/.*\bERROR\W//p' test > test_sed2
real 1m37.064s
user 0m53.720s
sys 0m38.950s
$ diff test_sed2 test_sed1
$ diff test_sed2 test_grep
$ wc -l test_*
1428571 test_grep
1428571 test_sed1
1428571 test_sed2
4285713 total |
Partager