zoukankan      html  css  js  c++  java
  • Linux文本三剑客

    grep

    文本过滤工具.

    作用: 文本搜索工具,根据用户指定的行进行匹配检查,打印匹配到的行.

    模式: 由正则表达式字符及文本字符所编写的过滤条件.

    grep的使用

    语法:  grep [OPTIONS] PATTERN FILE....  

    选项

    选项 说明
    --color=auto 对匹配到的文本着色显示
    -v 显示不被pattern匹配到的行
    -i 忽略字符大小写
    -n 显示匹配的行号
    -c 统计匹配的行数
    -o 仅显示匹配到的字符串
    -q 静默模式,不输出任何信息
    -A # after,后@行
    -B # before,前#行
    -C # context, 前后各#行
    -e 实现多个选项间的逻辑or关系
    -w 匹配整个单词
    -E 使用扩展正则表达式,相当于egrep
    -F 相当于fgrep,不支持正则表达式

    正则表达式

    链接:http://www.yanshicheng.com/archives/redhat/linux/linux%e4%b9%8b%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f.html https://www.cnblogs.com/yanshicheng/p/12323782.html

     sed

    行编辑器,sed是一种流编辑器他一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间",接着用sed命令处理缓存区中的内容,处理完成后把缓存区中的内容送往屏幕,然后读取下一行,执行下一个循环,

    主要用于自动编辑一个或者多个文件,简化对文件的操作,编写转换程序等.

    sed的使用

    语法:  sed [OPTIONS].... 'script' inputfile....  

    常用选项

    选项 说明
    -n 不输出模式空间内容到屏幕,即为不自动打印
    -e 多点编辑
    -f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
    -r 支持使用正则表达式
    -i.bak 直接修改源文件,先备份为.bak

    地址定界

    1) 不给地址 对全文进行处理
    2) 单地址
        #: 指定的行.$为最后一行
        /pattern/: 被此处模式所能匹配的行
    3) 地址范围
        #,#:    指定从#行开始到#行结束
        #,+#    指定从#行开始在此基础相加几行
        /pat1/,/pat2/   指定从模式1到模式2
        #,/pat1/        指定几行到模式1
    4) ~ 步进
        1~2    奇数行
        2~2    偶数行编辑编辑

    编辑命令

    d: 删除模式空间匹配的行,并立即启用下一轮循环 
    p: 打印行钱模式空间的内容,追加到默认输出 
    a []text: 在指定行后面追加文件,支持使用
    实现多行追加  例:awk '/^root/a
    oot' password 
    i []text: 在行前面插入文本 
    c []text: 替换行为单行或者多行文本 
    w /path/somefile: 保存模式匹配的行值指定的文件 
    r /path/somefile: 读取指定文件的文本至模式空间中,匹配到的行后. 
    =: 为模式空间中的行打印行号 !: 模式空间中匹配行取反处理 
    s///: 查找替换,支持使用其他分隔符,s@@@,s### 
        替换标记: 
            g: 行内全局替换 
            p: 显示替换成功的行 
            w /path/to/somefile: 将替换陈宫的行保存至文件中

    进阶命令

    P:    打印模式空间开头至
    内容,并追加到默认输出之前.
    h:    把模式空间中的内容覆盖至保持空间中.
    H:    把模式空间中的内容追加至保持空间中.
    g:    把保持空间中的内容覆盖至模式空间中.
    G:    把保持空间中的内容追加至模式空间中.
    x:    把模式空间中的内容与保持空间中的内容进行互换.
    n:    读取匹配到的行的下一行覆盖至模式空间中.
    N:    读取匹配到的行的下一行追加至模式空间中.
    d:    删除模式空间中的行.
    D:    如果模式空间包含换行符,则删除知道第一个换行符的模式空间中的文本,并不会读取新的输入行,二使用和成的模式空间重新启动循环,如果模式空间不包含换行符,则会像发出d命令那样正常的新循环.

    awk

    AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

    awk使用

    awk用法:  awk OPTIONS '/模式/{print $0}' aa.txt 

    awk选项

    选项 说明
    -F 指明输入时用到的字段分隔符
    -v var=value 自定义变量

    awk操作符

    操作符 说明
    ~ 包含 例子  root~$2
    !~ 不包含
    && and
    ||
    == 等于
    != 不等于
    < <= 大于, 大于等于
    <  <= 小于, 小于等于
    --,++ 自加自减

    BEGIN&END

    语法:  awk 'BEGIN{}/模式/{操作}END{}' file 

    BEGIN: 处理之前要执行的某些操作如:打印一些字符,设置变量值.

    END: 处理之后要执行的某些操作如:打印一些字符,做最终运算.

    例子:

    awk 'BEGIN{FS="[:]";aa=1}{print $aa}' password 
    
    awk 'BEGIN{FS="[:]"}{aa+=$3}END{print "所 有的UID的和是:",aa}' password
    

      

    常见的内置变量

    选项 说明
    FS 输入字段分隔符,默认为空白符
    OFS 输出字段分隔符,默认为空白符
    NF 字段数量
    RS 输入记录分隔符,指定输入时的分隔符
    ORS 输出记录分隔符,输出时用指定符号代替换行符.
    FILENAME 当前文件名
    NR 记录号 NR==FNR 处理第一个文件 NR!=FNR 处理第二个文件
    FNR 个文件分别计数,记录号.
    ARGC 命令行参数的个数
    ARGV 数组,保存的是命令行所给定的参数.

    if-else语句

    语法:

    if(判断1){语句1}else{语句2}
    if(判断1)(语句1)else if(判断2)(语句2)else{语句3}
    awk '/模式/{if(判断语句){语句1}}'

    三目表达式

    语法: (条件?"语句1":语句2)  

    例:

    awk -F"[:]" '{if($3==0){print $1"是root"}else if($3==2){print $1"是系统用户"}else{print $1"啥也不是"}}' password 

    for循环

    语法: for (变量初始值;变量范围;变量增长幅度){命令}  

    例:

    for(i=1;i<=10;i++){}
    awk -F: '{for (i=1;i<=NF;i++){if($i==root){print $0}}}' password
    awk -F: '{for (i=1;i<=NF;i++){print $i}}' password

    While循环

    语法:  while (判断){语句} 

    例:

    awk -F: '{print "---------";i=1;while(i<=NF){print $i;i++}}' password 

    Awk控制语句

    break     只能在循环语句中使用,如果遇到break的话,那么跳出循环.
    continue  只能在循环语句中使用,如果遇到continue的话那么结束本次循环进行下次循环.
    next      可以在循环语句中和判断语句中使用,next在循环语句中功能和break类似,在判断语句中结束对本行处理二直接进入下一行处理.

    awk数组

    • 数组的下标可以是数组或者字母
    • 使用数组可以不是连续数字
    • 使用字母必须使用双引号

    数组的定义:

    a[1]="aa"
    a[2]="bb"
    a[3]="cc"

    数组的引用:  数组名[下标] 

    数组的删除:  delete 数组名[下标] 

    判断在不在数组中:  if("xx" in aa){print "ok"} 

    awk内置函数

    sub     字符替换,只能替换第一个
            使用方法: sub("old","new",目标)
            示例: awk '{sub("root","ROOT");print $0}' password 
    
    gsub    字符替换,全局替换
            使用方法: gsub("old","new",目标)
            示例: awk '{gsub("root","ROOT");print $0}' password 
    
    length  判断单词字符长度
            示例: awk -F: '{print $1,length($1)}' password
    
    substr 用来截取一段数据
           使用方法: substr("原始数字",数字,长度)
           示例: awk -F: '{print substr($1,2,2)}' password
    
    match   某种格式的字符在指定字符的第几个位置出现
            使用方法:match("原始字符",/格式/)
    	    RSTART 可以获取match所得到的那个值
    	    RLENGTH	表示的是match中满足格式的那个字符的长度
    	示例: awk -F: '{xx=match($0,//sbin.*/);print xx}' password 
    
      
    split    把指定的字符串,安好某种分隔符,分割成数组
             使用方法: split("原始字符",数组名)    如果没有指定分隔符,使用的是FS
                      split("原始字符",数组名,分隔符)
             示例: echo "" |  awk '{split ("2014-12-12",xx,"-");print xx[1]}'
    
    
    getline  读取本文件的下一行
            示例: awk -F: '{if($3==1){getline;print $0}}' password
     
    getline  变量 把本文的下一行赋值给变量
             示例: awk -F: '{if($3==1){getline gg;print gg}}' password
             : getline < file 服务file这个文件的一行赋值给 getline
    

    本章练习题

    1、显示/proc/meminfo文件中以不区分大小的s开头的行;
    
    2. 使用egrep 在/matching/gg.txt 文件中找到ab123 类词语
    
    
    3. 使用egrep 在/matching/gg.txt 提取192.168.0.1
    
    
    4. 使用sed 在/matching/gg.txt 提取192.168.0.1
    
    
    5. 使用sed 在/matching/passwd 文件删除第一行,全部root 修改为ROOT,并备份源文件
        
    7. 使用awk 找到/matching/access.log 访问IP前10的ip,并使用其他方式完成
      
    
    8. /matching/下面 vv.txt,nn.txt 按照数字合并例如:001 北京 朝阳区 法拉利 使用awk 完成
       
    
    9. 计算/matching/ling文件$3的和 不能使用-F指定分隔符,分隔符为:。
      
    10. 输出/matching/ling文件 $3如果大于1000输出此用户为系统用户,并带用户名字和UID,大于1000为普通用户,等于则打印用户名
        

    答案:

    1、显示/proc/meminfo文件中以不区分大小的s开头的行;
        grep -i ^s /proc/meminfo
    
    2. 使用egrep 在/matching/gg.txt 文件中找到ab123 类词语
    egrep -o "<[[:alpha:]]{2}[[:digit:]]{3}>" gg.txt 
    
    3. 使用egrep 在/matching/gg.txt 提取192.168.0.1
        egrep  -o "^i.*1" gg.txt | egrep  -o "[[:digit:]]{3}.[[:digit:]]{3}.[[:digit:]].[[:digit:]]"
    
    
    4. 使用sed 在/matching/gg.txt 提取192.168.0.1
        sed -rn "3s#.*:(.*) H.*#1#gp" gg.txt
    
    5. 使用sed 在/matching/passwd 文件删除第一行,全部root 修改为ROOT,并备份源文件
        sed -i.bak "1d;s#root#ROOT#g" passwd
    7. 使用awk 找到/matching/access.log 访问IP前10的ip,并使用其他方式完成
       awk '{a[$1]++}END{for(i in a){print i,a[i]}}' access.log | sort -k 2n -n | tail -10
       cut -d" " -f1 access.log | sort -rn |  uniq -cd | sort -rn | head -10
    
    8. /matching/下面 vv.txt,nn.txt 按照数字合并例如:001 北京 朝阳区 法拉利 使用awk 完成
        awk 'NR==FNR{a[$1]=$0}NR!=FNR{print a[$1],$2}' vv.txt nn.txt
    
    9. 计算/matching/ling文件$3的和 不能使用-F指定分隔符,分隔符为:。
        awk  'BEGIN{FS="[:]"}{a+=$3}END{print a}' ling
    
    10. 输出/matching/ling文件 $3如果大于1000输出此用户为系统用户,并带用户名字和UID,大于1000为普通用户,等于则打印用户名
        awk -F: '{if($3<1000){print "系统用户为:",$1,"UUID为:",$3}else if($3>1000){print "普通用户为:",$1,"UUID为:",$3}else{print "用户为:",$1}}' ling 
    

      

  • 相关阅读:
    Check the string
    最简单的
    第七届ACM程序设计竞赛 (SDIBT)
    Cutie Pie
    CSS3 :nth-of-type() 与 nth-child()选择器
    Ajax 完整教程 转载地址:http://www.cnblogs.com/Garden-blog/archive/2011/03/11/1981778.html(转)
    排序:二元选择排序
    排序:堆排序
    排序:直接插入排序 稳定 n*n
    排序:冒泡和改进
  • 原文地址:https://www.cnblogs.com/yanshicheng/p/12323997.html
Copyright © 2011-2022 走看看