我目前通过一堆记忆错误的AWK,sed,Bash和一小部分Perl进行文本文件操作.
我已经看到过一些地方,python很适合这种事情.我如何使用Python来替换shell脚本,AWK,sed和朋友?
任何shell都有几组功能.
Essential Linux/Unix命令.所有这些都可以通过子进程库获得.这并不总是执行所有外部命令的最佳选择.另请参阅shutil,了解一些单独的Linux命令命令,但您可以直接在Python脚本中实现.另一大批Linux命令在os库中; 你可以在Python中更简单地完成这些.
而且 - 奖金! - 更快速.shell中的每个单独的Linux命令(除了少数例外)都会分叉子进程.通过使用Python shutil
和os
模块,您不需要分叉子进程.
shell环境功能.这包括设置命令环境的东西(当前目录和环境变量以及什么不是).您可以直接从Python轻松管理它.
shell编程功能.这是所有进程状态代码检查,各种逻辑命令(if,while,for等)测试命令及其所有亲属.功能定义的东西.在Python中,这一切都变得非常容易.这是摆脱bash并在Python中完成它的巨大胜利之一.
互动功能.这包括命令历史记录和什么不是.您不需要这个来编写shell脚本.这仅适用于人工交互,不适用于脚本编写.
shell文件管理功能.这包括重定向和管道.这比较棘手.其中大部分可以通过子进程完成.但是在shell中一些容易的东西在Python中是令人不快的.特别喜欢的东西(a | b; c ) | something >result
.这将并行运行两个进程(输出a
为输入b
),然后是第三个进程.该序列的输出与并行运行,something
输出被收集到一个名为的文件中result
.用任何其他语言表达都很复杂.
特定程序(awk,sed,grep等)通常可以重写为Python模块.不要过火.替换你需要的东西并改进你的"grep"模块.不要开始编写替换"grep"的Python模块.
最好的是你可以分步完成.
用Python替换AWK和PERL.别管其他一切.
看看用Python替换GREP.这可能有点复杂,但您的GREP版本可以根据您的处理需求进行定制.
看看使用Python循环替换FIND os.walk
.这是一个很大的胜利,因为你不会产生尽可能多的进程.
看看用Python脚本替换常见的shell逻辑(循环,决策等).
当然是 :)
看看这些帮助你的库永远不要再编写shell脚本(Plumbum的座右铭).
铅
中士
SH
另外,如果你想用基于Python的东西替换awk,sed和grep,那么我推荐pyp -
"Pyed Piper"或pyp是一个类似于awk或sed的linux命令行文本操作工具,但它使用标准的python字符串和列表方法以及自定义函数,这些函数经过演变,可以在激烈的生产环境中生成快速结果.
我刚刚发现了如何结合bash和ipython的最佳部分.到目前为止,这对我来说比使用子进程等更舒服.您可以轻松复制现有bash脚本的大部分内容,例如以python方式添加错误处理:)这是我的结果:
#!/usr/bin/env ipython3 # *** How to have the most comfort scripting experience of your life *** # ###################################################################### # # … by using ipython for scripting combined with subcommands from bash! # # 1. echo "#!/usr/bin/env ipython3" > scriptname.ipy # creates new ipy-file # # 2. chmod +x scriptname.ipy # make in executable # # 3. starting with line 2, write normal python or do some of # the ! magic of ipython, so that you can use unix commands # within python and even assign their output to a variable via # var = !cmd1 | cmd2 | cmd3 # enjoy ;) # # 4. run via ./scriptname.ipy - if it fails with recognizing % and ! # but parses raw python fine, please check again for the .ipy suffix # ugly example, please go and find more in the wild files = !ls *.* | grep "y" for file in files: !echo $file | grep "p" # sorry for this nonsense example ;)
请参阅有关系统shell命令的 IPython文档,并将其用作系统shell.
截至2015年和Python 3.4的发布,现在有一个相当完整的用户交互式shell可用于:http://xon.sh/或https://github.com/scopatz/xonsh
该演示视频不显示正在使用的管道,但他们在默认的shell模式下支持.
Xonsh('conch')非常努力地模仿bash,所以你已经获得了肌肉记忆的东西,比如
env | uniq | sort -r | grep PATH
要么
my-web-server 2>&1 | my-log-sorter
仍然可以正常工作.
该教程非常冗长,似乎涵盖了人们在灰烬或bash提示下通常会遇到的大量功能:
编译,评估和执行!
命令历史记录和选项卡完成
帮助和超级帮助?
&??
别名和定制提示
执行*.xsh
也可以导入的命令和/或脚本
环境变量包括Lookup with ${}
输入/输出重定向和组合
后台工作和工作控制
嵌套子进程,管道和协处理
存在命令时的子进程模式,否则为Python模式
捕获子进程,带有未捕获的子进程$()
,带有$[]
Python评估@()
Filename Globbing with *
或Regular Expression Filename Globbing with Backticks
如果你想使用Python作为shell,为什么不看看IPython?交互式学习语言也很好.
如果你做了很多文本操作,并且你使用Vim作为文本编辑器,你也可以直接在python中为Vim编写插件.只需在Vim中键入":help python"并按照说明操作或查看此演示文稿.编写将在编辑器中直接使用的函数非常简单和强大!
在开始时有sh,sed和awk(并找到,和grep,和...).这很好.但awk可能是一个奇怪的小野兽,如果你不经常使用它,很难记住.然后伟大的骆驼创造了Perl.Perl是系统管理员的梦想.这就像类固醇的shell脚本.文本处理,包括正则表达式只是语言的一部分.然后它变得丑陋......人们试图用Perl做大的应用程序.现在,不要误会我的意思,Perl可以是一个应用程序,但如果你不是很小心,它可以(可以!)看起来像一团糟.然后就是所有这些平面数据业务.这足以让程序员疯狂.
输入Python,Ruby等.这些是非常好的通用语言.它们支持文本处理,并且做得很好(尽管可能没有与语言的基本核心紧密缠绕在一起).但是它们也可以非常好地扩展,并且在一天结束时仍然具有漂亮的代码.他们还开发了相当庞大的社区,其中包含大量的图书馆.
现在,对Perl的大部分负面意见都是一个问题,当然有些人可以编写非常简洁的Perl,但是有很多人抱怨创建混淆代码太容易了,你知道有一些真相.问题真的变成了,你是否会将这种语言用于简单的bash脚本替换.如果没有,请学习更多Perl ..这绝对是太棒了.另一方面,如果你想要一种与你一起成长的语言,你可以建议使用Python或Ruby.
无论哪种方式,祝你好运!
我推荐了很棒的在线书籍Dive Into Python.这就是我最初学习语言的方式.
除了教你语言的基本结构,以及大量有用的数据结构之外,它还有一个关于文件处理和后续章节的正确表达式的章节等等.
添加到先前的答案:检查pexpect模块以处理交互式命令(adduser,passwd等)
我喜欢Python的一个原因是它比POSIX工具更加标准化.我必须加倍检查并检查每个位是否与其他操作系统兼容.在Linux系统上编写的程序在OSX的BSD系统上可能无法正常工作.使用Python,我只需要检查目标系统是否具有足够现代的Python版本.
更好的是,用标准Python编写的程序甚至可以在Windows上运行!
我将根据经验给出我的意见:
对于shell:
shell可以很容易地生成只读代码.写下来,当你回到它时,你永远不会弄明白你又做了什么.实现这一目标非常容易.
shell可以用管道在一行中做很多文本处理,拆分等.
在将程序调用集成到不同的编程语言中时,它是最好的粘合语言.
对于python:
如果你想要包含窗口的可移植性,使用python.
当你必须操作比文本更多时,python可以更好,例如数字集合.为此,我推荐python.
我通常会选择bash来处理大部分事情,但是当我有一些必须跨越窗口的东西时,我只使用python.