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中使用Tkinter模块创建GUI程序实例
Jan 14 Python
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
python对配置文件.ini进行增删改查操作的方法示例
Jul 28 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
python用户评论标签匹配的解决方法
May 31 Python
Django框架实现逆向解析url的方法
Jul 04 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
基于Pyinstaller打包Python程序并压缩文件大小
May 28 Python
Python模拟键盘输入自动登录TGP
Nov 27 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
Jan 29 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 UTF8中文字符截断函数代码
2012/09/11 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
YII中assets的使用示例
2014/07/31 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
PHP Trait功能与用法实例分析
2020/06/03 PHP
让textarea控件的滚动条怎是位与最下方
2007/04/20 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
Python实现的金山快盘的签到程序
2013/01/17 Python
在Python的Django框架中更新数据库数据的方法
2015/07/17 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
wxPython实现分隔窗口
2019/11/19 Python
基于python爬取有道翻译过程图解
2020/03/31 Python
一文读懂Python 枚举
2020/08/25 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
请解释在new与override的区别
2012/10/29 面试题
毕业生个人求职信范文分享
2014/01/05 职场文书
初一家长会邀请函
2014/01/31 职场文书
教育学习自我评价
2014/02/03 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书