Awk seria o mais adequado:
system_profiler SPHardwareDataType | awk -F': ' '/Memory:/{print $2}'
No OS X, system_profiler SPHardwareDataType
outputs:
Hardware Overview:
Model Name: MacBook Pro
Total Number of Cores: 4
L2 Cache (per Core): 256 KB
L3 Cache: 8 MB
Memory: 8 GB
Eu quero obter o valor de Memory
, cortado de espaços em branco.
Isso é o que eu tinha:
system_profiler SPHardwareDataType | grep --color=never -E '^ +Memory: ' | cut -d ':' -f 2
Não está ok. Mantém o espaço em branco.
Eu mudei para isso:
system_profiler SPHardwareDataType | perl -ne 'if(/^ +Memory: (.*)$/){print $1;}'
e eu gostaria de perguntar:
As chaves me incomodam, muitas vezes eu as digito errado. Ter que colocar a condição em ()
também é incômodo. O ponto e vírgula é incômodo.
Acho que esse idioma "grep for pattern and replace" deve ser muito comum para extrair informações. Eu sou um iniciante, mas um administrador / devops experiente talvez possa recomendar a melhor linha para usar?
Nota: eu não uso essa linha que eu gosto ..
system_profiler SPHardwareDataType | sed -Ene 's/^ +Memory: (.*)$//g p'
porque regexes estendidos ( -E
são -r
em algumas plataformas? possíveis?) e fundamentalmente porque, embora eu entenda que sed
funciona em linhas, -n
suprime a saída a menos que eu expressamente p
imprimi-lo, s//g
é um normal regex substitute
.. e os comandos que seguem um match
são executados apenas em linhas correspondentes. Estou intrigado com o fato de que s//g
na realidade é uma ação em si .. então eu espere que p
exija um ;
antes dele. É estranho que você possa substituir e usar a correspondência como uma condição para executar o comando .. esta linha está correta?
Isso é tudo o que você realmente precisa para o Perl:
system_profiler SPHardwareDataType | perl -nle '/ry:\s*(.*)/ && print $1'
Algumas outras opções:
system_profiler SPHardwareDataType | /bin/grep Me | gawk '{print $2,$3}'
O uso de / bin / grep elimina a necessidade de --color=never
. grep
é definido como um alias para grep --color=auto
in /etc/bash.bashrc
(pelo menos é na maioria das distribuições Linux e, eu acho, no OSX).
system_profiler SPHardwareDataType | /bin/grep Me | /bin/egrep -o '[1-9]+.+'
O -o
faz com que o grep apenas mostre os caracteres correspondentes.
system_profiler SPHardwareDataType | tail -n 1 | cut -d ' ' -f 4,5
system_profiler SPHardwareDataType | tail -n 1 | sed 's/.*: //g'
system_profiler SPHardwareDataType | sed -n 's/^ *Memory: //p'
p
aqui é um sinalizador para o comando s
(como g
), não o comando p
, e significa imprimir o espaço do padrão se a substituição ocorrer. Você não precisa de g
aqui, pois o padrão só pode ser igual a uma vez.