Можно попробовать так
sed '/Queue/{N;$d;N;$d;N;/==$/d}' infile
Это просто втягивает следующие три строки, если строка соответствует Queue
. Если пробел шаблона заканчивается разделителем1, он удаляет его (или если либо2 1-я строка, либо 2-я втягиваемая строка является последней во вводе).
Если другие строки могут заканчиваться последовательными знаками =
, вам следует заменить ==$
в regex на точное соответствие разделителю, например, =\{37\}$
1: Это предполагает, что разделителем является строка, соответствующая ^[[:blank:]]*==*$
(поэтому нет пробелов).
2: Поскольку содержимое вашего файла создается скриптом, файл всегда должен заканчиваться пустой строкой - поэтому sed должен проверять, является ли вторая втягиваемая строка последней строкой в файле (чтобы определить, является ли последний блок пустым), но в вашем примере эта завершающая строка отсутствует, поэтому либо....
Основываясь на прекрасном ответе @hauke -laging, я хотел расширить некоторые дополнительные детали, чтобы масштабировать его ответ для использования с более широким набором проблем. Его решение предполагает, что ввод будет одним столбцом. Если у вас есть случайное поле, над которым вы хотите выполнить ту же операцию, вы можете сделать следующее.
Скажем, у меня есть следующий вывод, созданный этой командой:
$ oc get po -o wide --all-namespaces | grep ContainerCreat
ns8 pod8 0/1 ContainerCreating 0 2m <none> ocp-app-01b.lab1.somedom.local <none>
ns9 pod9 0/1 ContainerCreating 0 2m <none> ocp-app-01b.lab1.somedom.local <none>
ns1 pod1 0/1 ContainerCreating 0 45s <none> ocp-app-01i.lab1.somedom.local <none>
ns2 pod2 0/1 ContainerCreating 0 58s <none> ocp-app-01i.lab1.somedom.local <none>
ns3 pod3 0/1 ContainerCreating 0 58s <none> ocp-app-01i.lab1.somedom.local <none>
ns5 pod5 0/1 ContainerCreating 0 1m <none> ocp-app-01i.lab1.somedom.local <none>
ns6 pod6 0/1 ContainerCreating 0 2m <none> ocp-app-01g.lab1.somedom.local <none>
ns4 pod4 0/1 ContainerCreating 0 1m <none> ocp-app-01i.lab1.somedom.local <none>
ns7 pod7 0/1 ContainerCreating 0 2m <none> ocp-app-01b.lab1.somedom.local <none>
Вы можете использовать следующее, чтобы выбрать 6-е поле, $6
, а затем выполнить операцию, показанную в другом ответе. Метод простой, но эффективный.
По сути, вы берете интересующий столбец, $6
в этом примере, и выполняете для него расчет с использованием соответствующего коэффициента преобразования на основе имеющихся единиц измерения.
После преобразования вычисление добавляется как часть вывода, используется для правильной сортировки вывода на основе значения расширенной формы этого столбца, а затем удаляется в окончательном выводе данных столбца.
$ oc get po -o wide --all-namespaces | \
grep ContainerCreat | \
awk '{ unitvalue=$6; }; \
$6 ~ /[0-9]+s/ { m=1 }; \
$6 ~ /[0-9]+m/ { m=60 }; \
$6 ~ /[0-9]+h/ { m=3600 }; \
$6 ~ /[0-9]+d/ { m=86400 }; \
{ \
sub("[smhd]","",unitvalue); \
unitvalue=unitvalue*m; \
print unitvalue, $1, $4, $6, $8; \
}' | \
sort -rn -k1,1 | \
awk '{print $2,$3,$4,$5}' | column -t
$ oc get po -o wide --all-namespaces | \
grep ContainerCreat | \
awk '{ unitvalue=$6; }; \
$6 ~ /[0-9]+s/ { m=1 }; \
$6 ~ /[0-9]+m/ { m=60 }; \
$6 ~ /[0-9]+h/ { m=3600 }; \
$6 ~ /[0-9]+d/ { m=86400 }; \
{ \
sub("[smhd]","",unitvalue); \
unitvalue=unitvalue*m; \
print unitvalue, $1, $4, $6, $8; \
}' | \
sort -rn -k1,1 | \
awk '{print $2,$3,$4,$5}' | column -t
ns1 ContainerCreating 45s ocp-app-01i.lab1.somedom.local
ns2 ContainerCreating 58s ocp-app-01i.lab1.somedom.local
ns3 ContainerCreating 58s ocp-app-01i.lab1.somedom.local
ns4 ContainerCreating 1m ocp-app-01i.lab1.somedom.local
ns5 ContainerCreating 1m ocp-app-01i.lab1.somedom.local
ns6 ContainerCreating 2m ocp-app-01g.lab1.somedom.local
ns7 ContainerCreating 2m ocp-app-01b.lab1.somedom.local
ns8 ContainerCreating 2m ocp-app-01b.lab1.somedom.local
ns9 ContainerCreating 2m ocp-app-01b.lab1.somedom.local
Обратите внимание, что в окончательном выводе данные отсортированы по исходному $6
столбцу в числовом порядке в зависимости от времени.
Очень хороший ответ здесь slm , но я могу подтвердить, что он не распознает все случаи с s/m/h/d:
kubectl get pods --all-namespaces --field-selector=status.phase=Succeeded | \
awk '{ unitvalue=$6; }; \
$6 ~ /[0-9]+s/ { m=1 }; \
$6 ~ /[0-9]+m/ { m=60 }; \
$6 ~ /[0-9]+h/ { m=3600 }; \
$6 ~ /[0-9]+d/ { m=86400 }; \
{ \
sub("[smhd]","",unitvalue); \
unitvalue=unitvalue*m; \
print unitvalue, $1, $4, $6, $8; \
}' | \
sort -rn -k1,1 | \
awk '{print $2,$3,$4,$5}' | column -t
у меня плохие результаты:
0 NAMESPACE STATUS AGE
11923200 istio-system Completed 138d
11923200 istio-system Completed 138d
11923200 istio-system Completed 138d
4579200 kube-system Completed 53d
4579200 kube-system Completed 53d
11318400 kube-system Completed 131d
11318400 kube-system Completed 131d
11318400 kube-system Completed 131d
18144000 kube-system Completed 210d
11318400 kube-system Completed 131d
2160000 prod Completed 2d5h
104400 prod Completed 29h
1872000 prod Completed 5h20m
похоже, что когда вы пытаетесь подсчитать 5 ч 20 м, это сходит с ума, я попробовал другое решение, и значения в порядке, но невозможно передать их остальной части команды:
kubectl get pods --all-namespaces --field-selector=status.phase=Succeeded | awk '{print $6}' | \
> gawk '
> /s/ { factor = 1 }
> /m/ { factor = 60 }
> /h/ { factor = 3600 }
> /d/ { factor = 86400 }
> {
> print $0 * factor, $0;
> }'
0 AGE
11923200 138d
11923200 138d
11923200 138d
4579200 53d
4579200 53d
11318400 131d
11318400 131d
11318400 131d
18144000 210d
11318400 131d
172800 2d5h
104400 29h
18000 5h30m
Обратите внимание, что:
1872000 prod Completed 5h20m
против
18000 5h30m