2011-09-28 4 views
0

나는이처럼 보이는 텍스트 파일에서 값을 끌어 할 필요가있는 쉘 스크립트를 쓰고 있어요 :awk는 - 종결되지 않은 정규식

app.full.name /warfilelocation/ warfilename 

내 쉘 스크립트 응용 프로그램 이름의 목록을 반복하고 철수한다 AWK를 사용하는 위치 또는 이름. 다음을 사용하여 명령 줄에서 테스트를 수행했습니다. awk "\ $ 1 ~/app.full.name/{print $ 2}"applications.txt

쉘 스크립트 나는 문제가 있기 시작한다.

function get_location() { 
     local application=$1 
     awk "\$1 ~/^$application/ { print \$2 }" applications.txt 
} 

을하지만 난 다음 오류 얻을이 함수를 호출 할 때 :

awk: $1 ~/^app.full.name 
awk: ^unterminated regexp 
awk: cmd. line:1: app.full.name 
awk: cmd. line:1:  ^syntax error 
awk: cmd. line:2: app.full.name/ { print $2 } 
awk: cmd. line:2: ^syntax error 

사람이 어떤 아이디어가 있습니까를 내가 잘못 여기서 뭐하는거야

나는이처럼 보이는 기능이 . 나는 올바른 변수를 벗어나지는 못한다고 생각하지만, 아무리 노력해도 작동하지 않는 것 같습니다. 사전에

덕분에

+0

함수를 어떻게 부르시겠습니까? 신청의 가치는 무엇입니까? –

답변

6

사용이 방법은 AWK 수 있도록 쉘 변수 인식 : 업데이트를

awk -v "v1=$VAR1" -v "v2=$VAR2" '{print v1, v2}' input_file 

아무것도 쉘 변수로 갈 수

$ cat input 
tinky-winky 
dipsy 
laa-laa 
noo-noo 
po 

$ teletubby='po' 

$ awk -v "regexp=$teletubby" '$0 ~ regexp' input 
po 

하는 것으로, 도-만발한 정규식입니다 (예 : ^d.*y). 셸이 확장을 수행하지 못하게하려면 작은 따옴표 을 사용해야합니다.

+0

그는 변수 값을 Regex에 채우기를 원합니다. – Kent

+0

@Kent - 단지'-v'가 awk 스크립트에서 쉘 변수를 사용할 수 있다고 말합니다. 그 변수는'match()'함수에서 정규 표현식으로 사용할 수 있습니다. 하지만 그 부분은 내가 빠져 ... –

+0

나는 그 점이 일치한다고 생각한다.변수 (by -v)는 ($ x ~/here /)와 같은 awk 매칭 확인에서 사용될 수 없으므로. 적어도 나는이 경우 어떻게 사용하는지 모른다. :) – Kent

0

오류 메시지는 "라인 2"오류 메시지를 제공 $ 응용 프로그램의 끝에서 길 잃은 줄 바꿈이 있음을 시사한다.

+0

이것은 똑같은 일을하지 않는다. $ 1 ~/^ app/ –

+0

오, 감사합니다. 이것이 실제 awk 구문이라는 것을 깨닫지 못했습니다. 편집 됨. – thiton

0

이 참조 : 그것은 $ 응용 프로그램의 정확한 값을 모른 채 얘기하기 어렵다

kent$ app=app.ful 
kent$ echo "app.full.name /warfilelocation/ warfilename"|awk -v a=$app '{if(match($1,a))print $2}' 
/warfilelocation/ 
0

AWK 일치를 사용하여() 함수를,하지만 당신은 $ 응용 프로그램에서 이상한 문자를 가지고있는 것처럼 그것은 같은 것 같다 " 또는 그런/또는 뭔가.

$ export application=foo/bar 
$ awk "\$1 ~/^$application/ { print \$1 }" 
gawk: cmd. line:1: $1 ~/^foo/bar/ { print $1 } 
gawk: cmd. line:1:    ^parse error 

난 당신이 $ 응용 프로그램에서이 정확한 값을보고하고,이 /가 포함되어있는 경우, 이스케이프.이 woul 할

한 가지 방법을 것입니다 사용할 수 있습니다 :

$ export application=`echo foo/bar | sed -e 's;/;\\\\/;g'` 
$ awk "\$1 ~/^$application/ { print \$1 }"