• 嵌入式成长轨迹8 【嵌入式环境及基础】【Linux shell强化】【文本过滤】


    ****************************************************

    控制流结构 之前成长轨迹2已经提及,不再详叙

    不过这里有个很有趣的地方
    while read line <testfile.dat
    do
       echo $line
    done
    这个会不断读入第一行

    while read line
    do
       echo $line
    done <testfile.dat
    这个就能只读入一次,将文本内容全部输出

    猜想是一开始会先读取<之后再执行while里边的

    ****************************************************


    一、正则表达式
    1、概念
    1)、一种用来描述文本模式的特殊语法
    2)、由普通字符以及特殊字符(元字符)组成
    3)、用来匹配的字符串
    4)、文本过滤工具在某种模式下都支持正则表达式

    2、基本元字符集及其含义
    ^  只匹配行首
    $  只匹配行尾
    *  匹配0或多个此单字符
    [] 只匹配其中字符。可以是单字符或者序列。可以用-表示其中序列范围,如[1-5]表示[12345]。其中逗号将括号内要匹配的不同字符串分开
    \  只用来屏蔽一个元字符的特殊含义
    .  只匹配任意单字符
    pattern\{n\}  只用来匹配前面pattern的出现次数,次数为n
    pattern\{n,\}  含义同上。但次数最少为n
    pattern\{n,m\} 含义同上,出现次数在n到m之间

    ^.$ 匹配任意单字符
    \*\.pas 匹配以*.pas结尾的所有字符或文件

    二、find命令
    查找具有某些特征文件的命令

    find [path] [option] [-print -exec -ok]
      其中-exec格式-exec command {} \;
      -ok跟-exec类似,不过每次执行命令前都会提示用户
      -xarg exec会发起多个进程,但是xarg只有一个
    如: find ./ -perm -7 -print| xargs chmod o-w
      -name
      -perm 按照文件权限来查找文件
      -user
      -nouser
      -group
      -nogroup 查找无有效所属组的文件
      -mtime -n +n 按照文件更改时间查找,-n表示距离现在几天以内,+n表示距离现在几天以前
      -size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计
      -newer file1 !file2 查找更改时间比文件file1新但比file2旧的文件
      -type 查找某一类型的文件
      man find 查询更多关于find的资料
     
    三、grep命令
    对文本文件内容进行模式查找

    grep [选项] 基本正则表达式 [文件]
    字符串参数最好采用双括号括,一者防止被误解为shell命令,二者可以用来查找多个单词组成的字符串

    -c 只输出匹配行的计数
    -i (只适用于单字符)不区分大小写
    -h 查询多文件时不显示文件名
    -H 显示文件名
    -l 查询多文件时只输出包含匹配字符的文件名
    -n 显示匹配行和行号
    -s 不显示不存在或无匹配文本的错误信息
    -v 显示不包含匹配文本的所有行

    类  等价的正则表达式
    [[:upper:]] [A-Z]
    [[:alnum:]] [0-9a-zA-Z]
    [[:lower:]] [a-z]
    [[:space:]] 空格或tab
    [[:digit:]] [0-9]
    [[:alpha:]] [a-zA-Z]

    grep "^[^210]" file 开头既不是2、也不是1、也不是0的文件

    四、awk介绍
    可从文件或字符串中基于指定规则浏览和抽取信息,是一种自解释的编程语言。由各种操作和模式组成

    三种方式调用awk:
    1)命令行模式:
      awk[-F filed-spearator] 'command' input-files
    2)awk脚本
      所有awk命令插入一个文件,用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它
    3)awk命令插入一个单独文件
      awk -f awk-script-file input-files

    模式和动作
      模式部分决定动作语句何时触发和触发事件
      动作对数据进行处理,放在大括号内指明
    分割符、域和记录
      awk执行时,其浏览域标记为$1,$2,...,$n.这种方法称为域标识。$0为所有域
      注意执行时不要混淆符号$和shell提示符

    awk '{print $0"\t"}' score.txt
    awk 'BEGIN {print "Name    Maths\n--"}{print $1"\t"$4}END{"end-of-report"}' score.txt

    awk中的特殊元字符:+,?(匹配单个字符)
    匹配操作符:~(匹配) !~(不匹配)
    cat score.txt |awk '$0~/218.222.12.122/'
    man awk

    六、sed介绍
    一种重要的文本过滤工具,使用一行命令或者使用管道与grep与awk相结合,是非交互性文本流编辑。
    sed操作的只是一个拷贝。

    调用sed有三种方式
     使用sed的命令行格式为: sed [选项] sed命令 输入文件
     使用sed脚本文件,格式为: sed [选项] -f sed脚本文件 输入文件
     sed脚本文件 [选项] 输入文件
    如果没有指定输入文件,sed从标准输入中接受输入

    sed命令选项如下:
     -n不打印未匹配行
     -e下一命令是编辑命令
     -f调用sed脚本文件

    sed在文件中查询文本的方式
     使用行号,可以是一个简单数字,或是一个行号范围
     使用正则表达式
    x 行号
    x,y 表示行号范围从x到y
    /pattern/ 查询包含模式的行
    /pattern/pattern/查询包含两个模式的行
    pattern/,x 在给定行号上查询包含模式的行
    x,/pattern/通过行号和模式查询匹配行
    x,y!查询不包括指定行号x和y的行

    基本sed编辑命令
    p 打印匹配行
    - 显示文件行号
    a\ 在定位行号后附加新文本信息
    i\ 在定位行号后插入新文本信息
    d  删除定位行
    c\ 用新文本替换定位文本
    s 使用替换模式替换相应模式
    r 从另一个文件中读文本
    w 写文本到一个文件
    q 第一个模式匹配后退出
    l 显示与八进制ascii代码等价的控制字符
    {} 在定位行执行的命令组
    n 从另一个文件中读文本下一行,并附加在下一行
    g 将模式2粘贴到/pattern n/
    y 传送字符

    sed -n'2p' score.txt
    man sed
    info sed

    终端

    [root@localhost ~]# sed -n '2p' testfile.dat
    Name:b Emain:
    [root@localhost ~]# sed -n '1,4p' testfile.dat
    Name:a Emain:
    Name:b Emain:
    Name:c Emain:
    Name:a Emain:
    [root@localhost ~]# sed -n '/Emain/' testfile.dat
    sed:-e 表达式 #1,字符 7:missing command
    [root@localhost ~]# sed -n '/E/p' testfile.dat
    Name:a Emain:
    Name:b Emain:
    Name:c Emain:
    Name:a Emain:
    Name:b Emain:
    Name:c Emain:
    Name:a Emain:aa
    Name:b Emain:bb
    Name:c Emain:cc
    [root@localhost ~]# sed -n '7,/cc/p' testfile.dat
    Name:a Emain:aa
    Name:b Emain:bb
    Name:c Emain:cc
    [root@localhost ~]# sed -n '/^$/=' testfile
    sed:无法读取 testfile:没有那个文件或目录
    [root@localhost ~]# sed -n '/^$/=' testfile.dat
    [root@localhost ~]# sed -n '/^$/p' testfile.dat
    [root@localhost ~]# sed -n -e '/^$/p'-e'/^$/=' testfile.dat
    sed:-e 表达式 #1,字符 6:extra characters after command
    [root@localhost ~]# sed -n -e'/^$/p'-e'/^$/=' testfile.dat
    sed:-e 表达式 #1,字符 6:extra characters after command
    [root@localhost ~]# sed -n -e'/^$/p' -e'/^$/=' testfile.dat
    [root@localhost ~]# sed -n '/a/a\t' testfile.dat
    t
    t
    t
    t
    t
    t
    t
    t
    t
    [root@localhost ~]# sed -n '/Emain/a\Email' testfile.dat
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    [root@localhost ~]# cat testfile.dat
    Name:a Emain:
    Name:b Emain:
    Name:c Emain:
    Name:a Emain:
    Name:b Emain:
    Name:c Emain:
    Name:a Emain:aa
    Name:b Emain:bb
    Name:c Emain:cc
    [root@localhost ~]# sed -n '/Emain/c\Email' testfile.dat
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    [root@localhost ~]# cat testfile.dat
    Name:a Emain:
    Name:b Emain:
    Name:c Emain:
    Name:a Emain:
    Name:b Emain:
    Name:c Emain:
    Name:a Emain:aa
    Name:b Emain:bb
    Name:c Emain:cc
    [root@localhost ~]# sed -n '/Emain/i\Email' testfile.dat
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    [root@localhost ~]# cat testfile.dat
    Name:a Emain:
    Name:b Emain:
    Name:c Emain:
    Name:a Emain:
    Name:b Emain:
    Name:c Emain:
    Name:a Emain:aa
    Name:b Emain:bb
    Name:c Emain:cc
    [root@localhost ~]# sed '/Emain/i\
    > Email' testfile.dat
    Email
    Name:a Emain:
    Email
    Name:b Emain:
    Email
    Name:c Emain:
    Email
    Name:a Emain:
    Email
    Name:b Emain:
    Email
    Name:c Emain:
    Email
    Name:a Emain:aa
    Email
    Name:b Emain:bb
    Email
    Name:c Emain:cc
    [root@localhost ~]# sed '/Emain/a\
    > Email' testfile.dat
    Name:a Emain:
    Email
    Name:b Emain:
    Email
    Name:c Emain:
    Email
    Name:a Emain:
    Email
    Name:b Emain:
    Email
    Name:c Emain:
    Email
    Name:a Emain:aa
    Email
    Name:b Emain:bb
    Email
    Name:c Emain:cc
    Email
    [root@localhost ~]# sed '/Emain/c\
    > Email' testfile.dat
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    Email
    [root@localhost ~]# sed '/Emain/s\
    > Email' testfile.dat
    sed:-e 表达式 #1,字符 9:unterminated `s' command


    七、合并与分割

    1、
    sort [options] files
     许多不同的域按不同的列顺序分类
     -c 测试文件是否已经分类
     -m 合并两个分类文件
     -u 删除所有复制行
     -o 存储sort结果的输出文件名
     -t 域分隔符,用非空格、非tab键分隔域
     +n n为域号,使用此域号开始分类(这里n从0开始)
     n 指定分类按域上的数字分类
     -r 比较求逆
    man  sort

    sort -t"." +2 myfile
    sort -t"." +2n myfile

    2、
    uniq [option] files
     从一个文本文件中去除或禁止重复行
     -c 显示各行重复数
     -d 只显示有重复数据行,每种重复行只显示其中一行
     -q 打印每一重复行出现次数
     -f n n为数字,前n个域被忽略,打印不重复行
    man uniq

    3、join [option] file1 file2

    4、spilt
    将大文件分割为小文件
    一般形式:
     spilt -output_file-size input-filename output-filename
     -b n 每个分割文件的大小n(k,m)
     -C n,每个分割文件一行最多n字节
     -l n,每个分割文件的行数
     -n 同-l n

    如split -10 ls_out.txt split

    5、cut,paste

  • 相关阅读:
    C++使用thread类多线程编程
    机器学习: Viola-Jones 人脸检测算法解析(二)
    微服务:ICE 入门之 编译环境搭建
    OpenMP中的同步和互斥
    OpenMP编程的任务调度控制
    机器学习: Viola-Jones 人脸检测算法解析(一)
    并行编程OpenMP基础及简单示例
    漫话中国古代史 —— 大唐
    漫话中国古代史 —— 大唐
    也咬文嚼字
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2382469.html
Copyright © 2020-2023  润新知