Скопируйте строку, происходящую перед конкретным шаблоном.

Я должен скопировать это emuEventTrapInformative снизу.

-- Traps
   emuEventTrapInformative TRAP-TYPE
        ENTERPRISE compaq
        VARIABLES  { scellNameDateTime,
                     shelfId,
                     shelfElementType,
                     shelfElementNum,
                     shelfErrorCode }

То, что я хочу сделанный, - то, что я ищу первую инстанцию TRAP-TYPE в файле и копии все перед ним в самой строке.

emuEventTrapInformative будет варьироваться от файла до файла
Используя что-либо sed/grep/awk.

-1
задан 18 June 2015 в 14:11

4 ответа

Используя 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
4
ответ дан 4 October 2019 в 03:04

Вы могли использовать 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 Совместимые Регулярные выражения, которые поддерживают предвидения.

4
ответ дан 4 October 2019 в 03:04

Вот 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 }
2
ответ дан 4 October 2019 в 03:04

И вот версия Perl:

< inputfile perl -ne 's/^ +(.*) +TRAP-TYPE/$1/&&print'
  • -n: помещает while (<>) {[...]} цикл вокруг сценария
  • -e: читает сценарий из аргументов

разбивка команды Perl:

  • s: утверждает для выполнения замены
  • /: запускает шаблон
  • ^: соответствует запуску строки
  • +: соответствия один или несколько символы
  • (.*): соответствия и группы любое количество любого символа перед одним или несколькими символы
  • TRAP-TYPE: соответствует TRAP-TYPE строка
  • /: останавливается шаблон / запускает замещающую строку
  • $1: замены полученной группой
  • /: останавливается замещающая строка / запускает модификаторы
1
ответ дан 4 October 2019 в 03:04

Другие вопросы по тегам:

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