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.