У 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. Это бесплатное программное обеспечение; см. источник для условий копирования. Нет никаких гарантий; даже не для КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.
>