아래 명령이 작동하기를 원하지만 그럴 수 없습니다. 확인해주십시오:
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:" 다음에 공백이 없는 첫 번째 단어를 찾고 전체 문자열을 해당 단어로 바꿉니다.