Как отсортировать файл по столбцу продолжительности?

Можно попробовать так

sed '/Queue/{N;$d;N;$d;N;/==$/d}' infile

Это просто втягивает следующие три строки, если строка соответствует Queue. Если пробел шаблона заканчивается разделителем1, он удаляет его (или если либо2 1-я строка, либо 2-я втягиваемая строка является последней во вводе).
Если другие строки могут заканчиваться последовательными знаками =, вам следует заменить ==$ в regex на точное соответствие разделителю, например, =\{37\}$


1: Это предполагает, что разделителем является строка, соответствующая ^[[:blank:]]*==*$ (поэтому нет пробелов).
2: Поскольку содержимое вашего файла создается скриптом, файл всегда должен заканчиваться пустой строкой - поэтому sed должен проверять, является ли вторая втягиваемая строка последней строкой в файле (чтобы определить, является ли последний блок пустым), но в вашем примере эта завершающая строка отсутствует, поэтому либо....

3
15.10.2017, 21:58
2 ответа

Основываясь на прекрасном ответе @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столбцу в числовом порядке в зависимости от времени.

0
27.01.2020, 21:07

Очень хороший ответ здесь 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
0
05.01.2021, 14:41

Теги

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