目前,我通过一堆记忆不佳的AWK、sed、Bash和少量Perl来处理文本文件.
我看到有几个地方提到,Python对这类事情很有好处.如何使用Python取代shell脚本、awk、sed和Friends?
目前,我通过一堆记忆不佳的AWK、sed、Bash和少量Perl来处理文本文件.
我看到有几个地方提到,Python对这类事情很有好处.如何使用Python取代shell脚本、awk、sed和Friends?
任何shell都有多组功能.
基本的Linux/Unix命令.所有这些都可以通过subprocess图书馆获得.这并不总是执行all个外部命令的最佳首选.另请看shutil中的一些命令,它们是独立的Linux命令,但您可能可以直接在Python脚本中实现.os库中还有大量Linux命令;您可以在Python中更简单地执行这些操作.
还有—— prize !——更快.shell中每个单独的Linux命令(除了少数例外)都会派生一个子进程.通过使用Pythonshutil
和os
模块,您不需要派生子流程.
shell 环境具有特征.这包括设置命令环境的内容(当前目录和环境变量等等).您可以直接从Python轻松地进行管理.
shell编程功能.这是所有进程状态码判断、各种逻辑命令(IF、WHILE、FOR等)测试指挥部及其所有相关人员.函数定义之类的东西.在Python中,这一切都要容易得多.这是摆脱bash并用Python实现的巨大胜利之一.
互动功能.这包括命令历史记录等等.编写shell脚本时不需要这个.这只是为了与人交流,而不是为了写 playbook .
shell文件管理功能.这包括重定向和管道.这更棘手.这大部分可以通过子流程完成.但是,在Python中,有些在shell中很容易实现的事情是令人不快的.特别是像(a | b; c ) | something >result
.这将并行运行两个进程(a
的输出作为b
的输入),然后是第三个进程.该序列的输出与something
并行运行,并将输出收集到名为result
的文件中.这很难用其他语言表达.
特定程序(awk、sed、grep等)通常可以重写为Python模块.别太过火了.替换您需要的内容,并发展您的"grep"模块.不要一开始就编写取代"grep"的Python模块.
最好的办法是你可以分步完成.
os.walk
的Python循环替换FIND.这是一个巨大的胜利,因为您不会产生那么多进程.