Como extraio a parte correspondente de uma expressão regular no Solaris

1

O grep do GNU tem a opção --only-matching , que imprime apenas a região correspondente de uma expressão regular. Eu estou em uma caixa Solaris 5.10 sem nenhuma ferramenta GNU instalada, e estou tentando conseguir a mesma coisa. Exemplo:

grep -Eo "[0-9]+ ms" *.log

Existe uma expressão sed ou awk que pode fazer a mesma coisa?

    
por brianegge 11.02.2010 / 00:20

3 respostas

4
sed -n 's/.*[^0-9]\([0-9]\+ ms\).*//p' *.log

Um possível refinamento para versões de sed que suportam esse tipo de alternância:

sed -n 's/\(^\|.*[^0-9]\)\([0-9]\+ ms\).*//p' *.log

No OS X, precisei usar expressões regulares estendidas porque não conseguia usar expressões regulares aprimoradas básicas para funcionar (isso também funcionaria no GNU sed , se você alterar -E para -r , mas a versão básica aprimorada também funciona lá:

sed -En 's/(^|.*[^0-9])([0-9]+ ms).*//p' *.log

Esses dois últimos exemplos funcionam mesmo se a sequência que você está procurando aparecer no início da linha sem caracteres principais.

    
por 11.02.2010 / 00:32
0

Tente usar / usr / sfw / bin / ggrep

/usr/sfw/bin/ggrep -V grep (GNU grep) 2.5

Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc. Isto é software livre; veja a fonte para as condições de cópia. Não há garantia; nem mesmo para COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO FIM.

>

    
por 11.02.2010 / 01:13
0

O Solaris 5.10 inclui o bash 3.00, que possui um moderno mecanismo regex. O comando follow funciona, embora seja um pouco mais detalhado do que uma solução grep ou sed.

cat *.log | while read line; 
do 
  if [[ $line =~ "([0-9]+) ms" ]]; then 
    echo "${BASH_REMATCH[1]}"; 
  fi;
done 

(formatado em várias linhas para facilitar a leitura)

    
por 11.02.2010 / 01:20