이 awk 명령을 작동시키는 방법

이 awk 명령을 작동시키는 방법

아래 명령이 작동하기를 원하지만 그럴 수 없습니다. 확인해주십시오:

echo "random string random string mark: abcde random string random string" |
    awk '{gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"); print}'

이 명령이 "abcde"만 반환하길 원합니다. 그러나 항상 전체 입력 문자열을 반환합니다. 왜?

답변1

gensub 명령은 문자열을 변경하지 않습니다. 결과는 함수의 출력입니다.

시도해 보십시오:

echo "random string random string mark: abcde random string random string" |
awk '{print(gensub(/^.*mark: (.{5,5}).*$/,"\\1","g"))}'

편집하다:

사용자는 (사용자가 요청한 대로) 최상위 출력을 구문 분석해야 하는 것으로 나타났습니다.

top -b -n 1 -d 1 |
awk 'NR==1{print(gensub(/.*load average: ([0-9\.\, ]+).*$/,"\\1","gs"))}'

참고: 쉼표를 소수 구분 기호로 사용하는 로케일에는 점과 쉼표를 모두 허용합니다.

mpstat를 살펴보세요.여기에 소개된 대로, 이는 귀하의 요구에 더 적합할 수 있습니다.

답변2

질문을 바꿔 말하면 문자열 "mark:" 뒤에 첫 번째 단어를 인쇄하려고 합니다.

도중에 awk에서 :

echo "random string random string mark: abcde random string random string" | \
awk -v RS="mark: " 'NR==2{print $1}'

위의 코드는 문자열을 "mark:"로 구분된 두 개의 레코드로 분할한 다음 두 번째 레코드의 첫 번째 단어(예: "abcde")를 인쇄합니다.

sed에서:

echo "random string random string mark: abcde random string random string" | \
sed 's/.*mark: \([^ ]*\).*/\1/'

위의 예에서는 정규식을 사용하여 "mark:" 다음에 공백이 없는 첫 번째 단어를 찾고 전체 문자열을 해당 단어로 바꿉니다.

관련 정보