Извлечь подстроку в соответствии с регулярным выражением с помощью sed или grep

reset имеет свое место, но очищает экран. Если вы используете xterm или что-нибудь совместимое, то самым коротким и наименее навязчивым будет

printf '\033[?9l'

Это не указано явно в Отслеживание мыши разделе Последовательности управления XTerm, но xterm позволяет вам сбросить (отключить) режим мыши, выключив любой из возможных режимов, которые могут быть включены. Они документированы как именованные константы:

 #define SET_X10_MOUSE               9
 #define SET_VT200_MOUSE             1000
 #define SET_VT200_HIGHLIGHT_MOUSE   1001
 #define SET_BTN_EVENT_MOUSE         1002
 #define SET_ANY_EVENT_MOUSE         1003

и 9 - самая короткая.

Режим мыши включается многими приложениями. Если выйти из приложения, не выключив его, это приведет к появлению странных символов, которые вы видели. Приложения ncurses выключают режим мыши в endwin, который вызывают все хорошо воспитанные приложения curses. Другие приложения могут не использовать (n)curses, или забыть вызвать endwin.

ncurses-приложения проверяют, доступен ли режим xterm-mouse, тестируя возможность kmous (которая является частью screen описания терминала). Это стандартный способ проверки наличия данной возможности с 1999 года, поэтому маловероятно, что приложение включило режим мыши случайно. Скорее, это указывает на приложение, которое забыло выполнить свою работу.

Кстати, в пакете ncurses-term Debian нет записи screen.xterm (его сохранение более полезно, чем удаление). Вот список всех связанных с экраном записей в этом пакете. Большинство из них используется для исправления несоответствий в поведении экрана для различных терминалов:

/usr/share/terminfo/s/screen.konsole
/usr/share/terminfo/s/screen-16color-bce
/usr/share/terminfo/s/screen-16color
/usr/share/terminfo/s/screen3
/usr/share/terminfo/s/screen.mrxvt
/usr/share/terminfo/s/screen-bce.Eterm
/usr/share/terminfo/s/screen-bce.gnome
/usr/share/terminfo/s/screen.xterm-xfree86
/usr/share/terminfo/s/screen-bce.konsole
/usr/share/terminfo/s/screen-bce.mlterm
/usr/share/terminfo/s/screen-256color-s
/usr/share/terminfo/s/screen-bce.mrxvt
/usr/share/terminfo/s/screen-bce.rxvt
/usr/share/terminfo/s/screen.linux
/usr/share/terminfo/s/screen.vte
/usr/share/terminfo/s/screen-bce.xterm-new
/usr/share/terminfo/s/screen.teraterm
/usr/share/terminfo/s/screen-16color-bce-s
/usr/share/terminfo/s/screen.xterm-r6
/usr/share/terminfo/s/screen+fkeys
/usr/share/terminfo/s/screen-256color-bce-s
/usr/share/terminfo/s/screen.mlterm
/usr/share/terminfo/s/screen-16color-s
/usr/share/terminfo/s/screen-bce.linux
/usr/share/terminfo/s/screen.gnome
/usr/share/terminfo/s/screen.rxvt
/usr/share/terminfo/s/screen2
/usr/share/terminfo/s/screen.Eterm
/usr/share/terminfo/s/screen.xterm-new

4
19.03.2019, 15:30
4 ответа

Как насчет того, чтобы -oпод grep просто напечатать совпадающую часть? Нам все еще нужно удалить <>, но trтам работает.

dmesg |egrep -o "<([a-zA-Z\.0-9 ]+)>" |tr -d "<>"
Marvell Console 1.01
5
27.01.2020, 20:46

Попробуйте это,

sed -nE 's/^pass2:.*<(.*)>.*$/\1/p'

Или POSIXly(-Eеще не стал стандартом POSIX по состоянию на 2019 год):

sed -n 's/^pass2:.*<\(.*\)>.*$/\1/p'

Выход:

$ printf '%s\n' 'pass2: <Marvell Console 1.01> Removable Processor SCSI device' | sed -nE 's/^pass2:.*<(.*)>.*$/\1/p'
Marvell Console 1.01

Будет напечатано только последнее вхождение <...>для каждой строки.

8
27.01.2020, 20:46

Я пробовал следующие 3 метода, используя sed, awk и python

команда sed

echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | sed "s/.*<//g"|sed "s/>.*//g"

выход

Marvell Console 1.01

команда awk

echo "pass2: <Marvell Console 1.01> Removable Processor SCSI device" | awk -F "[<>]" '{print $2}'

выход

Marvell Console 1.01

питон

#!/usr/bin/python
import re
h=[]
k=open('l.txt','r')
l=k.readlines()
for i in l:
    o=i.split(' ')
    for i in o[1:4]:
        h.append(i)
print (" ".join(h)).replace('>','').replace('<','')

выход

Marvell Console 1.01
3
27.01.2020, 20:46

Вы можете извлечь подстроку с помощью следующей команды grep -o -e:

cat some.log | grep "lineWithThisText" | grep -o -e 'SomeSequence1[0-9]*[A-Z]*SomeSequence2'

По какой-то причине *работает, а не +для 1 или нескольких совпадений в этой команде сопоставления регулярного выражения grep.

Прочтите руководство grep с помощью следующей команды:

man grep

Прочтите об опциях -oи -e.

Я использую это на работе, чтобы извлечь тонны данных из нескольких строк журнала.

0
29.04.2020, 16:06

Теги

Похожие вопросы