Grep end regex matching

0

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:

  • Isso poderia ser mais conciso em Perl?

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.

  • Poderia isso ser feito de forma concisa usando ferramentas UNIX mais básicas? (grep / sed / awk)?

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?

    
por Robottinosino 29.03.2013 / 20:34

3 respostas

1

Awk seria o mais adequado:

system_profiler SPHardwareDataType | awk  -F': ' '/Memory:/{print $2}'
    
por 29.03.2013 / 20:36
0

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'

por 29.03.2013 / 20:51
0
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.

    
por 29.03.2013 / 23:34

Tags