我可以使用Python作为Bashreplace吗?

我目前通过一堆不好记住的AWK,sed,Bash和一小部分的Perl来处理我的文本文件。

我已经提到了几个地方,python是这种东西很好,我知道一点,我想了解更多。 Python是一个很好的select,是否有一本好书或者指南来学习如何使用Python来代替shell脚本,AWK,sed和朋友?

任何shell都有几套function。

  • 基本的Linux / Unix命令。 所有这些都可以通过subprocess库。 这并不总是做所有外部命令的最好的首选。 另外看看shutil中的一些单独的Linux命令的命令,但是你可以直接在你的Python脚本中实现。 另一大批Linux命令在os库中; 你可以在Python中更简单地完成这些工作。

    还有 – 奖金! – 更快速。 shell中的每个单独的Linux命令(有一些例外)都会生成一个subprocess。 通过使用Python shutilos模块,您不需要分叉子shutil

  • shell环境function。 这包括设置一个命令的环境(当前目录和环境variables和什么)的东西。 你可以直接从Python轻松pipe理这个。

  • shell编程function。 这是所有的进程状态码检查,各种逻辑命令(如果,当,等等)testing命令及其所有亲戚。 函数定义的东西。 在Python中,这非常容易。 这是摆脱bash和Python的巨大胜利之一。

  • 交互function。 这包括命令历史和什么不是。 您不需要编写shell脚本。 这只是为了人际互动,而不是为了写作。

  • shell文件pipe理function。 这包括redirect和pipe道。 这更棘手。 这大部分可以通过子stream程完成。 但是一些在shell中很容易的事情在Python中是不愉快的。 具体的东西像(a | b; c ) | something >result (a | b; c ) | something >result 。 这将并行运行两个进程(将输出作为binput),然后执行第三个进程。 该序列的输出与something并行运行,并将输出收集到一个名为result的文件中。 用任何其他语言来expression都很复杂。

特定的程序(awk,sed,grep等)通常可以被重写为Python模块。 不要太过分 replace你所需要的并发展你的“grep”模块。 不要开始编写replace“grep”的Python模块。

最好的事情是,你可以做到这一步。

  1. 用PythonreplaceAWK和PERL。 放下一切。
  2. 看看用Python代替GREP。 这可能会更复杂一点,但是您的GREP版本可以根据您的处理需求量身定制。
  3. 看看使用os.walk Python循环replaceFIND。 这是一个巨大的胜利,因为你没有产生许多进程。
  4. 看看用Python脚本replace常见的shell逻辑(循环,决定等)。

当然是 :)

看看这些帮助你的库不要再写shell脚本 (铅的座右铭)。

  • 中士
  • SH

另外,如果你想用基于Python的东西replaceawk,sed和grep,那么我推荐pyp –

“Pyed Piper”或pyp是一个类似于awk或sed的linux命令行文本处理工具,但它使用标准的pythonstring和列表方法以及演变而来的自定义函数,以在紧张的生产环境中生成快速结果。

我刚刚发现如何组合bash和ipython的最佳部分。 到目前为止,这似乎比使用subprocess更舒服,等等。 你可以很容易地复制现有的bash脚本的大部分,例如以python的方式添加error handling:)这里是我的结果:

 #!/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

演示video不显示正在使用的pipe道,但是在默认的shell模式下它们是受支持的。

Xonsh('海螺')很难模仿bash,所以你已经获得了肌肉记忆的东西,就像

 env | uniq | sort -r | grep PATH 

要么

 my-web-server 2>&1 | my-log-sorter 

仍然会正常工作。

本教程相当长,似乎涵盖了人们通常在灰或bash提示时期望的大量function:

  • 编译,评估和执行!
  • 命令历史logging和选项卡完成
  • 帮助和超级帮助? &??
  • 别名&定制提示
  • 执行也可以导入的命令和/或* .xsh脚本
  • 使用$ {}查找环境variables
  • input/输出redirect和组合
  • 背景工作和工作控制
  • 嵌套子stream程,pipe道和协同处理
  • 存在命令时的subprocess模式,否则为Python模式
  • 用$()捕获subprocess,用$ []捕获subprocess,用@()
  • 文件名使用*或正则expression式文件名使用反引号进行网格布局
  • 如果你想使用Python作为shell,为什么不看看IPython呢? 交互式学习语言也很好。
  • 如果你做了很多文本处理,而且如果你使用Vim作为文本编辑器,你也可以直接在python中编写Vim的插件。 只需在Vim中键入“:help python”,然后按照说明操作即可。 编写可以直接在编辑器中使用的函数非常简单而且强大!

一开始有sh,sed和awk(和find,grep,…)。 这很好。 但awk可以是一个奇怪的小野兽,很难记住,如果你不经常使用它。 然后伟大的骆驼创造了Perl。 Perl是系统pipe理员的梦想。 这就像使用类固醇shell脚本。 文本处理,包括正则expression式只是语言的一部分。 然后它变得丑陋…人们试图用Perl来做大的应用程序。 现在,不要误解我的意思,Perl可以是一个应用程序,但是如果你不小心,它可以(可以!)看起来像一团糟。 那么所有这些平面数据业务。 这足以驱动程序员的坚果。

inputPython,Ruby等。 这些是非常好的通用语言。 他们支持文本处理,并且做得很好(虽然可能没有像语言的基本核心那样紧密交织在一起)。 但是它们的规模也很大,在一天结束的时候仍然有很好的代码。 他们也开发了相当庞大的社区,其中大部分都有大量的图书馆。

