기간에 대해서만 "가동 시간"을 구문 분석합니다.

기간에 대해서만 "가동 시간"을 구문 분석합니다.

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

관련 정보