2013-07-26 3 views

답변

5

정확함 awk/ /의 변수를 인식하지 않습니다. 당신은 할 수 있습니다 : awk's 기본 동작은

Name="jony" 
awk -v name="$Name" '$0 ~ name' file 

print 때문에 우리는 여기를 사용하여 피할 수 있습니다.

+0

그냥 ~ 여기서 무엇을하고 있는지 설명 할 수를 선호? 나는 이것을 시도했지만 작동하지 않습니다. > 'echo "안녕하세요 jony입니다."| awk '$ 0 ~ jony' 출력 : 안녕하세요 jony' > 안녕하세요 jony입니다. awk '$ 0 ~ holmes' > 출력 : 안녕하세요 jony' '홈즈'가 없어도 줄을 인쇄하는 이유를 모르겠습니다. – Jagan

+1

가이드에서 : ~ (물결 모양), ~ 연산자 정규 표현식을 사용하여 표현식을 일치시킬 수도 있습니다. 이 표현식을 사용하면 일치시킬 문자열을 지정할 수 있습니다. 현재의 전체 입력 레코드 일 필요는 없습니다. 두 연산자'~ '와'! ~'는 정규 표현식 비교를 수행합니다. 이 연산자를 사용하는 표현식은 패턴이나 if, while, for 및 do 문에서 사용할 수 있습니다. ' –

+0

@Jagan'echo '할 때 안녕하세요 jony "| awk '$ 0 ~ holmes''' awk'는'homes'을 정의되지 않은 변수로보고 라인을 출력합니다.'awk'가 그것을 리터럴 문자열로 생각하게하려면 그것을 인용해야합니다. –

1

희망 내가 정확하게 문제를 이해 : 왜 한 다음 시도 실 거예요 :

awk '/'"$Name"'/ { print } ' testfile 
+1

아니요, 절대로하지 마십시오. 매우 버그가 있고 오류가 발생하기 쉽습니다. 변수를 설정하려면'-v'를 사용하거나 합리적인 대안을 찾으려면 comp.unix.shell FAQ http://cfajohnson.com/shell/cus-faq-2.html#Q24를보십시오. –

0

AWK 한 줄을 작성, 당신은 큰 따옴표 또는 작은 따옴표로 스크립트를 인용 할 수있다. [! 나쁜]

Name="jony" 
awk "/$Name/" file 
# this works. after shell has performed substitutions, the line looks like 
awk "/jony/" file 

심지어 따옴표없이 이름이 포함되지 않은 경우 공간 : 후자의 경우, 쉘은 -v 옵션을 통해 스크립트에 변수를 전달하지 않아도 직접 있도록 모든 치환을 수행 :

awk /$Name/ file 

모든 단순함은 곧 당신이 쉘 변수 확장을 방지하기 위해 달러 기호를 탈출해야하기 때문에 등 $ 0 $ 1, 사용 AWK 특수 변수를 포함하여 스크립트에서 $를 사용하여 원하는대로 사라진다 .

awk "/$Name/ {print \$0}" 

또한 스크립트에 리터럴 텍스트를 추가하려면 큰 따옴표를 이스케이프 처리해야합니다. 서투른 보이는 :

awk "/$Name/ {print \"Found in: \" \$0}" 

쉘 오류가 발생합니다 따옴표로 정규 표현식을 부정, 모두 왕관 :

awk "!/$Name/" 
#error> ... event not found ... 

오류가 $ 이름 자체가 포함되어있는 경우 일어날 것입니다! 기호. 이것은 큰 따옴표를 사용하는 것을 신뢰할 수 없게 만듭니다.

그래서, 보안을 위해 작은 따옴표 :

관련 문제