我目前通过一堆不好记的AWK、sed、Bash和一小部分Perl来做我的文本文件操作。
我已经看到提到的一些地方,python很适合做这种事情。我如何使用Python来代替shell脚本,AWK, sed和朋友?
我目前通过一堆不好记的AWK、sed、Bash和一小部分Perl来做我的文本文件操作。
我已经看到提到的一些地方,python很适合做这种事情。我如何使用Python来代替shell脚本,AWK, sed和朋友?
当前回答
我喜欢Python的一个原因是它比POSIX工具更加标准化。我必须反复检查每个比特是否与其他操作系统兼容。在Linux系统上编写的程序在OSX的BSD系统上可能无法正常工作。对于Python,我只需要检查目标系统是否有足够现代的Python版本。
更棒的是,用标准Python编写的程序甚至可以在Windows上运行!
其他回答
我喜欢Python的一个原因是它比POSIX工具更加标准化。我必须反复检查每个比特是否与其他操作系统兼容。在Linux系统上编写的程序在OSX的BSD系统上可能无法正常工作。对于Python,我只需要检查目标系统是否有足够现代的Python版本。
更棒的是,用标准Python编写的程序甚至可以在Windows上运行!
添加到前面的答案:检查pexpect模块处理交互式命令(adduser, passwd等)
在ShellPy库中可以使用python而不是bash。
下面是一个从Github下载Python用户头像的例子:
import json
import os
import tempfile
# get the api answer with curl
answer = `curl https://api.github.com/users/python
# syntactic sugar for checking returncode of executed process for zero
if answer:
answer_json = json.loads(answer.stdout)
avatar_url = answer_json['avatar_url']
destination = os.path.join(tempfile.gettempdir(), 'python.png')
# execute curl once again, this time to get the image
result = `curl {avatar_url} > {destination}
if result:
# if there were no problems show the file
p`ls -l {destination}
else:
print('Failed to download avatar')
print('Avatar downloaded')
else:
print('Failed to access github api')
如您所见,所有在grave重音(')符号内的表达式都在shell中执行。在Python代码中,您可以捕获此执行的结果并对其执行操作。例如:
log = `git log --pretty=oneline --grep='Create'
这一行首先在shell中执行git log——pretty=oneline——grep='Create',然后将结果赋值给log变量。结果具有以下属性:
从已执行进程的Stdout中Stdout整个文本
Stderr从已执行进程的Stderr得到的整个文本
Returncode执行的返回码
这是该库的总体概述,更详细的描述和示例可以在这里找到。
我在PyPI: ez上发布了一个包。 使用pip install ez进行安装。
它在shell中打包了通用命令,我的库使用了与shell基本相同的语法。例如,cp(源,目标)可以同时处理文件和文件夹!(书纸的包装。shutil副本。Copytree,它决定什么时候使用哪个)。更妙的是,它可以支持像R!
另一个例子:没有os。Walk,使用fls(path, regex)递归地查找文件并使用正则表达式进行过滤,它将返回带有或没有全路径的文件列表
最后一个例子:你可以结合它们来编写非常简单的脚本: Files = fls('.','py$');文件,myDir (cp)
一定要去看看!我花了几百个小时来编写/改进它!
我已经构建了半长的shell脚本(300-500行)和Python代码,它们具有类似的功能。当执行许多外部命令时,我发现shell更容易使用。当有大量文本操作时,Perl也是一个很好的选择。