iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >怎么用linux系统more基本命令的实现python源码
  • 581
分享到

怎么用linux系统more基本命令的实现python源码

2023-06-02 05:06:54 581人浏览 安东尼
摘要

本篇内容主要讲解“怎么用linux系统more基本命令的实现python源码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用linux系统more基本命令的实现Python源码”吧!实现li

本篇内容主要讲解“怎么用linux系统more基本命令的实现python源码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用linux系统more基本命令的实现Python源码”吧!

实现linux中more的基本功能,当more后加一个文件名参数时候,分屏显示按空格换页,按回车换行',在左下角显示百分比;
以处理管道参数的输入,处理选项+num:从指定行开始显示,+/string :查找字符串,从指定字符串之后开始显示

运行环境:安装有PYTHON的linux系统

调用示例:
more.py [+num ] [+/pattern] filename
command|./more.py [+num ] [+/pattern]
more.p --help 输出帮助信息
num 是 要从第几行开始显示,pattern是要在文件中查找的字符串

`#!/usr/bin/env python``# -*- coding:utf-8-*-``#文件名字:more.py``import` `os``import` `sys``import` `curses` `#用于获取终端的尺寸``import` `re` `#用于字符匹配``import` `signal` `#用于处理ctrl+c中断``import` `fcntl` `# 处理显示过程中屏幕的变化``import` `termiOS` `#获取终端信息``import` `struct``page_len` `=` `0`   `#满屏时可以显示的最大行数``line_len` `=` `0`   `#满屏时每行可以显示的最大字节数``sig_up` `=` `0`    `#中断信号标志``winsz_chg` `=` `0`   `#窗口大小改变标志``def` `win_sz_chg(signum, frame):``'''  函数功能:本函数是屏幕变化信号的处理函数'''``global` `page_len, line_len, winsz_chg``winsz_chg` `=` `1``signal.signal(signal.SIGWINCH, signal.SIG_IGN)``s` `=` `struct.pack(``"HHHH"``,` `0``,` `0``,` `0``,` `0``) ``a` `=` `struct.unpack(``'hhhh'``, fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ , s))``#获取当前窗口的大小``page_len` `=` `int``(a[``0``])` `-` `1`  `#留一行显示进度``line_len` `=` `int``(a[``1``])``signal.signal(signal.SIGWINCH, win_sz_chg)` `#不调用会导致只能检测一次屏幕变化``signal.signal(signal.SIGWINCH, win_sz_chg)` `#接收处理窗口改变信号``def` `term_do_exit(signum, frame):``'''  函数功能:键盘中断信号的响应函数'''``global` `sig_up``sig_up` `=` `1`           `#将键盘中断标志置1``os.system(``"stty -F /dev/tty echo"``)` `#恢复终端输出回车有效状态``os.system(``"stty -F /dev/tty -cbreak"``)``#重新设着屏幕为输入字符回显状态``return``signal.signal(signal.SIGINT, term_do_exit)` `#接收并处理键盘中断信号``def` `usage():``'''显示脚本的各参数的含义和调用格式'''``print` `"-----------------usage-----------------"``print` `"1./more.py [+num] [+/pattern] filename"``print` `"2 command | ./more.py"``print` `"num: Start at line number num. "``print` `"pattern:Start at line number num."``print` `"space: next page"``print` `"q :do_exit the program"``print` `"enter:next line"``print``"----------------------------------------"``sys.exit()``def` `do_exit():``'''用于系统退出 '''``os.system(``"stty -F /dev/tty echo"``)` `#恢复终端输出回车有效状态``os.system(``"stty -F /dev/tty -cbreak"``)``#重新设着屏幕为输入字符回显状态``sys.exit()``def` `is_input():``''' 检测是否有管道数据输入 '''``try``:``f` `=` `sys.stdin.fileno()` `#判断时候有管道输入``init_tty` `=` `termios.tcgetattr(f)` `#当没有管道输入,也没有参数时候,显示提示``return` `0``except``:``return` `1``def` `get_line_num(args):``''' 从命令行参数中获取开始显示的指定行``参数:args:从命令行获取的参数返回值:要开始显示的指定行  '''``line_num` `=` `1``for` `i` `in` `args:` `#匹配要从第几行开始的行数``ln` `=` `re.search(r``'\+\d+'``,` `str``(i))``if` `ln:``line_num` `=` `int``(ln.group().lstrip(``'+'``))``#采用正则表达式处理去掉‘+’,得到开始显示的行号``break``return` `line_num``def` `get_patstr(args):``'''从命令行中获取要查找的字符串``参数:args:从命令行中获取的参数为返回值:要查找的字符串:  '''``patstr` `=` `""``for` `i` `in` `args:` `#获取要匹配的字符串``pa` `=` `re.search(r``'(\+\/\w*[^\s])'``,` `str``(i))``if` `pa:``break``if` `pa:``patstr` `=` `str``(pa.group().lstrip(``'+/'``))``return` `patstr``def` `get_args():``'''用于从命令行获取参数,解析各参数``返回值:(line_num,patstr,fp):要开始显示的指定行,要查找的字符串,要操作的文件对象 '''``line_num` `=` `1``patstr` `=` `""``args` `=` `sys.argv[``1``:]``if` `not` `args:``if` `is_input():` `#在没有参数时候,判断是否为管道命令输入,不是提示正确输入参数``fp` `=` `sys.stdin``return` `(line_num, patstr, fp)``else``:``usage()``else``:``if` `args[``-``1``]` `=``=` `"--help"``:``usage()``line_num` `=` `get_l``2000``ine_num(args)``patstr` `=` `get_patstr(args)``if` `'+'` `not` `in` `args[``-``1``]:``filename` `=` `args[``-``1``]``if` `not` `os.path.exists(filename):``print` `" 没有那个文件或目录"``do_exit()``else``:``fp` `=` `open``(filename)``else``:``if` `not` `is_input():``usage()``else``:``fp` `=` `sys.stdin``return` `(line_num, patstr, fp)``def` `get_screen_size():``''' 用于获取文件显示终端的尺寸   '''``global` `page_len, line_len      ``screen` `=` `curses.initscr()      ``page_len, line_len` `=` `screen.getmaxyx()``#获取屏幕显示尺寸``page_len` `=` `page_len` `-` `2`   `#去掉输入命令那行,和最后要显示more的那一行``curses.endwin()` `#此处不结束会导致后面显示的乱码``def` `show_more(pre_pg_len):``''' 等待键盘输入命令 ,进行相应的处理。``:param pre_pg_len:屏幕改变以前保存的可显示的最大行数'''``global`  `sig_up, winsz_chg, page_len``ft` `=` `open``(``'/dev/tty'``)` `#打开标准终端输入``sys.stdout.flush()` `#刷新缓存输出,否则显示会出现问题``c` `=` `''``while` `True``:``try``:``c` `=` `ft.read(``1``)``#读取一个字符``except` `IOError:``if` `sig_up:``do_exit()` `#键盘中断退出程序``if` `c` `=``=` `" "``:``print` `"\033[20D\033[K"` `#控制光标回到more--反白字体的行首,删除此行以达到more不随文字滚动效果``if` `winsz_chg:` `#如果此时屏幕大小变化,第一次返回之前屏幕满屏行数``winsz_chg` `=` `0``return` `pre_pg_len``else``:``return` `page_len` `#当输入是空格时候,分屏显示,显示下一屏``elif` `c` `=``=` `"q"``:``print` `"\033[20D\033[K"``return` `0`          `#当输入是"q"时,退出显示``elif` `c` `=``=` `'\n'``:``print` `"\033[20D\033[K"``,``return` `1`           `#当输入是换行符时候,多显示一行``def` `skip_ln(fp, line_num):``''' 读取文件到指定开始显示的行  '''``n` `=` `line_num` `-` `1``while` `n:``fp.readline()``if` `not` `fp:``return``n` `=` `n` `-` `1``def` `search(fp, patstr):``''' 在文件中寻找要查找的字符串。``:param fp:要显示的文件对象   ``:param patstr:要查找的检索词  '''``global`  `sig_up``text` `=` `' '``while` `True``:``try``:``s` `=` `fp.read(``1``)        ``if` `not` `s:``print` `"can not find the string in the file"``do_exit()``text` `=` `text` `+` `s``if` `patstr` `in` `text:``return``except` `IOError:``if` `sig_up:``do_exit()``def` `show_prog(read_size, total_size):        ``'''  在显示屏幕的左下角显示反显的"More"``当要显示的是一个文件时,同时显示已经显示文件的百分比``当显示的是一个管道输入时,只显示“More”``:param read_size: 已经显示的文件``:param total_size:要显示的文件的总大小  '''``if` `total_size:``prog` `=` `int``(read_size` `*` `100` `/` `float``(total_size))``print`  `"\033[7m --More--"` `+` `str``(prog)` `+` `'%'` `+` `"\033[0m"``,` `#输出反白的文字“more”和显示百分数``else``:``print`  `"\033[7m --More--"` `+` `"\033[0m"``,` `#输出反白的文字“more”``return``def` `do_more(fp , line_num , patstr):``'''分屏显示文件内容``:param fp:要显示的文件对象``:param page_len: 可显示的最大行数``:param line_len:可每行可显示的最大字节数   '''``global` `page_len, line_len``read_size` `=` `0``total_size` `=` `0``os.system(``"stty -F /dev/tty cbreak"``)` `#调用linux命令设置屏幕为不等回车``os.system(``"stty -F /dev/tty -echo "``)``#设置屏幕为输入字符不回显``if` `fp !``=` `sys.stdin:``fp.seek(``0``,` `2``)` `#获取文件的总字节数,以便后来显示输出的百分比``total_size` `=` `fp.tell()``fp.seek(``0``,` `0``)``if` `line_num !``=` `1``:``skip_ln(fp, line_num)``if` `patstr:``search(fp, patstr)``try``:``line` `=` `fp.readline(line_len)``#按行读取文件,可以设置最大读取字数,当遇到“\n”时候,将"\n"读入结束。``read_size` `=` `len``(line)``num_lns` `=` `0``while` `line:``if` `num_lns` `=``=` `page_len:` `#每次输出满屏后,等待指令``pre_pg_len` `=` `page_len``show_prog(read_size, total_size)``reply` `=` `show_more(pre_pg_len)          ``if` `reply` `=``=` `0``:``break``num_lns` `-``=` `reply``print` `line.strip(``'\n'``)` `#用,来消除print 输出的换行符``sys.stdout.flush()` `#刷新缓存,否则会出现文件显示迟缓的问题``read_size` `=` `read_size` `+` `len``(line)``num_lns` `+``=` `1``line` `=` `fp.readline(line_len)``fp.close()``except` `IOError:``if` `sig_up:``do_exit()``if` `__name__` `=``=` `'__main__'``:``get_screen_size()` `#获取显示终端的尺寸``(line_num, patstr, fp)` `=` `get_args()``do_more(fp, line_num, patstr)``do_exit()`

