Python和Bash结合在一起的方法


Posted in Python onNovember 13, 2020

对于Linux用户而言,命令行操作我们已经非常熟悉了。与其他流行的操作系统不同,在Linux社区中,使用命令行与使用图形用户界面执行类似任务相比,命令行通常可以提供更优雅,更有效的解决方案。

随着Linux社区对命令行的依赖不断增长,UNIX shell(如bash和zsh)已发展成为极其强大的工具,可以补充UNIX shell的经验。使用bash和其他类似的shell,可以使用许多强大的功能,例如管道,文件名通配符以及从称为脚本的文件中读取命令的功能。

让我们看一个真实的示例来演示命令行的功能。每次用户登录服务时,其用户名都会记录到一个文本文件中。对于此示例,让我们找出有多少唯一用户使用该服务。

以下示例中的一系列命令通过将较小的构建块链接在一起,显示了更复杂的实用工具的功能:

$ cat names.log | sort | uniq | wc -l
$ 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 sys

if __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] += 1
      else:
          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))
#!/usr/bin/env python

import sys

if __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 ] += 1

             else :

                     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
$ cat names . log | python namescount . py

显示用户出现的次数以及用户名的计数。接下来要做的是按顺序显示最常使用该系统的用户。这可以在Python级别完成,但是让我们使用核心UNIX实用程序已经提供的实用程序来实现它。以前,我使用 sort 命令对字母进行排序。如果命令提供了 -rn 标志,它将按降序对行进行数字排序。随着Python脚本按标准输出,只需将命令通过管道传递到 sort 并检索所需的输出:

$ cat names.log | python namescount.py | sort -rn
$ 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
$ cat names . log | python namescount . py | sort - rn | head - n 5

这仅显示前五个用户,而忽略其余用户。同样,要使五个用户最少使用该服务,可以使用 tail 命令,该命令采用相同的参数。将Python命令打印到标准输出的结果使可以构建和扩展其功能。

以上就是简单的介绍,实际中大家灵活运用就好。

以上就是Python和Bash结合在一起的方法的详细内容,更多关于python和bash结合的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python使用htpasswd实现基本认证授权的例子
Jun 10 Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
python端口扫描系统实现方法
Nov 19 Python
python中numpy包使用教程之数组和相关操作详解
Jul 30 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
Mar 23 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
dataframe 按条件替换某一列中的值方法
Jan 29 Python
Python实现最大子序和的方法示例
Jul 05 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
深入了解python中元类的相关知识
Aug 29 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
May 08 Python
python小技巧——将变量保存在本地及读取
Nov 13 #Python
python实现数学模型(插值、拟合和微分方程)
Nov 13 #Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 #Python
Python图像识别+KNN求解数独的实现
Nov 13 #Python
Django正则URL匹配实现流程解析
Nov 13 #Python
Django框架请求生命周期实现原理
Nov 13 #Python
python在地图上画比例的实例详解
Nov 13 #Python
You might like
PHP图片上传类带图片显示
2006/11/25 PHP
php导入excel文件到mysql数据库的方法
2015/01/14 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
javascript window.opener的用法分析
2010/04/07 Javascript
解决ExtJS在chrome或火狐中正常显示在ie中不显示的浏览器兼容问题
2013/01/11 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
vue 微信授权登录解决方案
2018/04/10 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
2020/08/14 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
Python常见工厂函数用法示例
2018/03/21 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
在线服装零售商:SheIn
2016/07/22 全球购物
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
简历中个人自我评价范文
2013/12/26 职场文书
产品发布会策划方案
2014/05/12 职场文书
创文明城市标语
2014/06/16 职场文书
怎样写离婚协议书
2014/09/10 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
银行给客户的感谢信
2015/01/23 职场文书
公司财务部岗位职责
2015/04/14 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers