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从MP3文件获取id3的方法
Jun 15 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
Python正则表达式完全指南
May 25 Python
python实现关键词提取的示例讲解
Apr 28 Python
对Python random模块打乱数组顺序的实例讲解
Nov 08 Python
利用python开发app实战的方法
Jul 09 Python
详解python实现小波变换的一个简单例子
Jul 18 Python
Win10下python 2.7与python 3.7双环境安装教程图解
Oct 12 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 Python
使用python绘制横竖条形图
Apr 21 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编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
php下封装较好的数字分页方法
2010/11/23 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
PHP类的封装与继承详解
2015/09/29 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
Django中的cookie与session操作实例代码
2017/08/17 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
Python使用Supervisor来管理进程的方法
2015/05/28 Python
Python实现分割文件及合并文件的方法
2015/07/10 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Python 实现将numpy中的nan和inf,nan替换成对应的均值
2020/06/08 Python
浅析关于Keras的安装(pycharm)和初步理解
2020/10/23 Python
python3 kubernetes api的使用示例
2021/01/12 Python
一款CSS3实现多功能下拉菜单(带分享按)的教程
2014/11/05 HTML / CSS
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
信息专业本科生个人的自我评价
2013/10/28 职场文书
求职信格式范本
2013/11/15 职场文书
优秀英语专业毕业生求职信
2013/11/23 职场文书
初中学生期末评语
2014/04/24 职场文书
我的老师教学反思
2014/05/01 职场文书
乡镇党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
护士医德医风心得体会
2016/01/25 职场文书