awk에서 정규식을 필드 구분 기호로 사용하는 방법은 무엇입니까?


16

에서 정규식을 필드 구분자로 사용하려고합니다 awk. 내 독서에서 이것은 가능해 보이지만 구문을 올바르게 얻을 수는 없습니다.

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

생각? 분명하지 않은 목표는 버전 번호가없는 소프트웨어 목록을 얻는 것입니다.

답변:


25

따옴표와 구문을 정리했습니다. 입력 필드 구분 기호를 설정하려면 가장 쉬운 방법 -F은 명령 행 의 옵션을 사용하는 것입니다.

awk -F '[0-9]' '{ print $1 }'

또는

awk -F '[[:digit:]]' '{ print $1 }'

이것은 숫자를 입력 필드 구분자로 사용하고 각 줄에서 첫 번째 필드를 출력합니다.

[0-9][[:digit:]]표현은하지 않은 매우 귀하의 지역에 따라, 같은. " [0-9], [[: digit :]] 및 \ d의 차이점 "을 참조하십시오 .

프로그램 자체 FS에서 설정할 수도 있습니다 awk. 이것은 BEGIN일회성 초기화 이므로 일반적으로 블록 단위로 수행됩니다 .

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

쉘에서 작은 따옴표로 묶은 문자열에는 작은 따옴표를 사용할 수 없으며 awk문자열에는 항상 큰 따옴표가 사용됩니다.


12

Kusalananda의 답변 +1 또는 BEGIN 블록에서 FS 변수를 설정할 수 있습니다.

awk 'BEGIN {FS="[0-9]"} {print $1}'

액션 블록에서 FS를 변경하면 다음 줄을 읽을 때까지 적용되지 않습니다.

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

질문의 다른 오류 :

  • 작은 따옴표로 묶은 문자열 안에 작은 따옴표를 사용할 수 없습니다
  • ==비교 연산자이며 =변수 할당

1
"다음 행을 읽을 때까지 동작 블록에서 FS를 변경하면 적용되지 않습니다."나는 그 정보를 찾기 위해 모든 것을 살펴 보았습니다.
Samizdis

1
플러스 : 당신이 올바르게 쉘에서 전달할 경우에도, AWK의 문자열 값에 대한 작은 따옴표를 사용할 수 없습니다
dave_thompson_085
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.