如何友好的把Python和Bash结合在一起
对于Linux用户而言,命令行操作我们已经非常熟悉了。与其他流行的操作系统不同,在Linux社区中,使用命令行与使用图形用户界面执行类似任务相比,命令行通常可以提供更优雅,更有效的解决方案。
随着Linux社区对命令行的依赖不断增长,UNIX shell(如bash和zsh)已发展成为极其强大的工具,可以补充UNIX shell的经验。使用bash和其他类似的shell,可以使用许多强大的功能,例如管道,文件名通配符以及从称为脚本的文件中读取命令的功能。
让我们看一个真实的示例来演示命令行的功能。每次用户登录服务时,其用户名都会记录到一个文本文件中。对于此示例,让我们找出有多少唯一用户使用该服务。
以下示例中的一系列命令通过将较小的构建块链接在一起,显示了更复杂的实用工具的功能:
$ cat names.log | sort | uniq | wc -l
管道符号(|)用于将一个命令的标准输出传递到下一命令的标准输入。在此处的示例中,cat names.txt的输出传递到sort命令中。sort命令的输出是按字母顺序重新排列文件的每一行。随后将其传递给uniq命令,该命令将删除所有重复的名称。最后,uniq的输出传递到wc命令。wc是计数命令,并且设置了-l标志,它返回行数。这使您可以将许多命令链接在一起。
但是,有时所需的内容可能会变得非常复杂,并且将命令链接在一起可能变得笨拙。在这种情况下,shell脚本就是答案。Shell脚本是由Shell读取并按顺序执行的命令列表。Shell脚本还支持某些编程语言基础知识,例如变量,流控制和数据结构。Shell脚本对于将经常重复运行的批处理作业非常有用。不幸的是,shell脚本有一些缺点:
Shell脚本很容易变得过于复杂,并且对于想要改进或维护它们的开发人员来说是不可读的。
这些shell脚本的语法和解释器通常很笨拙且不直观。语法越笨拙,对于必须使用这些脚本的开发人员来说,可读性就越差。
该代码通常无法在其他脚本中使用。脚本之间的代码重用往往很困难,并且脚本往往非常特定于某个问题。
用于高级功能(例如HTML解析或HTTP请求)的库不像现代编程和脚本语言那样容易获得。
这些问题会使shell脚本难以处理,并经常导致大量开发人员时间浪费。取而代之的是,Python编程语言可以用作非常有力的替代品。使用Python代替Shell脚本有很多好处:
默认情况下,所有主要的Linux发行版都安装了Python。打开命令行并立即键入python,将使您进入Python解释器。这种普遍性使它成为大多数脚本任务的明智选择。
Python具有非常易于阅读和理解的语法。它的风格强调简约和简洁的代码,同时允许开发人员以适合shell脚本的准系统风格进行编写。
Python是一种解释型语言,这意味着没有编译阶段。这使Python成为编写脚本的理想语言,它允许您以解释的方式快速尝试新代码。这使开发人员可以快速修改,而不必将整个程序写到文件中。
Python是一种功能齐全的编程语言。代码重用很简单,因为Python模块可以轻松导入并在任何Python脚本中使用。脚本可以轻松扩展或构建。
Python可以使用出色的标准库和数以千计的第三方库来处理各种高级实用程序,例如解析器和请求库。例如,Python的标准库包括日期时间库,该库允许将日期解析为指定的任何格式并将其与其他日期轻松比较。
但Python不应替换所有bash命令。编写以UNIX方式运行的Python程序(即读入标准输入并写入标准输出)与为现有的shell命令(如cat和sort)编写Python替代品一样强大。
让我们以本文前面已解决的问题为基础。除了已经完成的工作之外,让我们找出某个用户已登录系统的次数。uniq命令仅删除重复项,但不提供有关有多少重复项的信息。代替uniq,Python脚本可以用作链中的另一个命令。这是一个执行此操作的Python程序(在我的示例中,我将此文件称为namescount.py):
#!/usr/bin/env python
import sysif __name__ == "__main__":# Initialize a names dictionary as empty to start with.# Each key in this dictionary will be a name and the value# will be the number of times that name appears.names = {}# sys.stdin is a file object. All the same functions that# can be applied to a file object can be applied to sys.stdin.for name in sys.stdin.readlines():# Each line will have a newline on the end# that should be removed.name = name.strip()if name in names:names[name] += 1else:names[name] = 1# Iterating over the dictionary,# print name followed by a space followed by the# number of times it appeared.for name, count in names.iteritems():sys.stdout.write("%d\t%s\n" % (count, name))
让我们看看这个Python脚本如何适合命令链。首先,它从通过sys.stdin
对象公开的标准输入中读取输入。任何输出都将写入sys.stdout
对象,这是在Python中实现标准输出的方式。Python字典(在其他语言中通常称为哈希映射)用于获取从用户名到重复计数的映射。要获得所有用户的数量,请执行以下操作:
$ cat names.log | python namescount.py
显示用户出现的次数以及用户名的计数。接下来要做的是按顺序显示最常使用该系统的用户。这可以在Python级别完成,但是让我们使用核心UNIX实用程序已经提供的实用程序来实现它。以前,我使用sort
命令对字母进行排序。如果命令提供了-rn
标志,它将按降序对行进行数字排序。随着Python脚本按标准输出,只需将命令通过管道传递到sort
并检索所需的输出:
$ cat names.log | python namescount.py | sort -rn
这是将Python用作命令链一部分的强大示例。在这种情况下使用Python的优点如下:
与cat和sort等工具链接的能力。简单的实用程序(逐行读取文件并以数字方式对文件进行排序)由久经考验的UNIX命令处理。这些命令也逐行读取,这意味着这些功能可以缩放到大型文件,而且速度很快。
当需要在链中进行一些繁重的工作时,可以编写一个非常清晰,简洁的Python脚本,该脚本将执行其所需的工作,然后将责任转移给链中的下一个链接。
它是一个可重用的模块,尽管此示例专门针对名称,但是如果您向此输入中包含重复行的任何输入,它将打印出每行和重复的数量。通过将Python代码模块化,可以将其应用于各种场景。
为了展示以模块化和管道方式组合Python脚本的强大功能,让我们进一步把问题放大。让我们找到该服务的前五名用户。head
是一个命令,它允许您指定一定数量的行以显示给定的标准输入。将其添加到命令链中将得到以下内容:
$ cat names.log | python namescount.py | sort -rn | head -n 5
这仅显示前五个用户,而忽略其余用户。同样,要使五个用户最少使用该服务,可以使用tail
命令,该命令采用相同的参数。将Python命令打印到标准输出的结果使可以构建和扩展其功能。
以上就是简单的介绍,实际中大家灵活运用就好。
原文来自:http://suo.im/5V4DNv
作者:python运维技术
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:(1)点击页面最上方“小詹学Python”,进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。
如何友好的把Python和Bash结合在一起相关推荐
- 如何使用 Python 或 Bash动态生成 Jekyll 配置文件
使用 Python 或 Bash 将动态数据插入 Jekyll 静态网站中,并且避免创建一个 API 后端. 静态网站生成器 Jekyll 使用 _config.yml 进行配置.这些配置都是 Jek ...
- ABS 1.1.0:更多Python和Bash提供最有趣的编程语言
by Alex Nadalin 通过亚历克斯·纳达林 ABS 1.1.0:更多Python和Bash提供最有趣的编程语言 (ABS 1.1.0: more Python and Bash for th ...
- python getopts_linux bash shell 中getopts 命令 和 python 中 getopt 函数的比较总结
在 python 中有个获取命令行参数的函数叫 getopt(args, shortopts, longopts=[]) 通常我们使用的时候是如下的形式: import sys import geto ...
- 程序员最爱用 Emacs 写 Python、Bash,调研了 7300 位开发者有这些发现
整理 | 郑丽媛 头图 | CSDN下载自视觉中国 不知不觉,特殊的 2020 年已经走到了尾声.纵使今年跌宕起伏,但各大平台对于本年度的总结报告还是如期而至.这不,近日著名集成开发环境和文本编辑器 ...
- python多线程框架_基于python和bash的多线程任务框架 不要让cpu闲着了
[Bash shell] 纯文本查看 复制代码#! /bin/bash ################################################################ ...
- python执行bash命令
1.执行bash命令 import os os.system('ls -al') 2.执行bash脚本 os.system('sh ./test.sh') 3.脚本中带参数 arg1='111' ar ...
- jupyter 写入csv pandas_整理一套 pandas 详细教程,希望对你有帮助!
点击上方 "Python人工智能技术" 关注,星标或者置顶22点24分准时推送,第一时间送达 编辑:技术君 来源:机器之心 Python人工智能技术(ID:coder_experi ...
- python:通过python脚本快速执行 bash 命令
* git镇楼:git config --global core.filemode false* 实践出真知.虽然这个脚本代码量不大,但是也是经过3次修改才达到预期效果的. * 第一次写的时候,凭逻辑 ...
- Python 基础入门--简介和环境配置
2019 年第 32 篇,总 56 篇文章 本文大约 1w 字,建议收藏阅读 上周结束了如何构造一个机器学习项目的系列文章,当然还有一篇简单的总结以及介绍一些入门的学习资料,不过还在整理,应该这周内会 ...
最新文章
- SAP MM 如下图,做发票校验的时候,对于非计划交货成本分摊到各个ITEM中,为什么分摊比例是1:2,而非1:6?
- jqMobi(App Framework)入门学习(一)
- 打开Mybatis核心配置文件SqlMapConfig.xml的代码提示功能
- linux sed命令整行替换:将`PermitRootLogin`行替换成`PermitRootLogin yes`
- 3D集合图元:最小边界框/包围盒(boundingbox)
- java 注入 循环_spring依赖注入——循环依赖
- 我有一段很厉害的代码,不外传的那种
- ModuleNotFoundError: No module named 'cv2'
- 浏览器和服务器交互原理?(请求--响应的过程)
- 任正非:做芯片砸钱不行 得砸数学家、物理学家、化学家
- sam卡和sim卡区别_SAM卡槽是不是和SIM卡槽是一个东西,有高人知道么?
- 周边pd是什么意思_肿瘤百问百答(六)关于胃癌的PD-1抗体治疗,你应该知道些什么?...
- Struts2学习笔记(十七) 文件下载(File Download)
- 拼多多大力发展“多多视频”业务
- flash动画短片制作常用表现方法与技巧(精华)
- php pandoc,搭建Pandoc+Markdown写作环境
- 如何在 HTML中使用图标字体
- webpy中如何返回json格式给前端
- 2021年初级会计职称《初级会计实务》考试真题资产内容
- 测绘资质属于工程资质吗?测绘资质和测量资质有什么区别?
热门文章
- idea如何设置自动换行
- Maven环境配置及IntelliJ IDEA中的Maven部署(亲自测试)
- Elasticsearch索引迁移的三种方式
- linux系统下安装 Loadrunner11(个人感觉不错儿)
- java中断线程_Java中断线程的方法
- main java game,playgame 一个JAVA编写的飞行小游戏,有基本完整的 框架,适合初学者参照学习 Other s 其他 238万源代码下载- www.pudn.com...
- document、body对象的事件
- xposed框架在分机安装失败_免root用Xposed框架!安卓用户一定要学会
- python做游戏代码_利用Python基础代码语句,实现2G时代文字小游戏,世界如此简单!...
- 蓝桥杯单片机十一届省赛_“第十届蓝桥杯青少组C++省赛”前三题解题思路及参考答案!...