#shell #awk #sed
#оболочка #awk #sed
Вопрос:
У меня есть 25-строчный файл, который выглядит как:
cat -n oz
1 PARSING IN CURSOR #140499 dep=0 tim=4217919222030 sqlid='ftf4q8xj38z7k'
2 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919224736
3 WAIT #1404991: nam='SQL*Net message' ela= 655 tim=4217919225409
4 PARSING IN CURSOR #140499 dep=0 tim=4217919225606 sqlid='9fufagwmu041b'
5 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919225677
6 WAIT #1404991: nam='SQL*Net message' ela= 736 tim=4217919226432
7 PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
8 WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
9 WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
10 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919228849
11 PARSING IN CURSOR #140499 dep=1 tim=4217919225606 sqlid='9fufagwmu041b'
12 WAIT #1404991: nam='SQL*Net message' ela= 603 tim=4217919229470
13 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919229647
14 WAIT #1404991: nam='SQL*Net message' ela= 521 tim=4217919230185
15 WAIT #1404991: nam='SQL*Net message' ela= 0 tim=4217919230330
16 WAIT #1404991: nam='SQL*Net message' ela= 758 tim=4217919231107
17 WAIT #1404990: nam='SQL*Net message' ela= 0 tim=4217919231222
18 WAIT #1404990: nam='SQL*Net message' ela= 1635 tim=4217919232874
19 PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
20 WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
21 WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
22 PARSING IN CURSOR #140499 dep=1 tim=4217919225606 sqlid='9fufagwmu041b'
23 WAIT #1404991: nam='SQL*Net message' ela= 521 tim=4217919230185
24 WAIT #1404991: nam='SQL*Net message' ela= 0 tim=4217919230330
25 WAIT #1404991: nam='SQL*Net message' ela= 758 tim=4217919231107
что я хочу преобразовать в («cat -n» того же файла после обработки):
1 PARSING IN CURSOR #140499 dep=0 tim=4217919222030 sqlid='ftf4q8xj38z7k'
2 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919224736
3 WAIT #1404991: nam='SQL*Net message' ela= 655 tim=4217919225409
4 PARSING IN CURSOR #140499 dep=0 tim=4217919225606 sqlid='9fufagwmu041b'
5 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919225677
6 WAIT #1404991: nam='SQL*Net message' ela= 736 tim=4217919226432
7 PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
8 WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
9 WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
10 WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919228849
11 PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
12 WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
13 WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
Алгоритм таков:
o содержит ли первая строка (всегда будет начинаться с «PARS …») «dep = 1» ?,
o если да, я продолжаю чтение, не выводя ничего до следующего «PARS …»,
o если содержит «dep = 0», я показываю его вместе с последующими,до следующего «PARS …»,
o затем снова ту же проверку, … и т.д.
Насколько легко это можно сделать? Возможно, используя простую команду оболочки (cat и т. Д.)? Но мой файл довольно большой …
большое спасибо.
Seb
Комментарии:
1. Пожалуйста, добавьте к образцу данных (и отсутствующим ожидаемым результатам и проделанной работе при их публикации) 4 пробела для лучшей читаемости. Кроме того, вы должны решить, хотите ли вы строки от n до nn или фильтрацию на основе содержимого. Спасибо. О, как легко это можно сделать , я бы использовал awk или sed для этого, в зависимости. Добавьте эти теги тоже.
Ответ №1:
Просто сделайте что-то вроде:
awk '/^PARSING IN CURSOR/{ t = match($0, "dep=1")} !t' input
Каждый раз, когда строка ввода совпадает PARSING IN CURSOR
, проверяйте, соответствует ли строка строке dep=1
, и устанавливайте t
соответственно. !t
Вызывает вывод строки, если dep=1
ее не было в заголовке. Если dep=1
было в заголовке, то !t
значение false и вывод не генерируется.
например:
$ cat input
PARSING IN CURSOR #140499 dep=0 tim=4217919222030 sqlid='ftf4q8xj38z7k'
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919224736
WAIT #1404991: nam='SQL*Net message' ela= 655 tim=4217919225409
PARSING IN CURSOR #140499 dep=0 tim=4217919225606 sqlid='9fufagwmu041b'
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919225677
WAIT #1404991: nam='SQL*Net message' ela= 736 tim=4217919226432
PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919228849
PARSING IN CURSOR #140499 dep=1 tim=4217919225606 sqlid='9fufagwmu041b'
WAIT #1404991: nam='SQL*Net message' ela= 603 tim=4217919229470
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919229647
WAIT #1404991: nam='SQL*Net message' ela= 521 tim=4217919230185
WAIT #1404991: nam='SQL*Net message' ela= 0 tim=4217919230330
WAIT #1404991: nam='SQL*Net message' ela= 758 tim=4217919231107
WAIT #1404990: nam='SQL*Net message' ela= 0 tim=4217919231222
WAIT #1404990: nam='SQL*Net message' ela= 1635 tim=4217919232874
PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
PARSING IN CURSOR #140499 dep=1 tim=4217919225606 sqlid='9fufagwmu041b'
WAIT #1404991: nam='SQL*Net message' ela= 521 tim=4217919230185
WAIT #1404991: nam='SQL*Net message' ela= 0 tim=4217919230330
WAIT #1404991: nam='SQL*Net message' ela= 758 tim=4217919231107
$ awk '/^PARSING IN CURSOR/{ t = match($0, "dep=1")} !t' input
PARSING IN CURSOR #140499 dep=0 tim=4217919222030 sqlid='ftf4q8xj38z7k'
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919224736
WAIT #1404991: nam='SQL*Net message' ela= 655 tim=4217919225409
PARSING IN CURSOR #140499 dep=0 tim=4217919225606 sqlid='9fufagwmu041b'
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919225677
WAIT #1404991: nam='SQL*Net message' ela= 736 tim=4217919226432
PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710
WAIT #1404991: nam='SQL*Net message' ela= 1 tim=4217919228849
PARSING IN CURSOR #140499 dep=0 tim=4217919226577 sqlid='bzdm0nbr7c036'
WAIT #1404990: nam='SQL*Net message' ela= 1 tim=4217919226665
WAIT #1404990: nam='SQL*Net message' ela= 2027 tim=4217919228710