У меня есть файл, в котором я должен искать слово, и как только я нахожу это слово, я должен сохранить эту запись в своем выводе, а также мне нужно вернуться к этой записи и взять предыдущую запись, как показано ниже. это пример

insert_job: Capture this record as well   job_type: FW
box_name:XXXXXXXXXXXXXXX
machine: XXXXXXXXXXXXXXX
owner: XXXXXXXXXXXXXXXXXXXXX
permission:
date_conditions: 0
description: "This job waits for .trg file of CRH load file. This job waits for 2 hrs and alarms Ops."
term_run_time: 121
box_terminator: 1
max_run_alarm: 120
alarm_if_fail: 1
profile: "XXXXXXXXXXXXX"
timezone: CentralTime
watch_file: "XXXXXXXXXXXXXXXXXXXXXXXXXX"
watch_interval: 30

В приведенном выше jil, как только я нахожу ключевое слово watch_file, мне нужно вернуться и также зафиксировать имя задания, которое находится в разделе insert_job. У меня есть несколько jils в файле, и мне нужно найти и записать в выходной файл.

-3
l0b0 6 Июл 2018 в 07:01
1
Привет и добро пожаловать в unix.SE! Поскольку ваш вопрос стоит, на него, вероятно, нельзя ответить. Не могли бы вы объяснить, что такое «jil», каков ваш ожидаемый результат и показать код, который у вас есть?
 – 
l0b0
6 Июл 2018 в 07:03
Спасибо всем за ваш ответ, @Theophrastus: - Да, если мы захватим имя задания и выгрузим его всякий раз, когда мы получим совпадение с watch_file. Не могли бы вы показать мне способ для этого.
 – 
Sumit C
6 Июл 2018 в 09:12
Поделиться ожидаемым результатом.
 – 
Siva
6 Июл 2018 в 09:22
Ожидаемый результат: insert_job: захватите и эту запись watch_file: «XXXXXXXXXXXXXXXXXXXXXXXXXXXX» для каждого совпадения.
 – 
Sumit C
6 Июл 2018 в 10:01

1 ответ

Использование awk:

Если вы хотите захватить целые строки, содержащие ключевое слово:

 awk  '/^insert_job|^watch_file/' file

Что также можно сделать с помощью grep:

grep -E '^insert_job|^watch_file' file

Если вы хотите захватить только поля после ключевых слов insert_job: и watch_file:, используйте параметр -F для установки разделителя полей:

awk -F'[^ ]*: *' '/^insert_job/{a=$2}/^watch_file/{print a, $2}' file
1
oliv 6 Июл 2018 в 10:27
Спасибо за код, я использовал первый для печати всей строки, и он дает мне только первые 6 записей, в то время как у нас есть более десяти 1900 в файле. Не могли бы вы предложить, я использовал ниже код awk -F'[^]* : *' '/^insert_job/{a=$2}/^watch_file/{print a, $2}' /home/nbdhbfy/CSDI_CRH_job.txt >> output.txt
 – 
Sumit C
6 Июл 2018 в 10:00
Пожалуйста, попробуйте команду grep, которую я добавил в этот пост.
 – 
oliv
6 Июл 2018 в 10:27
Всегда ли ключевые слова insert_job и watch_file находятся в начале строки?
 – 
oliv
6 Июл 2018 в 10:28
Спасибо, oliv, за ваш ответ. Watch_file и Insert_job будут находиться в месте/позиции, показанной в примере данных. Однако позиция не является фиксированной и может варьироваться в зависимости от определения.
 – 
Sumit C
6 Июл 2018 в 11:55