2017-08-10 44 views
2

我目前正在寫一個劇本awk看起來像這樣:家當多個參數

#!/usr/bin/awk -f 
BEGIN { 
    print "Starting extracting data" 
} 
{ 
    print $0 
} 
END { 
    print "End of file" 
} 

我的腳本能正常工作一樣,在我的電腦上,但它是不可移植的...我想這樣做

#!/usr/bin/env awk -f 
... 

但是Debian shell不接受單個shebang中的幾個參數。我得到"awk -f" no such file or directory。有沒有可以使用的解決方法,或者完全不可能?

+0

您能顯示完整的命令如何調用'awk'嗎? – Inian

+0

'awk'的'f'選項需要一個程序文件,在您的示例中這似乎完全沒有必要。 – fd0

+0

@Inian我做'./awk-script mylog.log' – Xatyrian

回答

0

有沒有簡單的方法乾淨地做到這一點;如glenn jackman's comment中所述,shebangs通過execve()實施,其僅接受口譯員和單個可選參數。

您需要一種解決方法。

該問題的評論意味着你不想包裝腳本,但如果它包含在最終的〜awk腳本中呢?

#!/bin/sh 
awk -f - "[email protected]" << 'EOF' 
#!/usr/bin/awk -f 

BEGIN { 
    print "Starting extracting data" 
} 
{ 
    print $0 
} 
END { 
    print "End of file" 
} 

這使用在其認領便攜式POSIX殼,然後立即用AWK代碼AWK調用從標準輸入(-f -)一個heredoc,傳遞進一步參數和選項("[email protected]")至awk的爲文件。引用了heredoc(<< 'EOF'),因此諸如$0之類的東西不能被POSIX shell解釋。由於僅包含EOF的行不存在,因此heredoc以文件結尾。

(第二家當不被任何讀取。這純粹是化妝品中誰閱讀代碼的人。如果你的名字與.awk後綴文件,像vim編輯器會默認他們的語法高亮AWK儘管第一的內容shebang。)

該代碼不適用於管道內容到文件中,因爲腳本本身是通過管道傳輸到awk中的。如果你想支持的管道,它需要一點醜陋,使用bash的輸入process substitution<(…)):

#!/bin/bash 
exec awk -f <(awk 'NR > 2' "$0") "[email protected]" 
#!/usr/bin/awk -f 

BEGIN { 
    print "Starting extracting data" 
} 
{ 
    print $0 
} 
END { 
    print "End of file" 
} 

這是告訴bash就從第二awk命令創建一個命名管道,它讀取執行AWK完整的腳本(bash將其作爲正在運行的文件的名稱解釋爲$0)並打印第3行和更高的行。再次,第二個shebang是純粹的化妝品,因此只是一個評論。

0

真的沒有理由在shebang中調用awk。只需通過sh調用它:

#!/bin/sh 
exec awk ' 
BEGIN { 
    print "Starting extracting data" 
} 
{ 
    print $0 
} 
END { 
    print "End of file" 
} 
' "[email protected]" 
+0

由於實際上只有一個命令行,這可能(我不確定)會遇到大小限制。這就是爲什麼我的答案使用heredoc或流程替代。 awk腳本非常小,很小,無所謂,在這種情況下,這可能是最簡單的解決方案。 –