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
原文地址:https://www.cnblogs.com/yeqifeng2288/p/14461260.html