
Я использую команду ниже для вывода списка IP-адресов в одной строке с оператором «рабочий IP» после каждого IP-адреса.
cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' | sed 's/$/ working IP/' | sed -e '0,/ working IP/ s/ working IP//' | sed '$ d' | paste -s -d ' ' | sed 's/working IP$//'
Вывод выглядит так:
147.123.41.112 working IP 129.138.70.113 working IP 173.230.45.54 working
IP 133.218.250.56 working IP 136.203.152.128 working IP 117.22.29.254
working IP 117.3.11.111 working IP 127.59.131.236
Я передал его в sed несколько раз, чтобы он выглядел так, как мне хотелось. Есть ли лучший подход, чем использовать sed несколько раз?
решение1
Речь идет не только о комбинировании нескольких sed
команд (Джейсен объяснил эту часть в своем ответе). Вы можете узнать больше:
cat file | sort ...
cat
не требуется, так как вы можете указать sort
имя файла, вам не нужно было этого делать cat
раньше, но сделайте это
sort file | uniq -c | awk ...
uniq -c
удаляет дубликаты и добавляет счетчик, но так как следующий awk
использует только третий comlun, то счетчик в любом случае отбрасывается. Вы можете отбросить -c
и заменить все uniq
на option -u
to sort
:
sort -u file | awk -F " " '{print $2}' | sed ...
Здесь вы неправильно используете awk
для cut -d" " -f 2
, но вы вольны это делать. Но теперь вы можете продолжать использовать awk
или делать этот шаг в sed
, также. Нет необходимости переключать инструменты для задачи, которая может быть одинаково выполнена в каждом инструменте:
sort -u file | sed 's/[^ ]* *\([^ ]*\).*/\1 working IP/' ...
Здесь это начинает быть странным, не зная входного файла. Но если вы добавляете working IP
к каждой строке, то удалите его для всех в диапазоне до его первого появления, это должно быть идентично добавлению ко всем строкам, кроме первой:
sort -u file | sed 's/[^ ]* *//;s/ .*//;1!s/$/ working IP/'
Далее, paste
можно легко включить в , sed
собрав строки в удерживаемом пространстве и заменив затем первые новые строки пробелом, а все остальные — working IP
. В то же время можно удалить последнюю строку ( $ d
), так что вся длинная командная строка с 6 различными командами и 8 каналами сгорит до простого sort
, только один канал и короткий sed
скрипт:
sort -u file | sed 's/[^ ]* *//;s/ .*//;$!{H;1h;d;};x;s/\n/ /;s// working IP /g'
Идентичный результат без траты жизни на чтение вариантов на man
страницах и анализ того, что происходит на каждом этапе.
решение2
вероятно, можно объединить первые три вызова sed следующим образом
cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' |
sed 's/$/ working IP/;s/ working IP//; $ d' | paste -s -d ' ' |
sed 's/working IP$//'
Однако трудно сказать, не зная, какие входные данные являются допустимыми и какой выходной сигнал желателен.