Não há nada errado em usar uma variável temporária: variáveis são feitas para armazenar dados a serem usados várias vezes.
Neste caso, você pode combinar as duas chamadas grep / sed em uma única chamada para o GNU grep, sed ou awk. É fácil com o sed: passar a opção -n
para produzir somente linhas explicitamente impressas e imprimir as linhas nas quais uma substituição é feita.
echo "$(
iw dev wlp1s0 link |
sed -nr -e 's/^\s*SSID:\s//p' -e 's/^\s*signal:\s//'
)"
Existe uma diferença em relação ao seu script original: o SSID e os valores do sinal são impressos na ordem em que aparecem na saída de iw
. Se você quisesse ser independente dessa ordem, seria complicado com sed, então o awk seria a ferramenta preferida. Com essa abordagem, é tão fácil obter a saída em uma única linha. O script a seguir imprime o último valor para cada configuração ( iw
gera apenas um, portanto, neste caso específico, não importa); mudar, e. ssid = $0
to ssid = ssid " " $0
para imprimir todos eles.
iw dev wlp1s0 link | awk '
$1=="SSID:" {sub(/[^:]*:[[:space:]]*/,""); ssid = $0}
$1=="signal:" {sub(/[^:]*:[[:space:]]*/,""); signal = $0}
END {print ssid, signal}
'
Em geral, se você quiser enviar a saída de um comando para dois filtros diferentes, você pode usar tee
e passá-lo a substituição de processos . Este é um recurso bash (do ksh93, também presente no zsh, mas não no sh simples) que generaliza os pipes. O comando tee
vê um nome de arquivo que designa um canal conectado ao comando especificado.
iw dev wlp1s0 link | tee >(
grep '^\s*SSID:\s' |
sed -r 's/^\s*SSID:\s//'
) |
grep '^\s*signal:\s' |
sed -r 's/^\s*signal:\s//'
Uma limitação dessa abordagem é que o comando na substituição do processo é executado em sua própria sub-camada. Você não pode obter variáveis de volta ou controlar como sua saída é intercalada com outras.