当前位置: 首页 > 后端技术 > Python

如何将Python和Bash结合在一起

时间:2023-03-26 00:12:56 Python

对于Linux用户来说,我们已经非常熟悉命令行操作了。与其他流行的操作系统不同,在Linux社区中,使用命令行通常比使用图形用户界面执行类似任务提供更优雅和高效的解决方案。随着Linux社区对命令行的依赖不断增加,UNIXshell(例如bash和zsh)已经发展成为极其强大的工具,补充了UNIXshell的体验。使用bash和其他类似的shell,可以使用许多强大的功能,例如管道、文件名通配符以及从称为脚本的文件中读取命令的能力。让我们看一个真实的例子来展示命令行的强大功能。每次用户登录该服务时,他们的用户名都会记录到一个文本文件中。对于此示例,让我们找出有多少唯一用户使用该服务。以下示例中的命令序列通过将较小的构建块链接在一起显示了更复杂的实用程序的强大功能:$catnames.log|排序|独特|wc-l管道符号(|)用于将一个命令的标准输出传递给下一个命令的标准输入。在此处的示例中,catnames.txt的输出通过管道传输到排序命令中。排序命令的输出是按字母顺序重新排列文件的每一行。然后将其传递给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的标准库包括datetime库,它允许将日期解析为任何指定的格式,并方便地与其他日期进行比较。但是Python不应该取代所有的bash命令。编写以UNIX方式运行的Python程序(即读入标准输入并写入标准输出)与编写Python替代现有shell命令(如cat和sort)一样强大。让我们以本文前面??提到的问题为基础。添加到已经完成的工作中,让我们找出某个用户登录系统的次数。uniq命令仅删除重复项,但不提供有关有多少重复项的信息。可以使用Python脚本代替uniq作为链中的另一个命令。这是一个执行此操作的Python程序(在我的示例中,我将此文件称为namescount.py):#!/usr/bin/envpythonimportsysif__name__=“__main__”:#初始化一个名称字典为一开始是空的。#此词典中的每个键都是一个名称,而值#将是该名称出现的次数。names={}#sys.stdin是一个文件对象。所有可以应用于文件对象的相同函数都可以应用于sys.stdin。对于sys.stdin.readlines()中的名称:#每行末尾都有一个换行符#应删除。name=name.strip()如果名称中的名称:名称[名称]+=1else:names[name]=1#在字典上迭代,#打印名称,然后是一个空间,然后是##出现的次数。forname,countinnames.iteritems():sys.stdout.write("%d\t%s\n"%(count,name))让我们看看这个Python脚本如何合适地组合命令链。首先,它从通过sys.stdin对象公开的标准输入读取输入。任何输出都将写入sys.stdout对象,这就是标准输出在Python中的实现方式。Python字典(在其他语言中通常称为哈希映射)用于获取从用户名到重复计数的映射。要获取所有用户的数量:$catnames.log|pythonnamescount.py显示用户出现的次数以及用户名的计数。接下来要做的是按顺序显示使用系统最多的用户。这可以在Python级别完成,但让我们使用核心UNIX实用程序已经提供的实用程序来完成。以前,我使用sort命令按字母顺序排序。如果命令带有-rn标志,它将按数字降序对行进行排序。使用Python脚本输出到标准输出,只需通过管道传输命令来排序和检索所需的输出:$catnames.log|蟒蛇namescount.py|sort-rn这是一个将Python用作命令链的一部分的有力示例。在这种情况下使用Python的优点如下:能够与cat和sort等工具进行链接。简单的实用程序(逐行读取文件并按数字排序)由久经考验的UNIX命令处理。这些命令也逐行读取,这意味着这些函数可以扩展到大文件并且速度很快。当需要在链中做一些繁重的工作时,您可以编写一个非常清晰、简洁的Python脚本来完成它需要做的事情,然后将责任传递给链中的下一个环节。它是一个可重复使用的模块,虽然这个示例特定于名称,但如果您向它提供任何包含重复行的输入,它将打印出每一行和重复的数量。通过模块化Python代码,使其适用于各种场景。为了展示以模块化和流水线方式组合Python脚本的强大功能,让我们进一步放大。让我们找出该服务的前五名用户。head是一个命令,允许您指定一定数量的行以显示给定的标准输入。将其添加到命令链中会得到以下内容:$catnames.log|蟒蛇namescount.py|排序-rn|head-n5这只显示前五个用户并忽略其余的。同样,要至少有五个用户使用该服务,您可以使用采用相同参数的tail命令。将Python命令的结果打印到标准输出使得构建和扩展其功能成为可能。以上是简单的介绍,有利于大家在实践中灵活运用。