Una solución con GNU sed:
sed -e 's/} {/\n/g' -e 's/^{//' -e 's/}//' input-file > output-file
cmd=$(dig soa "$1" +short | awk '{print $3}'; echo -n \<----------;)
echo "-------------------------- SOA --------------------------------"
echo " "
echo -n " ---------> ";echo $cmd
#!/bin/sh
soa=$(dig soa "$1" +short | awk '{print $3}')
cat <<__EOF__
-------------------------- SOA -----------------------------
---------> $soa <-------------
__EOF__
Кстати, я думаю, что вопрос неправильно -озаглавлен, потому что печать всего этого мусора заголовков вокруг SOA просто бессмысленно усложняет использование вывода этого скрипта в качестве входных данных для другого скрипта... и даже когда вы этого не делаете. В настоящее время вы не думаете, что вам когда-либо понадобится это сделать, в будущем вам может понадобиться. Многословие в выводе является "грехом" в Unix :)-. При написании скрипта вы всегда должны думать, что ваш вывод может оказаться чьим-то (в том числе и вашим )вводом.
Я бы проигнорировал этот вопрос, но другой ответ мне не понравился еще больше. Если вы собираетесь сделать что-то неправильно, вы можете сделать это правильно.
Вместо этого я бы сделал все это в printf
:
#!/bin/sh
header='-------------------------- SOA --------------------------'
headerLength=$(awk '{print length()}' <<<"$header")
value=$(dig soa "$1" +short | awk '{print $3}')
valueString="-----------> $value <-------------"
valueLength=$(awk '{print length()}' <<<"$valueString")
offset=$(((headerLength + valueLength)/2+1))
printf "%s\n\n%${offset}s\n" "$header" "$valueString"
Это имеет то преимущество, что всегда отображается по центру, независимо от длины вашего значения (с использованием слегка измененной версии, которая просто устанавливает value=$1
для иллюстрации):
$ foo.sh 2019072905
-------------------------- SOA --------------------------------
-----------> 2019072905 <-------------
$ foo.sh "some random long string"
-------------------------- SOA --------------------------------
-----------> some random long string <-------------
$ foo.sh "foo"
-------------------------- SOA --------------------------
-----------> foo <-------------
У меня нет dig, поэтому я использовал эхо для этого примера:
$ echo '2019072905' | awk '
BEGIN { d=sprintf("%15s",""); gsub(/ /,"-",d); print d d, "SOA", d d ORS }
{ printf "%*s> %s <%s\n", 2*length(d)-length($0)/2+1, d, $0, d }
'
------------------------------ SOA ------------------------------
---------------> 2019072905 <---------------
$ echo '201' | awk '
BEGIN { d=sprintf("%15s",""); gsub(/ /,"-",d); print d d, "SOA", d d ORS }
{ printf "%*s> %s <%s\n", 2*length(d)-length($0)/2+1, d, $0, d }
'
------------------------------ SOA ------------------------------
---------------> 201 <---------------
$ echo '12345672019072905' | awk '
BEGIN { d=sprintf("%15s",""); gsub(/ /,"-",d); print d d, "SOA", d d ORS }
{ printf "%*s> %s <%s\n", 2*length(d)-length($0)/2+1, d, $0, d }
'
------------------------------ SOA ------------------------------
---------------> 12345672019072905 <---------------