Я должен скопировать это emuEventTrapInformative
снизу.
-- Traps emuEventTrapInformative TRAP-TYPE ENTERPRISE compaq VARIABLES { scellNameDateTime, shelfId, shelfElementType, shelfElementNum, shelfErrorCode }
То, что я хочу сделанный, - то, что я ищу первую инстанцию TRAP-TYPE
в файле и копии все перед ним в самой строке.
emuEventTrapInformative
будет варьироваться от файла до файла
Используя что-либо sed/grep/awk.
Используя awk
$ awk '/TRAP-TYPE/ {print $1; exit}' foo
<час> Примечание
Это будет только работать, если будет только единственное поле прежде TRAP-TYPE
как в случае операции в секунду
Пример
$ cat foo
sCSISmart5 TRAP-TYPE
ENTERPRISE cyclone
VARIABLES {cycHostAdapterNumber, cycHostAdapterID, cycManagerID}
DESCRIPTION
"The HostAdapter# %d has new HostAdapter Id %s and Manager Id %s"
--#TYPE "Host Adapter changed"
--#SUMMARY "The HostAdapter# %d has new HostAdapter Id %s and Manager Id %s"
--#ARGUMENTS {0,1,2}
--#SEVERITY CRITICAL
--#TIMEINDEX 100
--#STATE OPERATIONAL
--#HELP "scsismrt.hlp"
--#HELPTAG 109
::= 109
--This Trap is issued when a Host adapter fails.
sCSISmart6 TRAP-TYPE
ENTERPRISE cyclone
VARIABLES {cycHostAdapterNumber}
DESCRIPTION
"The HostAdapter# %d has Failed"
--#TYPE "Host adapter failed"
--#SUMMARY "The HostAdapter# %d has Failed"
--#ARGUMENTS {0}
--#SEVERITY CRITICAL
--#TIMEINDEX 100
--#STATE OPERATIONAL
--#HELP "scsismrt.hlp"
--#HELPTAG 110
::= 110
$ awk '/TRAP-TYPE/ {print $1; exit}' foo
sCSISmart5
Вы могли использовать grep
:
$ grep -m 1 TRAP-TYPE file
emuEventTrapInformative TRAP-TYPE
Эти -m 1
говорит grep
выходить после первого соответствия. Для получения только emuEventTrapInformative
часть Вы могли просто удалить TRAP-TYPE
и любой пробел, предшествующий ему:
$ grep -m 1 TRAP-TYPE file | sed 's/ *TRAP-TYPE//'
emuEventTrapInformative
, С другой стороны, можно использовать предвидение :
$ grep -Pom 1 '.*(?=TRAP-TYPE)' file
emuEventTrapInformative
Эти -o
говорит grep
только печатать подобранную часть строки, и эти -P
включает Perl Совместимые Регулярные выражения, которые поддерживают предвидения.
Вот sed
версия:
sed -n 's/TRAP-TYPE//p' inp-file.txt
Для примера Вы обеспечили, вывод:
sed -n 's/TRAP-TYPE//p' inp-file.txt
emuEventTrapInformative
В Вашем исходном вопросе Вы запросили первую инстанцию ТИПА ПРЕРЫВАНИЯ в файле. Если у Вас будет больше чем один экземпляр sed -n 's/TRAP-TYPE//p' | head -n1
, то добьется цели
, Вот другая версия, которая извлекает [приблизительно 117] строки (на всякий случай, Вам нужно один, когда-либо), если у Вас есть больше чем один экземпляр ТИПА ПРЕРЫВАНИЯ в файле.
$ awk 'BEGIN {RS="TRAP-TYPE"} NR>1{ print previous } {previous=$NF}' inp-file.txt
emuEventTrapInformative
someOtherString
Объяснение :
RS является разделителем записей. Мы делим целый текст на записи, при помощи ТИПА ПРЕРЫВАНИЯ как строка, тогда печатаем последний объект перед разделителем. Проблема состоит в том, что последняя запись заканчивается изогнутой фигурной скобкой. Таким образом, чтобы избежать, чтобы мы использовали NR>1{print previous}{previous=$NF}
конструкция так, чтобы мы могли проигнорировать последнюю строку.
Мой inp-file.txt
-- Traps
emuEventTrapInformative TRAP-TYPE
ENTERPRISE compaq
VARIABLES { scellNameDateTime,
shelfId,
shelfElementType,
shelfElementNum,
shelfErrorCode }
-- Traps
someOtherString TRAP-TYPE
ENTERPRISE compaq
VARIABLES { scellNameDateTime,
shelfId,
shelfElementType,
shelfElementNum,
shelfErrorCode }
И вот версия Perl:
< inputfile perl -ne 's/^ +(.*) +TRAP-TYPE/$1/&&print'
-n
: помещает while (<>) {[...]}
цикл вокруг сценария -e
: читает сценарий из аргументов разбивка команды Perl:
s
: утверждает для выполнения замены /
: запускает шаблон ^
: соответствует запуску строки +
: соответствия один или несколько
символы (.*)
: соответствия и группы любое количество любого символа перед одним или несколькими
символы TRAP-TYPE
: соответствует TRAP-TYPE
строка /
: останавливается шаблон / запускает замещающую строку $1
: замены полученной группой /
: останавливается замещающая строка / запускает модификаторы