zoukankan      html  css  js  c++  java
  • shell 高级操作

    shell 高级操作

    shell 文件增删改查

    sed

    sed 是linux中提供的一个外部命令,它是一个行(流)编辑器,非交互式的文件内容进行增删改查的操作,
    使用者只能在命令行输入编辑命令、指定文本名,然后再屏幕上查看输出。
    区别:
        文本编辑器:编辑对象是文本
        行编辑器:编辑对象是文件中的行
    

    sed原理

    数据在缓存中处理,然后输出到屏幕,不会修改源文件。
    

    sed 命令

    sed [options] '{command}[flags]' [filename]
    [] 可选的
    {} 必须的
    

    options --对sed命令的补充

    -e script 将脚本中指定的命令添加到处理输入时执行的命令中 多条件,一行中要有多个操作
        比如:sed -e 's/brow/green/;s/dog/cat/' data.txt
            ->  第一个指令;第二个指令
    -f script 将文本中指定的命令添加到输入时的命令中
        将命令以换行的方式写入一个文件里面,然后直接使用该文件中的指令,如-e的改为file 
            s/brow/green/
            s/dog/cat/
    -n 抑制自动输出
    -i 编辑文件内容
    -i.bak 修改时同时创建.bak备份文件
    -r 使用扩展的正则表达式
    ! 取反 (跟在模式条件后与shell有所区别)
    

    示例

        sed 'ahello world' advance.txt 
        sed '/hj/ahello world' advance
            /hj/ 表示匹配模式,匹配后在后面插入hello world
        sed -r '/正则表达式/命令/命令的参数' 文件
        sed '3,4chello world' advance 将3,4行更改为hello world
        sed '1,3y/abc/ABC/' advance
    

    command

    a 在匹配后面添加
    i 在匹配前面添加
    p 打印
    d 删除
    s 查找替换
    c 更改
    y 转换 N D P,
    

    flags 对命令的补充

    数字:   表示新文本替换的模式
    g:      表示用新文本替换现有文本的全部实例
                sed 'g/dog/cat/p' data.txt
    p:      表示打印原始内容
    w filename  将替换结果写入文件中
    

    技巧

    sed -n '$=' filename 统计文件行号
    sed -n -r '/[wW]*?(bash)/p' filename.sh 正则
    

    shell对输出流的处理 awk

    从输出流中,把我们的数据找出来,并且对这些数据进行处理,awk默认设计时是一门语言
    awk是一种可以处理数据、产生格式化报表的语言,功能十分强大。awk认为文件中的每一行是一条记录,记录与记录的分隔符为换行符,每一列是一个字段,字段与字段的分隔符默认是一个或多个空格或tab制表符。
    awk的工作方式是读取数据,将每一行数据视为一条记录,每条记录以字段分隔符分成若干字段,然后输出各个字段的值。
    head -3 /proc/meminfo
    AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
        之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
    

    awk语法

    awk [options] [BEGIN]{program}[END] [file]
    

    options

    -F fs 指定描绘一行中的数据字段的文件分割,默认为空格
    -f file 指定读取程序的文件名
    -v var=value 指定awk程序中使用的变量和默认值
    注意:awk 程序脚本由左大括号和右大括号定义。脚本命令必须放置在大括号之间。
    
    awk程序运行优先级是:
    1.BENGIN 在开始处理数据流之前执行,可选项
    2.program 如何处理数据流,必选项
    3.END   处理完数据流后执行,可选项
    

    awk基本用法--awk数据提取功能

    $0  表示整行文本
    $1  表示文本行中的第一个数据字段
    $2  表示文本行中的第二个数据字段
    $N  表促成文本中的第N个数据字段
    $NF 表示文本行中的最后一个数据字段
    
        # 打印第1行
        awk '{print $1}'  data.txt
    
        # 打印第3行全行
        awk 'NR==3{print $0}'  data.txt
    
        # 以.为分隔符并打印第二列
        awk -F "." 'NR==1{print $2}' data.txt
        
        # 以.变为分隔符,并且将.变为:号显示
        awk -F "." 'NR==1{print $1 ":" $2}' data.txt
        awk -F ":" 'NR==1{print "URSER:" $1 " PATH:" $6}' /etc/passwd
    

    awk高级用法

    BEGIN 处理数据流之前做什么
    program 处理数据流做什么
    END 处理之后做什么
    
        # 下面是开始和结束时命令,都写在一个''中
        awk 'BEGIN{print "Hello World"}END{print "Exit"}' data.txt
    

    特性

    awk是一门语言,可以定于变量,定义数组,进行运算,流程控制等
    

    定义变量

        # t=$2 表示定义变量t
        head -2 /proc/meminfo | awk 'NR==1{t=$2}NR==2{f=$2;print (1-(t-(t-f))/t)*100 "%"}'
    
        # 定义数组
        awk  'BEGIN{array[1]="year";array[2]="2021";print array[1] ":" array[2]}'
    

    awk 运算

        echo 5|awk '$1==5{print "true"}'
        echo 5|awk '$1==5{print 1+1}'
        echo 5 5|awk '$1==$2{print "true"}'
    

    awk 环境变量

    FIELDWIDTHS 以空格分隔的数字列表,用空格定义每个数据字段的精确宽度
    FS 输入字段分隔符号
    OFS 输出字段分隔符号
    RS 输入记录分隔符号
    ORS 输出记录分割符号

        # BEGIN中设置分隔符为:,输出分隔符为:,输出3列,每列两个字符,$1默认为每个分隔符的值
        awk 'BEGIN{FS=":";OFS="-";FIELDWIDTHS="2 2 2"}NR==1{print $1,$2,$3}' /etc/passwd
    ro ot :x
    

    awk 流程控制

        echo ddd|awk '{if($1>5)print $0}'
    
        echo dd|awk -v 'sum=0' '{sum+=$1}END{print sum}'
    
        # 每统计后,输出结果 for
        awk '{sum=0;for (i=1;i<4;i++){sum+=$i}print sum}' number.txt
        # while
        awk '{sum=0;i=1;while(i<4){sum+=$i;i++;print $i}print sum}' number.txt
    

    awk 技巧

        # 打印行号
        awk `END{print NR}` filename 
    
        # 打印文本最后一行的内容
        awk 'END{print $0}' filename
    
        # 打印文本列数
        awk 'END{print NF}' filename
    
  • 相关阅读:
    mvc与springmvc
    mybatis一级与二级缓存详解
    resultType和resultMap的使用场景
    mybatis第一天学习总结
    linux常用命令(不断更新)
    SSH基本框架搭建的详细过程
    hibernate多条件组合查询的两种方式
    AJAX验证用户名是否被注册
    Vimrc
    关于window.open在不同浏览器的不同点
  • 原文地址:https://www.cnblogs.com/yeqifeng2288/p/14461260.html
Copyright © 2011-2022 走看看