python和shell配合_如何友好的把Python和Bash结合在一块儿

对于Linux用户而言,命令行操做咱们已经很是熟悉了。与其余流行的操做系统不一样,在Linux社区中,使用命令行与使用图形用户界面执行相似任务相比,命令行一般能够提供更优雅,更有效的解决方案。python

bde60d8b0c8b709fdc860374316cba55.png

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

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

如下示例中的一系列命令经过将较小的构建块连接在一块儿,显示了更复杂的实用工具的功能:bash

$ cat names.log | sort | uniq | wc -l

管道符号(|)用于将一个命令的标准输出传递到下一命令的标准输入。在此处的示例中,cat names.txt的输出传递到sort命令中。sort命令的输出是按字母顺序从新排列文件的每一行。随后将其传递给uniq命令,该命令将删除全部重复的名称。最后,uniq的输出传递到wc命令。wc是计数命令,而且设置了-l标志,它返回行数。这使您能够将许多命令连接在一块儿。数据结构

可是,有时所需的内容可能会变得很是复杂,而且将命令连接在一块儿可能变得笨拙。在这种状况下,shell脚本就是答案。Shell脚本是由Shell读取并按顺序执行的命令列表。Shell脚本还支持某些编程语言基础知识,例如变量,流控制和数据结构。Shell脚本对于将常常重复运行的批处理做业很是有用。不幸的是,shell脚本有一些缺点:app

Shell脚本很容易变得过于复杂,而且对于想要改进或维护它们的开发人员来讲是不可读的。编程语言

这些shell脚本的语法和解释器一般很笨拙且不直观。语法越笨拙,对于必须使用这些脚本的开发人员来讲,可读性就越差。ide

该代码一般没法在其余脚本中使用。脚本之间的代码重用每每很困难,而且脚本每每很是特定于某个问题。模块化

用于高级功能(例如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))

让咱们看看这个Python脚本如何适合命令链。首先,它从经过sys.stdin对象公开的标准输入中读取输入。任何输出都将写入sys.stdout对象,这是在Python中实现标准输出的方式。Python字典(在其余语言中一般称为哈希映射)用于获取从用户名到重复计数的映射。要得到全部用户的数量,请执行如下操做:

$ cat names.log | python namescount.py

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

$ 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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值