我想在python中执行以下shell命令:grep 'string' file | tail -1 | cut -c 1-3
我尝试过:
import subprocess
i = 1
while i < 1070:
file = "sorted." + str(i) + ".txt"
string = "2x"
subprocess.call(grep 'string' file | tail -1 | cut -c 1-3)
i = i + 1
任何帮助将不胜感激。谢谢。
您的命令应以字符串形式提供。另外,如果要获取命令的输出,可以使用以下命令:
subprocess.run("grep 'string' file | tail -1 | cut -c 1-3", shell=True, capture_output=True, check=True)
其中capture_output
(在Python3.7 +中有效)返回带有returncode
,stdout
和stderr
的对象,如果您的命令失败,check
标志将引发异常。
子进程期望参数为字符串或数组:
subprocess.call("grep '{}' {} | tail -1 | cut -c 1-3".format(string, file), shell=True)
shell=True
是必要的,因为您正在使用特定于外壳的命令,例如管道。
但是,在这种情况下,用纯python实现整个程序可能要容易得多。
请注意,如果字符串或文件中包含空格或引号的任何特殊字符,该命令将不起作用,并且实际上可能会对系统造成各种不必要的影响。如果您需要它来处理这些简单的值以外的其他问题,请考虑使用纯Python解决方案,设置shell=False
并将数组语法与手动管道一起使用,或以某种形式进行转义。
首先,传递给subprocess.call
的任何内容都应该是字符串。在代码中未定义名称grep
,file
,tail
和cut
,您需要将整个表达式转换为字符串。由于grep命令的搜索字符串应该是动态的,因此您需要先构造最终字符串,然后再将其作为参数传递给函数。
import subprocess
i = 1
while i < 1070:
file = "sorted." + str(i) + ".txt"
string = "2x"
command_string = 'grep {0} {1} | tail -1 | cut -c 1-3'.format(string, file)
subprocess.call(command_string)
i = i + 1
您可能想向subprocess.call
:shell=True
传递附加参数。该参数将确保命令通过外壳执行。
您的命令正在使用cut
。您可能想要检索子流程的输出,因此更好的选择是创建一个新的流程对象,并使用subprocess.communicate
进行输出捕获:
import subprocess
i = 1
while i < 1070:
file = "sorted." + str(i) + ".txt"
string = "2x"
command_string = 'grep {0} {1} | tail -1 | cut -c 1-3'.format(string, file)
p = subprocess.Popen(command_string, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdoutdata, stderrdata = p.communicate()
# stdoutdata now contains the output of the shell commands and you can use it
# in your program
i = i + 1
编辑:这是有关如何根据注释中的要求将数据存储到文本文件中的信息。
import subprocess
outputs = []
i = 1
while i < 1070:
file = "sorted." + str(i) + ".txt"
string = "2x"
command_string = 'grep {0} {1} | tail -1 | cut -c 1-3'.format(string, file)
p = subprocess.Popen(command_string, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
stdoutdata, stderrdata = p.communicate()
# stdoutdata now contains the output of the shell commands and you can use it
# in your program, like writing the output to a file.
outputs.append(stdoutdata)
i = i + 1
with open('output.txt', 'w') as f:
f.write('\n'.join(outputs))