现在,对Perl的许多负面消息都是一个意见问题,当然有些人可以编写非常干净的Perl,但是有很多人抱怨说创build混淆代码太容易,你知道一些事实。 这个问题真的变成了,你是否会使用这种语言,而不仅仅是简单的bash脚本replace。 如果没有,学习更多的Perl ..这绝对是梦幻般的。 另一方面,如果你想要一种随着你想要做的更多的语言,我可以build议Python还是Ruby。

无论哪种方式,祝你好运!

我build议的在线书Dive Into Python真棒。 这是我最初学习的语言。

Beyone教给你语言的基本结构,以及大量有用的数据结构,它有一个很好的章节文件处理和正则expression式和更多的后续章节。

我喜欢Python的一个原因是它比POSIX工具更好地标准化。 我必须双倍和三重检查每一位是否与其他操作系统兼容。 在Linux系统上编写的程序可能在OSX的BSD系统上工作不一样。 使用Python,我只需要检查目标系统是否有足够现代的Python版本。

更好的是,使用标准Python编写的程序甚至可以在Windows上运行!

添加到以前的答案:检查pexpect模块处理交互式命令(adduser,passwd等)

我会根据经验给出我的看法:

对于shell:

  • shell可以很容易地产生只读的代码。 写下来,当你回到它,你永远不会知道你做了什么。 这很容易完成。
  • shell可以做一大堆文本处理,分割,等等。
  • 当用不同的编程语言来集成程序的调用时,它是最好的粘合语言。

对于python:

  • 如果你想包括可移植性,使用python。
  • python可以更好,当你必须操作更多的文本,如数字集合。 为此,我推荐python。

我通常selectbash的大部分的东西,但是当我有东西必须穿越windows的界限,我只是使用python。

我已经构build了半长的shell脚本(300-500行)和执行类似function的Python代码。 当许多外部命令正在执行时,我发现shell更容易使用。 当有大量的文本操作时,Perl也是一个不错的select。

你最好的select是专门针对你的问题的工具。 如果它正在处理文本文件,那么Sed,Awk和Perl是最有竞争力的。 Python是一种通用的dynamic语言。 与任何通用语言一样,支持文件操作,但这不是它的核心目的。 如果我特别要求使用dynamic语言,我会考虑Python或Ruby。

总之,学习Sed和Awk真的很好,再加上所有其他的* nix(所有Bash内置函数,grep,tr等等)的风格。 如果你感兴趣的是文本文件处理,那么你已经在使用正确的东西了。

在研究这个主题时,我发现了这个概念validation代码 (通过http://jlebar.com/2010/2/1/Replacing_Bash.html上的评论),可以让你“用Python编写类似shell的pipe道简洁的语法,并利用现有的系统工具,他们有意义“:;

 for line in sh("cat /tmp/junk2") | cut(d=',',f=1) | 'sort' | uniq: sys.stdout.write(line) 

pythonpy是一个工具,它提供了对awk和sed许多function的简单访问,但使用python语法:

 $ echo me2 | py -x 're.sub("me", "you", x)' you2 

如果你的文本文件操作通常是一次性的,可能在shell提示符下完成,你将不会从python中得到更好的结果。

另一方面,如果您通常必须一遍又一遍地执行相同的(或类似的)任务,并且您必须编写脚本来完成这个任务,那么python非常棒 – 您可以轻松创build自己的库(可以执行那也是用shell脚本,但是比较麻烦)。

感受一个非常简单的例子。

 import popen2 stdout_text, stdin_text=popen2.popen2("your-shell-command-here") for line in stdout_text: if line.startswith("#"): pass else jobID=int(line.split(",")[0].split()[1].lstrip("<").rstrip(">")) # do something with jobID 

还要检查sys和getopt模块,他们是第一个你需要的。

您可以使用Python而不是bash与ShellPy库。

下面是一个从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') 

正如你所看到的,重音(`)符号内的所有expression式都是在shell中执行的。 在Python代码中,您可以捕获此执行的结果并对其执行操作。 例如:

 log = `git log --pretty=oneline --grep='Create' 

这行首先在shell中执行git log --pretty=oneline --grep='Create' ,然后将结果赋给logvariables。 结果有以下属性:

从执行过程的stdout中标出整个文本

从执行过程的stderr中读取整个文本

执行的returncode返回码

这是图书馆的一般概述,更详细的例子可以在这里find。

我已经在PyPI上发布了一个包: ez 。
使用pip install ez来安装它。

它已经在shell中打包了常用命令,很好,我的lib使用和shell基本相同的语法。 例如,cp(源,目标)可以处理文件和文件夹! (shutil.copy shutil.copytree的包装,它决定何时使用哪一个)。 更好的是,它可以像R一样支持vector化!

另一个例子:no os.walk,使用fls(path,regex)recursion查找文件并用正则expression式过滤,并返回一个有或没有完整path的文件列表

最后一个例子:你可以把它们结合起来编写非常简单的脚本
files = fls('.','py$'); cp(files, myDir)

肯定检查出来! 它花了我几百个小时来写/改进它!

我希望有一些体面的取代bash脚本,但真的没有。

Python似乎是一个很好的候选人,直到遇到用于文件操作和产卵过程(os.popen3)的尴尬标准库函数并与它们进行通信。

对于文本文件操作,Python将会非常好。 为了学习,请点击这里 。