#awk #sed #grep
Вопрос:
Есть ли способ не отображать блок между двумя шаблонами, когда он соответствует строке внутри блока и соответствует только 2-му вхождению второго шаблона?
пример :
test, test-xxx-a2, Deployment (apps) has changed:
...
- value: 4.x.x
value: x.3.x
...
test, test-xxxio-3, Deployment (apps) has changed:
...
- replicas: 3
replicas: 5
...
test, test-xxx-xxx, Deployment (apps) has changed:
...
- value: x.2.x
value: x.x.x
...
test, test-xxxio-1, Deployment (apps) has changed:
...
- replicas: 3
replicas: 5
...
test, test-xxxio-4, Deployment (apps) has add:
...
text...
...
test, test-xxx-test2, Deployment (apps) has changed:
...
- replicas: 3
replicas: 2
...
text, text-123-xxx, Deployment (apps) has changed:
...
- replicas: 1
replicas: 2
...
- value: 2.1.0
value: 42.4.0
...
Желание выхода:
test, test-xxx-a2, Deployment (apps) has changed:
...
- value: 4.x.x
value: x.3.x
...
test, test-xxx-xxx, Deployment (apps) has changed:
...
- value: x.2.x
value: x.x.x
...
test, test-xxxio-4, Deployment (apps) has add:
...
text...
...
text, text-123-xxx, Deployment (apps) has changed:
...
- value: 2.1.0
value: 42.4.0
...
первый образец: changed:
второй шаблон: ...
(только второй)
строка, содержащая: replicas
регулярное выражение, над которым я работаю https://regex101.com/r/FTGBxG/1, но, конечно, это не мое выходное желание.
Комментарии:
1. Конец вашего образца ввода, похоже, испорчен, посмотрите и исправьте это.
Ответ №1:
$ awk -v ORS= '
{ buf = buf $0 RS }
($0 == "...") amp;amp; (( sepCnt % 2) == 0) {
if ( buf !~ /replicas/ ) {
print buf
}
buf=""
}
' file
test, test-xxx-a2, Deployment (apps) has changed:
...
- value: 4.x.x
value: x.3.x
...
test, test-xxx-xxx, Deployment (apps) has changed:
...
- value: x.2.x
value: x.x.x
...
test, test-xxxio-4, Deployment (apps) has add:
...
text...
...
Комментарии:
1. Это очень хорошее решение короче моего
Ответ №2:
Вы можете использовать этот awk
скрипт:
cat filter.awk
index($0, "Deployment (apps)") {
p = 1
s = ""
num3dots = 0
}
p {s = s $0 ORS}
index($0, "...") == 1 amp;amp; num3dots == 2 {
if ( s !~ /changed:.* replicas/ )
printf "%s", s
p = 0
}
Затем используйте его как:
awk -f filter.awk file
test, test-xxx-a2, Deployment (apps) has changed:
...
- value: 4.x.x
value: x.3.x
...
test, test-xxx-xxx, Deployment (apps) has changed:
...
- value: x.2.x
value: x.x.x
...
test, test-xxxio-4, Deployment (apps) has add:
...
text...
...
Комментарии:
1. Хорошая мысль, Эд. Теперь я все исправил.