2013-09-27 3 views
1

아래의 코드는 간단한 버전이지만 문제를 보여줍니다.bash에서 awk이 작동하지 않습니다.

버전 은하지 않습니다 일 :

df | awk -f <(cat - <<-'EOD' 
{ 
    if(                                              
     $1 == "tmpfs") { 
      print $0; 
     } 
} 
EOD 
) 

버전 않습니다 일 :

df | awk -f <(cat - <<-'EOD' 
{ 
    if($1 == "tmpfs") {                                          
      print $0; 
     } 
} 
EOD 
) 

차이가 나는 조건을 배치하는 방법이다와, 경우 같은 라인 (작품) 또는 다른 라인 (작동 안함). 프로덕션 버전에는 4 가지 긴 조건이 있으므로 코드를 더 읽기 쉽게 만들기 위해 코드를 다른 줄에 배치해야합니다. 어떤 사람이 들어 왔습니까?

+0

프로세스 대체를 사용하지 않으면이 동작이 다르게 작동합니까? – kojiro

+0

df에서 파이프없이 awk 스크립트를 사용해 보시고 UUOC에서 프로세스 대체와 여기에있는 문서를 사용해 보셨습니까? 이 모든 것이이 문제를 난처하게합니다. BEGIN 섹션을 포함하는 간단한 awk 스크립트가 문제를 파악하고 강조했을 것입니다. –

+0

if-conditon이 여러 줄에 걸쳐있을 때 첫 번째 버전은 여전히 ​​작동하지 않습니다. – schemacs

답변

4

는 그냥 긴 if 문 라인의 끝 부분에 대한 이스케이프를 사용

df | awk -f <(cat - <<-'EOD' 
{ 
    if (\ 
     $1 == "tmpfs") { 
      print $0; 
     } 
} 
EOD 
) 

awk 구문은 분명히 if 문/표현은 한 줄에있을 것으로 예상하고있다. Unix/Linux에서는 백 슬래시()를 줄 연속 문자로 사용할 수있는 것이 일반적입니다. 따라서 위의 내용은 위의 if (\과 다음 줄을 모두 같은 줄에있는 것처럼 구문 적으로 처리합니다.

+1

현장 뒤에 무엇이 있는지 설명해 주시겠습니까? 이 방법이 효과가 있지만 다른 라인에서 작동하지 않는 이유는 무엇입니까? – schemacs

+1

'awk'는 분명히'if' 문이 단일 "줄"에있을 것으로 기대합니다. 이스케이프는 Linux (Unix)에서 "줄 연속"문자로 자주 사용됩니다. – lurker

+1

'에 대한 모든 참조 또는 문서는 if 문이 단일 "줄"에 있다고 분명히 예상합니까? – schemacs

3

@mbratch 귀하의 질문에 대답하지만, 옆으로, 당신의 게시 스크립트로 :

df | awk -f <(cat - <<-'EOD' 
{ 
    if(\ 
     $1 == "tmpfs") { 
      print $0; 
     } 
    } 
EOD 
) 

는/그냥이로 작성해야 할 수 있습니다

df | awk '$1 == "tmpfs"' 

당신은 당신을 말해 우리가 어떤 경우 우리가 아마 더 많은 것을 도울 수 있습니다.

+0

+1; @ @ ~ 할 수 있어야한다 @ –

+1

좋은 캐치! (+1) – lurker

+0

내가 말했듯이,이 코드는 단순화되어 있으며 프로덕션의 코드는 이보다 훨씬 복잡합니다. – schemacs

관련 문제