вы можете использовать следующий dc
фрагмент, чтобы получить результат:
$ dc -e "3k $x 1000/p"
Если я правильно вас понял:
$ tr -s '\n' ' ' < file | \
sed 's/client:/\n/g' | \
grep -o 'hostname: [^ ]\+ connection-0.*Purple\|hostname: [^ ]\+ $' | \
cut -d' ' -f2
tc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
tc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
tc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
tc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
tc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
$ tr -s '\n' ' '
преобразует файл в одну строку.
sed 's/client:/\n/g'
заменяет «клиент» на новую строку.
grep -o 'hostname: [^ ]\+ connection-0.*Purple\|hostname: [^ ]\+ $'
фиксирует линии, имеющие «соединение -0...Фиолетовый», или линии, не имеющие соединений.
hostname: tc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx connection-0: frdp::Purple
hostname: tc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
hostname: tc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx connection-0: frdp::Purple
hostname: tc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx connection-0: frdp::Purple
hostname: tc-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx connection-0: frdp::Purple
cut -d' ' -f2
вывести только имена хостов.
Для записи в новый файл добавьте > newfile
.
Использование любого awk в любой оболочке на каждом компьютере Unix:
$ cat tst.awk
$1 == "client:" {
prt()
}
/connection/ {
gotConns = 1
if ( /Purple/ ) {
gotTarget = 1
}
else {
gotOther = 1
}
}
$1 == "hostname:" {
host = $2 ORS
}
END {
prt()
}
function prt( found) {
if ( (gotTarget && !gotOther) || !gotConns ) {
printf "%s", host
}
host = gotConns = gotTarget = gotOther = ""
}
$ awk -f tst.awk file
tc-abcdefgh-igjk-lmno-pqrs-abcdefgh
tc-abcdefgh-igjk-lmno-pqrs-ijklmnop
tc-abcdefgh-igjk-lmno-pqrs-qrstuvwx
tc-abcdefgh-igjk-lmno-pqrs-09876543
tc-abcdefgh-igjk-lmno-pqrs-08649753