Linux 常用文本操作

cat 连接文件,打印到标准输出设备上

语法介绍

cat [OPTION]... [FILE]...
-A --show-all 等价于-vET
-b 显示编号去除空行
-n 显示编号包括空行
-E 显示行结束符
-s 连续的多行空白,显示一行
-T 显示tab
-v 使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。

使用场景:

显示行号

[root@localhost ~]# cat -n anaconda-ks.cfg

连接查看

[root@localhost ~]# cat -n anaconda-ks.cfg /etc/hosts

合并文件

[root@localhost ~]# cat t1 t2 > t3

重定向文本输入

[root@localhost ~]# cat << EOF
hello world
EOF
hello world

重定向文件输入

[root@localhost ~]# cat < anaconda-ks.cfg


more

按百分比显示文件,有过滤,搜索功能,对于大文件比cat更方便阅读

参数:

-num 一次显示的行数
-d 提示使用者,在画面下方显示 [Press space to continue, 'q' to quit.] ,如果使用者按错键,则会显示 [Press 'h' for instructions.] 而不是 '哔' 声
-l 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能
-f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
-p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容
-c 跟 -p 相似,不同的是先显示内容再清除其他旧资料
-s 当遇到有连续两行以上的空白行,就代换为一行的空白行
-u 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同)
+/pattern 在每个文档显示前搜寻该字串(pattern),然后从该字串之后开始显示
+num 从第 num 行开始显示
fileNames 欲显示内容的文档,可为复数个数

操作命令:

Enter 向下n行,需要定义。默认为1行
Ctrl+F 向下滚动一屏
空格键 向下滚动一屏
Ctrl+B 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号
V 调用vi编辑器
!命令 调用Shell,并执行命令
/keyword 搜索关键字
q 退出more

常用操作:

[root@localhost ~]# more -s -20 anaconda-ks.cfg


less

比more更加灵活,鼠标可以往前往后滚动,随意浏览,还是懒加载,参数用法跟more类似

常用操作:

[root@localhost ~]# less -s -20 anaconda-ks.cfg


head

查看文件前几行

[root@localhost ~]# head -2 anaconda-ks.cfg


tail

查看文件末尾几行,还有监控文件功能

参数:

-n 显示行数
-f 监控文件

常用操作

[root@localhost ~]# tail -2 anaconda-ks.cfg
[root@localhost ~]# tail -f anaconda-ks.cfg


基于python实现 tail查看文件末尾几行功能

def read_last_lines(filename,lastlines=1):

    f = open(filename, 'rb')
    first_line_data,first_tell = f.readline(),f.tell()
    f.seek(0)
    seek = 0

    #第一层循环判断是否为空文件
    for i in f:
        while True:
            f.seek(seek,2)
            current_tell = f.tell()
            seek -= 1
            data = f.readlines()

            if(first_tell == current_tell and not data):
                f.close()
                return  '1',[first_line_data]
            elif(first_tell == current_tell and data):
                if(len(data)<lastlines):
                    data.insert(0,first_line_data)
                f.close()
                return  '2',data
            else:
                if(lastlines != 1):
                    if(len(data) == lastlines):
                        return  '3',data
                else:
                    if (len(data) == 1):
                        if (first_tell == f.tell()):
                            f.close()
                            return '4', data[-1:]

                    if (len(data) > 1):
                        f.close()
                        return  '5', data[-1:]

data = read_last_lines('test2.txt',lastlines=10)
print(data)

grep

