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中设计模式之Decorator装饰器模式的要点
Mar 02 Python
Python中内建函数的简单用法说明
May 05 Python
Python中死锁的形成示例及死锁情况的防止
Jun 14 Python
Python的装饰器用法学习笔记
Jun 24 Python
python处理按钮消息的实例详解
Jul 11 Python
教你使用python画一朵花送女朋友
Mar 29 Python
一行代码让 Python 的运行速度提高100倍
Oct 08 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
Python基于pip实现离线打包过程详解
May 15 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
星际争霸 Starcraft 秘技补丁
2020/03/14 星际争霸
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
PHP 和 XML: 使用expat函数(三)
2006/10/09 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
Yii2中事务的使用实例代码详解
2016/09/07 PHP
postman的安装与使用方法(模拟Get和Post请求)
2018/08/06 PHP
jquery cookie的用法总结
2013/11/18 Javascript
Jquery 点击按钮自动高亮实现原理及代码
2014/04/25 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
2014/07/18 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
JavaScript获取当前url根目录(路径)
2016/06/17 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
nodejs前端模板引擎swig入门详解
2018/05/15 NodeJs
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
PyCharm代码格式调整方法
2018/05/23 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
python实现学生通讯录管理系统
2021/02/25 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
客服工作职责
2013/12/11 职场文书
手机业务员岗位职责
2013/12/13 职场文书
法人授权委托书
2014/04/03 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