0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux操作环境:将Python和shell命令的Bash结合在一起

如意 来源:马哥Linux运维 作者:马哥Linux运维 2020-09-16 15:17 次阅读

对于Linux用户而言,命令行操作我们已经非常熟悉了。与其他流行的操作系统不同,在Linux社区中,使用命令行与使用图形用户界面执行类似任务相比,命令行通常可以提供更优雅,更有效的解决方案。

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

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

以下示例中的一系列命令通过将较小的构建块链接在一起,显示了更复杂的实用工具的功能:

$ 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):

Linux操作环境:将Python和shell命令的Bash结合在一起

让我们看看这个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命令打印到标准输出的结果使可以构建和扩展其功能。

以上就是简单的介绍,实际中大家灵活运用就好。
责编AJX

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206725
  • python
    +关注

    关注

    51

    文章

    4674

    浏览量

    83463
  • Shell
    +关注

    关注

    1

    文章

    358

    浏览量

    22901
收藏 人收藏

    评论

    相关推荐

    想学习下如何把两个程序合在一起

    在下新手,刚入道,想学习下如何把两个程序合在一起?在keil里面操作!两个程序融合需要怎样操作呢?请前辈们指点!谢谢!
    发表于 08-02 14:56

    怎么把主界面和子VI结合在一起

    就是做个电梯的界面,然后我做好了个个的功能的子VI,但是怎么调用使得运行的时候只出现电梯界面,然后通过电梯界面的按钮来调用子VI的功能,反正就是不知道怎么把主界面和子VI结合在一起,求大神帮帮忙,真的很急用,谢谢了!!!
    发表于 08-24 15:26

    分布测量参数整合在一起测量

    如何几个分布测试的参数通过种方式将其整合在一起,将其全部测量出来?请求大神解答?
    发表于 09-10 21:50

    几个单独的程序组合在一起

    怎样把几个个单独的程序组合在一起,我现在在做环境检测仪,我可不可以先把温度,湿度,噪声等程序先单独做,然后把它们组合在一起,可以吗,怎么组合,求大神告知
    发表于 03-23 14:22

    AD 如何把同属性的焊盘组合在一起

    AD如何把同属性的焊盘组合在一起
    发表于 11-16 11:43

    linux命令操作shell的区别 / 服务器选购!

    hell翻译成壳的意思,它是包裹在linux内核外层的,个可通过系列的linux命令操作
    发表于 03-27 14:54

    请问ISE和Mircoblaze是如何结合在一起的?

    大家好,有人可以向我解释下ISE和Mircoblaze是如何结合在一起的吗?目前我已经在ISE中用VHDL编写了个程序,我希望在我的设计中添加个mircoblaze。我该怎么做以
    发表于 02-19 10:59

    labview中模糊控制和pid是怎么结合在一起

    labview中模糊控制和pid是怎么结合在一起的?求高手解答,有简单的模糊控制和pid结合在一起的vi文件最好,
    发表于 03-13 08:04

    labview 中如何把模糊控制和pid结合在一起呢?

    labview中模糊控制怎么导入?并且和pid结合在一起呢?有没有相关的VI做参考,求帮助,抱拳
    发表于 03-14 10:57

    USAT和USB BooLoad能结合在一起

    嗨,有没有可能将USAT和USB BooLoad结合在一起,以便它可以从任个电缆获得固件?谢谢
    发表于 04-24 08:39

    如何高图形性能和低功耗更好地结合在一起

    本文介绍了Silicon Motion开发的新架构如何高图形性能、低延迟、高效数据压缩和低功耗更好地结合在一起
    发表于 06-01 06:52

    Teamcenter、TIA Portal、NX MCD是如何结合在一起

    看看窗外的世界,可惜效果直很不好,因为直找不到个很好的点~今天就来谈谈Teamcenter、TIA Portal和虚拟调试能够如何结合在一起
    发表于 07-02 07:52

    Teamcenter、TIA Portal和虚拟调试如何才能结合在一起

    PDM是什么?PLM是什么?Teamcenter、TIA Portal和虚拟调试如何才能结合在一起
    发表于 09-29 07:36

    如何DMA和环形的FIFO队列结合在一起来使用呢

    如何DMA和环形的FIFO队列结合在一起来使用呢?有哪些实验步骤呢?
    发表于 12-09 08:05

    shell命令linux命令一样吗

    结合在一起,形成一个相当于面向过程的程序,即shell script,从而实现一些复杂的功能。 而Linux命令则是用来对Linux系统进行
    的头像 发表于 11-08 10:51 1369次阅读