awk
에서 정규식을 필드 구분자로 사용하려고합니다. 내 독서에서 이것은 가능해 보이지만 올바른 구문을 얻을 수 없습니다.
rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string
생각하십니까? 명확하지 않은 경우 목표는 버전 번호없이 소프트웨어 목록을 가져 오는 것입니다.
답변
따옴표와 구문을 잘못 입력했습니다. 입력 필드 구분자를 설정하는 가장 쉬운 방법은 명령 줄의 -F
옵션을 사용하는 것입니다.
awk -F "[0-9]" "{ print $1 }"
또는
awk -F "[[:digit:]]" "{ print $1 }"
입력 필드 구분 기호로 임의의 숫자를 사용한 다음 각 줄의 첫 번째 필드를 출력합니다.
[0-9]
및 [[:digit:]]
표현식은 로케일에 따라 아주 동일하지 않습니다. “ [0-9], [[: digit :]] 및 \ d 의 차이점”을 참조하십시오.
설정할 수도 있습니다. awk
프로그램 자체의 div id = “ddb3b78de7″>
. 이는 일반적으로 1 회 초기화이므로 BEGIN
블록에서 수행됩니다.
awk "BEGIN { FS = "[0-9]" } { print $1 }"
셸에서 작은 따옴표로 묶인 문자열에는 따옴표를 사용할 수 없으며 awk
문자열은 항상 큰 따옴표를 사용합니다.
설명
- FS에 액세스하여 일치하는 문자열을 볼 수 있습니까?
답변
Kusalananda의 답변은 +1입니다. 또는 FS 변수는 BEGIN 블록에서 설정할 수 있습니다.
awk "BEGIN {FS="[0-9]"} {print $1}"
액션 블록에서 FS를 변경하면 “다음 줄을 읽을 때까지 적용되지 않습니다.
$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi
질문의 다른 오류 :
- 작은 따옴표로 묶인 문자열 안에 작은 따옴표를 사용할 수 없습니다.
-
==
는 비교 연산자입니다.=
는 변수 할당 용입니다.
댓글
- " 창이 작업 블록의 ng FS는 ' 다음 줄을 읽을 때까지 적용되지 않습니다. " I ' 해당 정보를 모두 찾았습니다.
- plus : awk에서 문자열 값에 작은 따옴표를 사용할 수 없습니다. ' 쉘 올바르게
- FS에 액세스하고 일치하는 문자열을 볼 수 있습니까?
-
FS
는 변수이므로 다음과 같은 작업을 수행합니다. 기타 모든 변수 (예 :print FS
). POSIX awk로 FS와 일치하는 부품을 얻으려면 불가능하다고 생각합니다. GNU awk를 사용하면n = split($0, fields, FS, separators)
를 작성할 수 있습니다. 여기서fields
및separators
는 배열입니다.