Existem muitas maneiras de fazer isso, mas se você quiser ficar apenas / principalmente bash, aqui estão duas abordagens.
-
system_profilertem uma opção para saída para XML. Use isso para colocar a saída em uma variável ou arquivo, assim, certificando-se de incluir as aspas duplas:someVar="$(system_profiler SPDisplaysDataType -xml)" -
Isso retorna uma matriz em
_itemschamada_IODisplayEDID, que lista o nome de exibição como_namee a resolução como_IODisplayEDID -
Se você está comprometido / obrigado a mantê-lo no bash, aqui está uma boa resposta no StackOverflow.com para Como analisar XML no bash que eu não vou reesh. Mas, neste ponto, você deve considerar o uso de um XMLStartlet de analisador de XML ou
xsltproc, incluído no Xcode Dev Tools.
Tudo o que disse, você ainda pode ir a rota grep , mas tem que fazer alguma suposição sobre o comprimento total da saída e a colocação de "Resolução" para a exibição que você está interessado. Aqui está um teste bruto baseado no meu sistema de exibição 2:
-
Primeiro, obtenha os nomes para exibição. Para contabilizar os espaços no nome, você pode redefinir temporariamente o $ IFS para usar apenas uma nova linha e usar
grep -Apara obter 50 linhas (uma estimativa) depois de "Exibições", não retornar a primeira linha e obter os valores de nome, uma vez que eles terminam em:( isso é um monte de suposições para fazer! )IFStemp=${IFS} IFS=$'\n' var=($(system_profiler SPDisplaysDataType|grep -A 50 \ Displays|grep -v Displays|egrep ':$')) -
Use isso para saber onde "Resolution" será. Você pode obviamente sub
printfpara um nome de variável, mas eu queria mostrar a saída. Eu useisedpara aparar os espaços iniciais.for displayName in ${var[@]}; do printf '%s = %s\n' "${displayName%?}" "$(system_profiler SPDisplaysDataType|grep -A 3 "${displayName}"|grep Resolution|sed -e 's/^[[:space:]]*//g' -e 's/Resolution\:\ //g')" done -
Agora restaure você $ IFS
IFS=${IFStemp} unset IFStemp
E aqui está o resultado para mim:
Color LCD = 2880 x 1800 Retina
DELL 2007WFP = 1920 x 1200 @ 60 Hz