2013-05-07 210 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