
Mac에서 "uptime" 명령을 실행하면 다음과 같은 결과가 나타납니다.
19:52 up 14 mins, 2 users, load averages: 2.95 4.19 4.31
이는 시스템 가동 시간에 따라 몇 시간, 며칠이 추가되는지에 따라 약간 변경됩니다. 따라서 첫 번째 단어와 공백, 그리고 "users" 앞의 4자를 제거하고 싶습니다.
만들기19:52 up 14 mins, 2 users, load averages: 2.95 4.19 4.31
이것:
up 14 min
또는
8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40
이것:
up 52 days, 20:47
또는:
22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27
이것:
up 54 days, 1 min
지금까지 내가 얻을 수 있는 가장 먼 방법은 이것을 사용하는 것입니다. uptime | cut -d " " -f2- | sed 's/users.*//'
하지만 여전히 "up" 앞에 공백이 생기고 문자열 끝에서 4자를 제거해야 합니다. 누군가 나를 교육해 줄 수 있나요?
답변1
나는 이것을 사용합니다(필요한 경우 단위를 포함하도록 조정).
#!/usr/bin/awk -f
BEGIN {
while ("uptime" | getline)
gsub(/,/,"")
if (NF==10)
print $3
else if (NF==11)
print $3,$4
else if (NF==12)
print $3,$4,$5
else
print $3,$4,$5,$6
close("uptime")
}
답변2
노력하다:
sed -E 's/.*(up.*), [[:digit:]]+ user.*/\1/'
예
다음은 질문의 예입니다.
$ cat upfile
19:52 up 14 mins, 2 users, load averages: 2.95 4.19 4.31
8:03 up 52 days, 20:47, 3 users, load averages: 1.36 1.42 1.40
22:19 up 54 days, 1 min, 4 users, load averages: 2.08 2.06 2.27
sed 명령은 다음을 생성합니다.
$ sed -E 's/.*(up.*), [[:digit:]]+ user.*/\1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min
작동 원리
하나의 대체 명령을 사용합니다.
s/.*(up.*), [[:digit:]]+ user.*/\1/
.*
줄의 시작 부분부터 첫 번째 일치 항목입니다.(up.*)
up이라는 단어와 그 뒤에 오는 텍스트를 일치시켜 그룹 1에 저장합니다., [[:digit:]]+ users
쉼표, 공백, 하나 이상의 숫자, 공백, 문자열 순으로 일치합니다users
.두 번째는
.*
이후의 모든 항목과 일치합니다user
.
우리는 그것을 모두 로 표시된 그룹 1로 대체합니다 \1
.
호환성
위의 내용은 BSD/OSX와 최신 Linux 모두에서 작동합니다. 아주 오래된 Linux에서는 -E
다음으로 교체해야 할 수도 있습니다 -r
.
sed -r 's/.*(up.*), [[:digit:]]+ user.*/\1/'
펄 버전
$ perl -pe 's/.*(up.*), [[:digit:]]+ user.*/$1/' <upfile
up 14 mins
up 52 days, 20:47
up 54 days, 1 min