到此,相信大家对“怎么用linux系统more基本命令的实现python源码”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么用linux系统more基本命令的实现python源码

本文链接: https://www.lsjlt.com/news/229024.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用linux系统more基本命令的实现python源码
    本篇内容主要讲解“怎么用linux系统more基本命令的实现python源码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用linux系统more基本命令的实现python源码”吧!实现li...
    99+
    2023-06-02
  • Linux系统more命令怎么使用
    这篇文章跟大家分析一下“Linux系统more命令怎么使用”。内容详细易懂,对“Linux系统more命令怎么使用”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“Linux系统mo...
    99+
    2023-06-28
  • Linux系统more 、less命令有什么用
    这篇文章给大家分享的是有关Linux系统more 、less命令有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Linux系统中more 、less命令主要用于查看文件。一、more命令more功能类似 ...
    99+
    2023-06-28
  • Linux中的more命令怎么用
    这篇文章给大家分享的是有关Linux中的more命令怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linux常用命令more命令 是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持...
    99+
    2023-06-28
  • Linux系统维护的基本命令是什么
    这篇文章将为大家详细讲解有关Linux系统维护的基本命令是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。对于大多数Linux用户来说系统运维并不需要他们关系,系统有专门的人去维护,但是关...
    99+
    2023-06-28
  • Linux的more和less命令怎么使用
    这篇文章主要介绍“Linux的more和less命令怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux的more和less命令怎么使用”文章能帮助大家解决问题。more和less命令是...
    99+
    2023-06-27
  • Linux系统中用户管理的基本命令总结
    这篇文章主要介绍“Linux系统中用户管理的基本命令总结”,在日常操作中,相信很多人在Linux系统中用户管理的基本命令总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统中用户管理的基本命令总结...
    99+
    2023-06-12
  • 如何使用Linux系统中的翻页命令more和less
    这篇文章主要讲解了“如何使用Linux系统中的翻页命令more和less”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Linux系统中的翻页命令more和less”吧!moremor...
    99+
    2023-06-12
  • CentOS系统怎么获取命令的源代码
    小编给大家分享一下CentOS系统怎么获取命令的源代码,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!以32位CentOS6.6下,获取ls命令的源代码为例,可以使...
    99+
    2023-06-10
  • linux的基本命令mkdir怎么使用
    这篇“linux的基本命令mkdir怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“linux的基本命令mkdir怎么...
    99+
    2023-07-05
  • Linux系统的基本网络命令都有什么呢
    今天就跟大家聊聊有关Linux系统的基本网络命令都有什么呢,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1. hostnamehostname 没有选项,显示主机名字hostname...
    99+
    2023-06-28
  • Linux下怎么使用more命令查看文本文件
    这篇文章主要介绍了Linux下怎么使用more命令查看文本文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux下怎么使用more命令查看文本文件文章都会有所收获,下面我们一起来看看吧。基础使用假设你现在...
    99+
    2023-06-27
  • Linux系统的cp命令怎么用
    这篇文章将为大家详细讲解有关Linux系统的cp命令怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一。一般情况下,shell会设置一个别...
    99+
    2023-06-27
  • Linux系统的du命令怎么用
    本篇内容介绍了“Linux系统的du命令怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!du和df是由一些差别的,du主要应用于对文件和...
    99+
    2023-06-28
  • Linux系统的ping命令怎么用
    这篇文章主要介绍Linux系统的ping命令怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!ping命令相信大家已经再熟悉不过了,但是能把ping的功能发挥到最大的人却并不是很多,当然我也并不是说我可以让ping...
    99+
    2023-06-27
  • Linux系统的locate命令怎么用
    这篇“Linux系统的locate命令怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux系统的locate命令怎...
    99+
    2023-06-28
  • Linux系统的awk命令怎么用
    这篇文章主要介绍“Linux系统的awk命令怎么用”,在日常操作中,相信很多人在Linux系统的awk命令怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux系统的awk命令怎么用”的疑惑有所帮助!...
    99+
    2023-06-28
  • linux系统的size命令怎么用
    这期内容当中小编将会给大家带来有关linux系统的size命令怎么用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.命令简介size 用于查看目标文件、库或可执行文件中各段及其总和的大小,是 GNU 二...
    99+
    2023-06-28
  • Linux系统的seinfo命令怎么用
    这篇文章给大家分享的是有关Linux系统的seinfo命令怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。seinfo命令是用来查询SELinux的策略提供多少相关规则,一个主体进程能否读取到目标文件资源的重...
    99+
    2023-06-28
  • Linux系统的find命令怎么用
    这篇文章主要为大家展示了“Linux系统的find命令怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux系统的find命令怎么用”这篇文章吧。find 命令用来在指定目录下查找文件。...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作