Назад | Перейти на главную страницу

Как извлечь соответствующую часть регулярного выражения в Solaris

У GNU grep есть опция --only-matching, который печатает только совпадающую область регулярного выражения. Я использую Solaris 5.10 без установленных инструментов GNU, и я пытаюсь добиться того же. Пример:

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

Есть ли выражение sed или awk, которое может делать то же самое?

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

Возможное уточнение для версий sed которые поддерживают этот тип чередования:

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

В OS X мне приходилось использовать расширенные регулярные выражения, потому что я не мог заставить работать базовые расширенные регулярные выражения (это работало бы в GNU sedтоже, если ты изменишь -E к -r, но там работает и базовая расширенная версия):

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

Эти два последних примера работают, даже если искомая последовательность появляется в начале строки без ведущих символов.

Solaris 5.10 включает bash 3.00, который имеет современный движок регулярных выражений. Следующая команда работает, хотя она немного более подробна, чем решение grep или sed.

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

(Отформатировано в несколько строк для удобства чтения)

Попробуйте использовать / usr / sfw / bin / ggrep

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

Авторское право 1988, 1992–1999, 2000, 2001 Free Software Foundation, Inc. Это бесплатное программное обеспечение; см. источник для условий копирования. Нет никаких гарантий; даже не для КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.

>