2013-05-07 204 views
1

好日子全部 我在使用此命令時遇到問題按下按鈕 我需要搜索文件並以逗號分隔文本輸出結果。 PHP似乎不喜歡大括號,所以據我所知我需要使用exec(),但無濟於事,因爲我收到的錯誤是「語法錯誤,意外的T_LNUMBER,期待T_VARIABLE或'$'」 如果答案是顯而易見的,那麼對於PHP來說還是很新鮮的事情! 任何信息會有所幫助,謝謝在php中使用Linux awk命令

<html> 
<body> 
<h1>Linux Command Test</h1> 

<form method="POST" action=""> 
<input type="submit" id="submit" name="submit" value="Submit"/> 
</form> 

<?php 
if (isset($_POST['submit'])) 
    { 
    $output = exec('grep -i hello test.txt | awk -v OFS=, '{\$1=\$1;print}' > newtest.txt'); 
    echo "<pre>$output</pre>"; 
    } 
?> 


</body> 
</html> 
+0

顯示您的PHP代碼。 – Barmar 2013-05-07 12:31:20

+0

難道你不能直接在PHP中寫入等價的代碼,而不是awk? – Barmar 2013-05-07 12:33:08

+0

我希望能夠做到這一點,但由於我的谷歌技能並不像我希望的那樣好,所以我重新回到了我的Linux體驗。 – kirchner20 2013-05-07 12:36:13

回答

3
$output = exec('grep -i hello test.txt | awk -v OFS=, '{\$1=\$1;print}' > newtest.txt'); 

應該是:

$output = exec('awk -v OFS=, \'/hello/i {$1=$1;print}\' test.txt > newtest.txt'); 

你需要躲避的報價,否則他們劃定的PHP字符串。您不需要在PHP中的單引號字符串內轉義$。如果要將其捕獲到PHP變量中,則不應將awk輸出重定向到文件。

而且也沒有必要管grepawk,因爲awk有內置的模式匹配。

+0

謝謝,這有幫助,但現在整個文件是逗號分隔的,我使用grep的原因是過濾掉所有含有單詞hello的行。謝謝 – kirchner20 2013-05-07 13:15:29

+0

您的'grep'命令只處理其中包含hello的行。如果你想過濾它們應該是'grep -v'。 「OFS =」的全部要點是用逗號分隔。 – Barmar 2013-05-07 13:28:21

+0

我放回了輸出重定向。 exec()只返回輸出的最後一行,如果你想捕獲一個PHP變量中的所有內容,你必須傳遞可選的第二個參數,該參數是一個包含數組的變量,該數組將填入輸出。 – Barmar 2013-05-07 13:30:17

0

有功能幫您可以在PHP中使用調用外部應用程序,exec()system()等:http://www.php.net/manual/en/ref.exec.php但記住,它是由管理員,讓你使用它們。在大多數共享hostings這些功能將被禁用

+0

這似乎並不是他的問題。他似乎有字符串插值問題。 – Barmar 2013-05-07 12:31:49

3

嘗試逃避$

grep -i hello test.txt | awk -v OFS=, '{\$1=\$1;print}' > newtest.txt 
+0

我試過轉義,但後來出現其他錯誤,我嘗試了excludeshellargs()和excludeshellcmd(),但仍有相同的錯誤。轉義出錯後是語法錯誤,「意外」{'「。感謝您的輸入! – kirchner20 2013-05-07 12:38:12

+0

你可以顯示你正在運行的完整的PHP代碼嗎? – timstermatic 2013-05-07 12:41:36

+0

@wiseguyonly - 已發佈代碼,謝謝 – kirchner20 2013-05-07 12:58:04