美文网首页
Linux命令笔记二:Linux命令(二)

Linux命令笔记二:Linux命令(二)

作者: 开发者连小超 | 来源:发表于2019-11-20 10:26 被阅读0次

    一、grep和正则表达式

    1.grep

    参数

    -v:反显示
    -e:使用扩展正则表达式
    

    实例

    #输出profile文件里包含after的行
    grep after profile
    
    #输出profile文件里不包含after的行
    grep -v after profile
    

    2.正则表达式

    匹配操作符
        \                    转义字符
        .                    匹配任意单个字符
        [1249a],[^12],[a-k]  字符序列单字符占位
        ^                    行首
        $                    行尾
        \<,\>:\<abc         单词首尾边界
        |                    连接操作符
        (,)                  选择操作符
        \n                   反向引用
    
    重复操作符:
        ?       匹配0到1次。
        *       匹配0到多次。
        +       匹配1到多次。
        {n}     匹配n次。
        {n,}    匹配n到多次。
        {n,m}   匹配n到m次。
        与扩展正则表达式的区别:grep basic
        \?, \+, \{, \|, \(, and \)
        匹配任意字符
        .*
    

    实例

    #查询包含ooxx的行
    grep "ooxx" grep.txt
    
    #查询包含ooxx单词的行
    grep "\<ooxx\>" grep.txt
    
    #查询以ooxx开头的行
    grep "^ooxx" grep.txt
    
    #查询以ooxx单词开头的行
    grep "^ooxx\>" grep.txt
    
    #查询包含数字的行
    grep "[0-9]"  grep.txt
    
    #查询包含4-8的行
    grep "[4-8]"  grep.txt
    
    #查询一行规则的出现ooxx
    grep "ooxx.*ooxx"  grep.txt
    
    grep "\(oo\)\(xx\).*\1\2"  grep.txt
    \1 第一个小括号内容 \2第二个小括号内容
    

    二、文本处理命令cut、sort、wc、sed、awk

    1.cut 显示切割的行数据

    参数

    -f:选择显示的列
    -s:不显示没有分隔符的行
    -d:自定义分隔符
    

    实例

    cut -d' ' -f1 grep.txt (不能被切割的行每次都出现,加-s解决)
    cut -s -d' ' -f1 grep.txt
    cut -s -d' ' -f1,3 grep.txt
    cut -s -d' ' -f1-3 grep.txt
    

    2.sort 排序文件的行(包括数值序,字典序。默认字典序)

    参数

    -n:按数值排序
    -r:倒序
    -t:自定义分隔符
    -k:选择排序列
    -u:合并相同行
    -f:忽略大小写
    

    实例

    sort -t' ' -k2  sort.txt  #默认字典序
    sort -t' ' -k2 -n sort.txt  #-n表示按照数值序
    sort -t' ' -k2 -nr sort.txt  #-r倒序
    

    3.wc 统计行数

    wc -l sort.txt
    cat sort.txt | wc -l
    ls -l /etc/ | wc -l
    

    4.sed 行编辑器(相当于vi的末行模式拆出来)

    语法 sed [options] 'AddressCommand' file ...

    参数

    -n: 静默模式,不再默认显示模式空间中的内容
    -i: 直接修改原文件
    -e: SCRIPT -e SCRIPT:可以同时执行多个脚本
    -f: /PATH/TO/SED_SCRIPT
    -r: 表示使用扩展正则表达式
    

    行编辑器Command

    d 删除符合条件的行;
    p 显示符合条件的行;
    a \string: 在指定的行后面追加新行,内容为string
        \n:可以用于换行
    i \string: 在指定的行前面添加新行,内容为string
    r FILE: 将指定的文件的内容添加至符合条件的行处
    w FILE: 将地址指定的范围内的行另存至指定的文件中; 
    s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串
    g 行内全局替换
    i 忽略字符大小写
    s///: s###, s@@@    
         \(\), \1, \2
    

    实例

    #在第一行下面插入hello world
    sed "1a\hello world"  sort.txt  (此时源文件没有发生变化 )
    sed -i "1a\hello world"  sort.txt  (加上-i源文件就变化了)
    
    #删掉hello world
    sed -i "2d" sort.txt
    
    #删掉带数字的行
    sed -i "/[0-9]/d" sort.txt
    
    #包含数字的行打印出来,其他行不显示
    sed -n "/[0-9]/p" sort.txt
            
    #查找替换实例,扩大查找范围至精确匹配
    sed "s/id:[0-6]:initdefault/id:5:initdefault/ig" inittab
    #圈定元素
    sed "s/\(id:\)[0-6]\(:initdefault\)/\15\2/ig" inittab
    

    5.awk 一个强大的文本分析工具

    awk就是把文件逐行的读入,(空格,制表符)为默认分隔符将每行切片,切开的部分再进行各种分析处理。注意:天生对空白符敏感,空白符不用去切。

    语法 awk -F '{pattern + action}' {filenames} (注意必须是单引号)

    -支持自定义分隔符
    -支持正则表达式匹配
    -支持自定义变量,数组 a[1] a[tom] map(key)
    -支持内置变量

    ARGV               命令行参数排列
    ENVIRON            支持队列中系统环境变量的使用
    FILENAME           awk浏览的文件名
    FNR                浏览文件的记录数
    FS                 设置输入域分隔符,等价于命令行 -F选项
    NF                 浏览记录的域的个数
    NR                 已读的记录数
    OFS                输出域分隔符
    ORS                输出记录分隔符
    RS                 控制记录分隔符
    

    -支持函数 print、split、substr、sub、gsub
    -支持流程控制语句,类C语言 if、while、do/while、for、break、continue

    实例

    #只显示用户列(第一列),冒号分割
    awk  -F ':' '{print $1}'  passwd
            
    #只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,
    #而且在所有行开始前添加列名name,shell,在最后一行添加"end"
    awk  -F ':' 'BEGIN{print "name\tshell"} {print $1 "\t" $7} END{print "end"}'  passwd
            
    #搜索/etc/passwd有root关键字的所有行
    awk '/root/{print $0}' passwd  (每一行匹配root才会调用{打印}方法)
    awk '/root/{print $0} {print $0}' passwd  (此时每行匹配上了就会调2次打印)
            
    #统计/etc/passwd文件中,每行的行号,每行的列数,对应的完整行内容
    awk  -F':' '{print NR"\t"NF"\t"$0}' passwd
    
    
    文件 awk.txt
    Tom      0   2012-12-11      car     3000
    John     1   2013-01-13      bike    1000
    vivi     1   2013-01-18      car     2800
    Tom      0   2013-01-20      car     2500
    John     1   2013-01-28      bike    3500
    #0:manager,1:worker
    
    #1.合计每人1月份工资
    awk '{
      split($3,data,"-");
        if(data[2]=="01"){name[$1]+=$5}
      } 
      END{
        for(i in name){print i"\t"name[i]}
    }' awk.txt
    
    #2.合计每人1月份工资,每行带角色
    awk '{
      split($3,data,"-");
        if(data[2]=="01"){name[$1]+=$5};
        if($2=="0"){role[$1]="M"}else{role[$1]="W"}
      }END{
        for(i in name){print i"\t"name[i]"\t"role[i]}
    }' awk.txt
    

    相关文章

      网友评论

          本文标题:Linux命令笔记二:Linux命令(二)

          本文链接:https://www.haomeiwen.com/subject/uognictx.html