讲grep之前,先来说说正则
grep的正则分为基本正则表达式和扩展正则表达式,主要区别在于扩展正则表示结构更清晰已读,去除很多转义符号
以下解释下扩展正则表达式元字符:

  • 字符匹配:
    • . :匹配任意单个字符;
    • []:匹配指定范围内的任意单个字符;
    • [^]:匹配指定范围外的任意单个字符;[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
  • 匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作于贪婪模式;
    • *:匹配其前面的字符任意次;0,1,多次;
    • .*:匹配任意长度的任意字符
    • ?:0次或1次,其前的字符是可有可无的;
    • +:其前字符至少1次;
    • {m}:其前的字符m次;
    • {m,n}:至少m次,至多n次;
  • 位置锚定:
    • ^:行首锚定;
    • $:行尾锚定;
    • \<, \b:词首锚定;
    • \>, \b:词尾锚定;
  • 分组及引用:
    • ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;后向引用:\1, \2, ...

grep 常用选项说明

--color=auto:对匹配到的文本着色后高亮显示;
-i:ignorecase,忽略字符的大小写;
-o:仅显示匹配到的字符串本身;
-v, --invert-match:显示不能被模式匹配到的行;
-E:支持使用扩展的正则表达式元字符;
-q, --quiet, --silent:静默模式,即不输出任何信息;
-A #:after, 后#行
-B #:before,前#行
-C #:context,前后各#行

ifconfig命令结果中的IP地址

[root@localhost ~]# ifconfig |egrep -o 'inet [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|egrep -o '[^a-z ].*'
192.168.1.102
127.0.0.1

python用正则实现算数运算

import re

def mpy_or_div(list_data):
    '''
    :param list_data: [1*2/3]
    :return:  number
    '''
    result = 0
    for key, val in enumerate(list_data):
        if key == 0:
            result = float(val)
        else:
            if key % 2 == 1:
                if val == '*':
                    result = result * float(list_data[key + 1])
                else:
                    result = result / float(list_data[key + 1])
    return result

def minus(list_data):
    '''
    减法
    :param list_data:
    :return: number
    '''
    res = 0
    for key, val in enumerate(list_data):
        if key == 0:
            res = float(val)
        else:
            res = res - float(val)
    return res

def addition(list_data):
    '''
    加法
    :param list_data:
    :return: number
    '''
    res = 0
    for key, val in enumerate(list_data):
        if key == 0:
            res = float(val)
        else:
            res = res + float(val)
    return res

def cacl_list(data):
    '''
    1.找减法  (减法里面在算乘除)
    2.找加法
    :param data:
    :return: number
    '''
    data = data.strip('()').split('+')

    for key,val in enumerate(data):
        #有减法
        if re.search('-',val) :
            tmp = list(filter(lambda x:x,re.split('-', val)))

            for key_sub,val_sub in enumerate(tmp):
                if val_sub.endswith('*') or val_sub.endswith('/'):
                    tmp[key_sub] = tmp[key_sub]+'-'+tmp[key_sub+1]
                    del tmp[key_sub+1]

            for key_sub, val_sub in enumerate(tmp): 
                if re.search('([/*])', val_sub) :
                    tmp[key_sub] =mpy_or_div(re.split('([/*])', val_sub))

            data[key] = minus(tmp)

        #有乘除
        elif re.search('\/',val) or re.search('\*',val):
            data[key] = mpy_or_div(re.split('([/*])', val))

    #
    return  str(addition(map(lambda x:float(x), data)))

def cacl(data):
    data = re.sub(r'\s', '', data)
    data = re.sub('\*\+', '*', data)
    priority = re.search("\([^()]*\)", data)

    if priority :
        priority_data = cacl_list(priority.group())
        data = re.sub('\([^()]*\)',priority_data, data,1)
        print(data)
        cacl(data)
    else:
        data =  cacl_list(data)
        print(data)

if __name__ == '__main__':
    cacl("1 - 2 * ( (60-30 +(9+2-2*5/-3 + 6 /3*2/4*2 +10 * 8/2-9 ) * (40/5)) - (4*3)/ (16-3*4) )")
    print(eval('1 - 2 * ( (60-30 +(9+2-2*5/-3 + 6 /3*2/4*2 +10 * 8/2-9 ) * (40/5)) - (4*3)/ (16-3*4) )'))

未完待续....

转载于:https://blog.51cto.com/marvin89/2104946

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值