2013-09-27 31 views
1

下面的代碼是簡單的版本,但也說明了問題。awk在bash中不起作用

版本工作:

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

版本確實工作:

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

不同的是我如何放置條件與如果,在同一行(工程)或不同的行(不工作)。 生產版本有四個長條件,所以我必須將它們放在不同的行上,以使代碼更具可讀性。任何人都進入了這個?

+0

如果您不使用流程替換,這種行爲會有所不同嗎? – kojiro

+0

您是否考慮嘗試一個awk腳本,而不使用來自df的管道和進程替換以及UUOC的here文件?所有這些都是混淆這個問題 - 只是一個簡單的awk腳本和一個BEGIN部分會捕獲並突出顯示你的問題。 –

+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; s @ can/should @ really should to @ –

+1

好,趕上! (+1) – lurker

+0

正如我所說的,這段代碼被簡化了,生產中的代碼比這更復雜。 – schemacs