한 줄을 여러 문자로 나누는 방법은 무엇입니까?

한 줄을 여러 문자로 나누는 방법은 무엇입니까?

의 출력은 w | head -1내 컴퓨터에서 두 가지 다른 결과를 제공합니다.

16:34:42 up 32 days,  3:02,  1 user,  load average: 0.14, 0.11, 0.07
14:10:55 up 32 days, 39 min, 1 user, load average: 0.07, 0.13, 0.09

로드 평균(예: )을 구해야 합니다 0.07, 0.13, 0.09. 두 경우 모두에 대한 로드 평균을 항상 얻을 수 있도록 load average:행을 문자열 로 분할하려면 어떻게 해야 합니까?

답변1

awk를 사용할 수도 있습니다.

$ w | head -1 | awk '{print $10,$11,$12}'
0.80, 0.84, 0.93

또는 필드 수가 가변적인 경우 다음을 사용합니다.

$ w | head -1 | awk '{print $(NF-2),$(NF-1),$NF}'
0.81, 0.82, 0.91

아니면 좀 더 우아하게(@레티치아 감사합니다):

$ w | head -1 | awk -F "load average: " '{print $2}'

Seder:

$ w | head -1 | sed 's/.*load average: *//' 

진주:

$ w | head -1 | perl -pe 's/.*load average: *//' 

또는

$ w | head -1 | perl -lne '/.*load average: *(.*)/ && print $1' 

실제로 여기에서 사용할 수 있지만 colrm"행의 단일 문자"로 정의된 "열"을 제거한다는 점에 유의하세요. 따라서 제공한 예제에서는(추가 공간으로 인해) 작동하지만 열 수가 더 이상 변경되면 작동하지 않습니다. 여기에서 1~51열을 삭제하세요.

$ w | head -1 | colrm 1 51

답변2

일반적으로 나는 단지${parameter#word} Bash 매개변수 확장. 처음부터 확장 $parameter, 삭제 word(패턴일 수 있음)합니다 .

귀하의 경우에는 다음과 같습니다.

line=...
echo ${line#*load average: }

함수로 만드세요:

get_load() {
    w | head -n 1 | { read -r line; echo ${line#*load average: }; }
}

답변3

마지막 숫자만 원할 경우 grep을 사용할 수 있습니다.

$ w | grep -Po 'load average: \K.*'
0.07, 0.13, 0.09

답변4

다른 perl:

$ w | head -1 | perl -nle 'print +(split /load average:/)[-1]'
 0.42, 0.49, 0.63

관련 정보