Использование нескольких операторов sed в командной строке

Использование нескольких операторов sed в командной строке

Я использую команду ниже для вывода списка 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 -uto 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$//'

Однако трудно сказать, не зная, какие входные данные являются допустимыми и какой выходной сигнал желателен.

Связанный контент