我可以使用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
shutil
和os
模块,您不需要分叉子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
。 这将并行运行两个进程(将输出作为b
input),然后执行第三个进程。 该序列的输出与something
并行运行,并将输出收集到一个名为result
的文件中。 用任何其他语言来expression都很复杂。
特定的程序(awk,sed,grep等)通常可以被重写为Python模块。 不要太过分 replace你所需要的并发展你的“grep”模块。 不要开始编写replace“grep”的Python模块。
最好的事情是,你可以做到这一步。
- 用PythonreplaceAWK和PERL。 放下一切。
- 看看用Python代替GREP。 这可能会更复杂一点,但是您的GREP版本可以根据您的处理需求量身定制。
- 看看使用
os.walk
Python循环replaceFIND。 这是一个巨大的胜利,因为你没有产生许多进程。 - 看看用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将会非常好。 为了学习,请点击这里 。