grep은 정규식 일치를 종료합니다.

grep은 정규식 일치를 종료합니다.

OS X에서는 system_profiler SPHardwareDataType다음을 출력합니다.

Hardware Overview:

  Model Name: MacBook Pro
  Total Number of Cores: 4
  L2 Cache (per Core): 256 KB
  L3 Cache: 8 MB
  Memory: 8 GB

Memory공백을 제거한 값을 얻고 싶습니다 .

이것이 내가 가진 것입니다:

system_profiler SPHardwareDataType | grep --color=never -E '^ +Memory: ' | cut -d ':' -f 2

안좋다. 공백을 유지합니다.

나는 이것으로 전환했습니다 :

system_profiler SPHardwareDataType | perl -ne 'if(/^ +Memory: (.*)$/){print $1;}'

나는 묻고 싶다:

  • Perl에서 이것을 더 간결하게 만들 수 있습니까?

중괄호는 나를 짜증나게 하고 종종 잘못 입력합니다. 조건을 추가해야 하는 것도 ()번거롭다 . 세미콜론은 번거롭습니다.

  • 보다 기본적인 UNIX 도구를 사용하여 이 작업을 깔끔하게 수행할 수 있습니까? (grep/sed/awk)?

참고: 저는 제가 좋아하는 이 라인을 사용하지 않습니다..

system_profiler SPHardwareDataType | sed -Ene 's/^ +Memory: (.*)$/\1/g p'

확장된 정규 표현식(일부 플랫폼에서는 가능합니까?)과 라인에서 작동한다는 것을 알고 있기 때문에 -E명시적으로 인쇄하지 않는 한 출력을 억제합니다. 이것은 일반 정규 표현식입니다. 그리고 a 뒤의 명령은 다음과 같습니다. 일치하는 줄에서만 실행됩니다. .그 자체가 동작이라는 사실이 혼란스럽습니다..그래서 그 전에 동작이 필요하기를 바랍니다..이상한 점은 명령을 실행하기 위한 조건으로 match를 대체하고 사용할 수 있다는 것입니다..그건 라인이 정확히 맞나요?-rsed-nps//gsubstitutematchs//gp;

답변1

Awk를 사용하면 다음과 같이 간단해집니다.

system_profiler SPHardwareDataType | awk  -F': ' '/Memory:/{print $2}'

답변2

이것이 Perl에서 정말로 필요한 전부입니다:

system_profiler SPHardwareDataType | perl -nle '/ry:\s*(.*)/ && print $1'

기타 옵션:

  • system_profiler SPHardwareDataType | /bin/grep Me | gawk '{print $2,$3}'

    /bin/grep을 사용하면 에 정의된 별칭이 제거 --color=never됩니다 (적어도 대부분의 Linux 배포판 에서는 마찬가지이며 OSX에서도 마찬가지일 것으로 추측됩니다).grepgrep --color=auto/etc/bash.bashrc

  • system_profiler SPHardwareDataType | /bin/grep Me | /bin/egrep -o '[1-9]+.+'

    이로 -o인해 grep은 일치하는 문자만 인쇄합니다.

  • system_profiler SPHardwareDataType | tail -n 1 | cut -d ' ' -f 4,5

  • system_profiler SPHardwareDataType | tail -n 1 | sed 's/.*: //g'

답변3

system_profiler SPHardwareDataType | sed -n 's/^ *Memory: //p'

ps이는 command 가 아닌 명령 ( 과 같은 g) 의 플래그 p이며 대체가 발생하면 패턴 공간을 인쇄한다는 의미입니다. g패턴은 한 번만 일치할 수 있으므로 여기서는 필요하지 않습니다 .

관련 정보