Переупорядочение строк в Linux

Я не полностью уверен, но я не думаю, что Вам нужна часть установки, хотя я добавил его явно. Я также не протестировал его, но я думаю, что это должно помочь Вам начать:

[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no

[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=shutdown.target
0
13.04.2013, 15:55
2 ответа

Зависит от того, где, как часто, почему и т.д. Вы делаете это, но не повредило бы помещать его в сценарий.

Во всяком случае Вы могли сделать что-то вроде этого для печати в определенном порядке. Этим подходом можно также принять решение только распечатать выбранный немногие. Например, только 1 и 3:

Один лайнер:

awk -v order=312 \
'/^/{ln[NR]=$0}END{split(order,a,"");
 for(i in a)printf("%s\n",ln[a[i]]);}' \
 sample.txt

Или более легкий читать:

/^/{
    ln[NR] = $0
}
END{
    split(order,a,"");

    for(i in a)
        printf("%s\n",ln[a[i]]);
}

Для разделения Вы могли добавить некоторый разделитель если более затем 9 строк.

Например:

split(order,a,"-");
# and call by:
awk -v order=3-13-21-12-2 ...

Или поддерживать несколько:

if (order ~ /-/)       split(order, a, "-"); # order has "-", split
else if (order ~ /\./) split(order, a, "."); # order has ".", split
else if (order ~/:/)   split(order, a, ":"); # order has ":", split
else                   split(order, a, "");  # none presume numbers split all

Вы могли также принять решение соответствовать строкам как в:

BEGIN {
    i = 0;
}
/^\s*Acct-Status-Type/ {ln[++i] = $0 }
/^\s*User-Name/ {ln[++i] = $0 }
/^\s*Event-Timestamp/ {ln[++i] = $0 }
END {
    if (order ~ /-/)  split(order, a, "-");
    else if (order ~ /\./) split(order, a, ".");
    else if (order ~/:/) split(order, a, ":");
    else split(order, a, "")
    for (i in a)
        printf("%s\n", ln[a[i]]);
}

Править:

Для последнего образца это, вероятно, было бы лучше. (Также обновленный разделение):

/^\s*Acct-Status-Type/ {ln[1] = $0 }
/^\s*User-Name/ {ln[2] = $0 }
/^\s*Event-Timestamp/ {ln[3] = $0 }
END {
    if (split(order, a, "-|:|,| |\\.") == 1) # Space require quoting of arg.
        split(order, a, "")
    for (i in a)
        printf("%s\n", ln[a[i]]);
}
2
28.01.2020, 02:28

С Python и названием файла как параметр командной строки к программе:

import sys
with open(sys.argv[1]) as fp:
    for line in fp.readlines()[::-1]:
        sys.stdout.write(line)

или обратная запись его в тот файл:

import sys
with open(sys.argv[1]) as fp:
    lines = fp.readlines()
with open(sys.argv[1], 'w') as fp:
    for line in lines[::-1]:
        fp.write(line)

или как фильтр от stdin до stdout:

lines = sys.stdin.readlines()
for line in lines[::-1]:
    sys.stdout.write(line)
1
28.01.2020, 02:28
  • 1
    :/. Я отредактировал Ваше сообщение, но ничего на самом деле не изменил так, чтобы я мог инвертировать свой downvote (Вы не можете изменить голосование, если сообщение не было отредактировано). Все извинения. –  goldilocks 13.04.2013, 14:14
  • 2
    @goldilocks Без проблем. Я действительно люблю Python и рад предоставить решения с ним, но это не единственный инструмент ни для какого данного задания. И я надеюсь, когда я фанатичен, кто-то исправляет меня (в этом случае, я сразу удалю ответ), –  Anthon 13.04.2013, 15:13
  • 3
    Почему Python? Как это лучше, чем tac? (Или sort -ro file file для версии перезаписи?) –  depquid 13.04.2013, 22:38

Теги

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