![이 awk 명령을 작동시키는 방법](https://rvso.com/image/76427/%EC%9D%B4%20awk%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%9E%91%EB%8F%99%EC%8B%9C%ED%82%A4%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
아래 명령을 작동시키고 싶지만 할 수 없습니다. 다음 사항을 확인하세요.
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: " 다음에 공백이 없는 첫 번째 단어를 찾고 전체 문자열을 해당 단어로 바꿉니다.