zoukankan      html  css  js  c++  java
  • shell高级-----初识sed和gawk

    sed编辑器

    sed说明

    sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。

    替换选项

    使用s命令可以实现替换的作用。S命令会用斜线间指定的第二个文本字符串来替换第一个文本字符串模式;

    echo "this is a test" | sed 's/test/try/'  
    

    如果要同时替换多个,sed -e 中间用分号;隔开即可

    1、替换标记

    默认情况下,只会替换一行中的第一处。要想替换一行中不同地方出现的文件必须使用替换标记。

    s/pattern/replacement/flags

    有四种可用的替换标志:

    • 数字:表明新文件将替换第几处模式匹配的地方,比如2,替换每行中第二次出现的文本
    • g :表明新文件将会替换所有匹配的文本
    • p : 打印出匹配的内容 ,通常与sed的-n一起使用
    • w file :将替换的结果写入到文件中
    [root@node3 ljy]# more ceshi.sh                  
    this is one,one,one
    [root@node3 ljy]# sed -i 's/one/two/2 ' ceshi.sh                                         
    [root@node3 ljy]# more ceshi.sh                  
    this is one,two,one
    [root@node3 ljy]# sed -i 's/one/two/g ' ceshi.sh  
    [root@node3 ljy]# more ceshi.sh                  
    this is two,two,two
    

    -n选项是禁止sed编辑器输出,-p会输出修改过的行。这二者配合使用的效果就是只输出被替换命令修改过的行。

    2、替换字符

    替换文件中的特殊字符会比较麻烦,比如你要替换路径符号/

    sed允许其他字符来替换命令中的字符串分隔符。

    echo "/ljy/ceshi" | sed 's!/ljy/ceshi!/ljy/test!'
    

     注意末尾的替换符。

    使用地址

    如果想要命令作用于特定的行或某些行,则必须使用行寻址。

    1、以数字方式行寻址

    在命令中指定的地址可以是单个行号,或者用起始行号,逗号以及结尾行号指定一定区间。

    [root@node1 ljy]# sed '2s/cat/dog/' cat
    this is a cat
    this is a dog
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    [root@node1 ljy]# sed '2,3s/cat/dog/' cat
    this is a cat
    this is a dog
    this is a dog
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    [root@node1 ljy]# sed '2,$s/cat/dog/' cat  
    this is a cat
    this is a dog
    this is a dog
    this is a dog
    this is a dog
    this is a dog
    this is a dog
    this is a dog
    

    2、使用文本模式过滤器

    sed编辑器允许指定文本模式来过滤出命令要做用的行。

    [root@node1 ljy]# more cat 
    there is a cat
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    [root@node1 ljy]# sed '/there/s/cat/dog/' cat 
    there is a dog
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    this is a cat
    

    3、组合命令

    [root@node1 ljy]# sed '2,${
    > s/cat/dog/
    > s/this/there/
    > }' cat
    there is a cat
    there is a dog
    there is a dog
    there is a dog
    there is a dog
    there is a dog
    there is a dog
    there is a dog
    

    可以用花括号将多条命令组合在一起使用。

    删除行

    删除命令d

    [root@node1 ljy]# sed '4d' num
    this is 1
    this is 2
    this is 3
    this is 5
    [root@node1 ljy]# sed '3,$d' num 
    this is 1
    this is 2
    [root@node1 ljy]# sed '/this/d' num
    

    插入和附加文本

    插入命令i会在指定行前增加一个新行

    附加命令a会在指定行后增加一个新行。

    [root@node1 ljy]# sed '2i	his is a test' num 
    this is 1
    this is a test
    this is 2
    this is 3
    [root@node1 ljy]# sed '2a	his is a test' num  
    this is 1
    this is 2
    this is a test
    this is 3
    [root@node1 ljy]# sed '$a	his is a test' num 
    this is 1
    this is 2
    this is 3
    this is a test
    

    修改行

    修改命令允许修改数据流中整行文本的内容。

    [root@node1 ljy]# sed '3c	his is a test' num 
    this is 1
    this is 2
    this is a test
    [root@node1 ljy]# sed '/this is 3/c	his is a test' num    #文本模式也可以
    this is 1
    this is 2
    this is a test
    

    转换命令

    转换命令(y)是唯一可以处理单个字符的sed编辑器命令。

    [root@node1 ljy]# sed 'y/2/9/' num    
    this is 1
    this is 9
    this is 3
    

    回顾打印

    p命令用来打印文本行

    =命令用来打印行号

    l命令用来列出行

    [root@node1 ljy]# sed -n '/is 2/p' num 
    this is 2
    [root@node1 ljy]# sed '=' num            
    1
    this is 1
    2
    this is 2
    3
    this is 3
    [root@node1 ljy]# sed 'l' num  
    this is 1$
    this is 1
    this is 2$
    this is 2
    this is 3$
    this is 3
    

    使用sed处理文件

    1、写入文件

    w命令用来向文件写入行

    [root@node1 ljy]# sed '1,2w ceshi' num 
    this is 1
    this is 2
    this is 3
    [root@node1 ljy]# more ceshi 
    this is 1
    this is 2
    

    把num的前两行写入到了ceshi文件中

    2、从文件读取数据

    读取命令r允许你将一个独立文件中的数据插入到另一个数据流中。

    [root@node1 ljy]# more ceshi1
    this is a
    this is b
    [root@node1 ljy]# more ceshi2
    hello
    hi
    [root@node1 ljy]# sed '2r ceshi1' ceshi2
    hello
    hi
    this is a
    this is b
    

    gawk程序

    gawk提供了一种编程语言而不只是编程命令。

    1、命令格式

    gawk options program file*
    

    options的可用选项有:

     -F fs 指定行中分隔数据字段的字段分隔符。个人不建议使用这个选项,在BEGIN块中设置FS更好。这个选项只是提供了一个简洁的设置方式。
     -f file:指定读取程序的文件名
     -v var=value 定义gawk程序中的一个变量及其默认值。个人不建议使用这个选项,在BEGIN块中设置更好。
     -mf N 指定要处理的数据文件中的最大字段数
     -mr N 指定数据文件中的最大数据行数
     -W keyword 指定gawk的兼容模式或警告等级
    

    2、从命令行读取脚本

    [root@node1 ~]# awk '{print "hello"}'
    asd
    hello
    adf
    hello
    asd
    hello
    qqq
    hello
    [root@n
    

    要终止这个gawk程序,你必须表明数据流已经结束,

    ctrl+D组合键可以在bash中产生一个EOF字符。

    3、使用数据字段变量

    默认情况下,gawk会将如下变量分配给它在文本中发现的数据字段:

    $0  代表整个文本行
    $1  代表文本行的第一个数据段
    $n  代表文本行的第n个数据段
    $NF  代表文本行的最后一个数据段
    

    gwak中默认的字段分隔符书任意的空白字符。

    [root@node1 ~]# df -h | gawk '{print $5}'
    已用%
    5%
    0%
    0%
    1%
    0%
    14%
    0%
    [root@node1 ~]# df -h | gawk '{print $NF}'
    挂载点
    /
    /dev
    /dev/shm
    /run
    /sys/fs/cgroup
    /boot
    /run/user/0
    [root@node1 ~]# df -h | gawk '{print $0}' 
    文件系统                 容量  已用  可用 已用% 挂载点
    /dev/mapper/centos-root   42G  2.1G   40G    5% /
    devtmpfs                 908M     0  908M    0% /dev
    tmpfs                    920M     0  920M    0% /dev/shm
    tmpfs                    920M  8.8M  911M    1% /run
    tmpfs                    920M     0  920M    0% /sys/fs/cgroup
    /dev/sda1               1014M  142M  873M   14% /boot
    tmpfs                    184M     0  184M    0% /run/user/0
    

    4、在程序脚本中使用多个命令

    [root@node1 ~]# echo 'this is sam' | gawk '{$4="lisi";print $0}'  
    this is sam lisi
    

    5、从文件中读取程序

    gawk编辑器允许将程序存储到文件中,然后在命令行中引用。

    [root@node1 ljy]# more script.gawk 
    {print $1 "'s home directory is " $6}
    [root@node1 ljy]# gawk -F: -f script.gawk /etc/passwd
    root's home directory is /root
    bin's home directory is /bin
    daemon's home directory is /sbin
    adm's home directory is /var/adm
    lp's home directory is /var/spool/lpd
    sync's home directory is /sbin
    shutdown's home directory is /sbin
    halt's home directory is /sbin
    mail's home directory is /var/spool/mail
    operator's home directory is /root
    games's home directory is /usr/games
    ftp's home directory is /var/ftp
    nobody's home directory is /
    systemd-network's home directory is /
    dbus's home directory is /
    polkitd's home directory is /
    sshd's home directory is /var/empty/sshd
    postfix's home directory is /var/spool/postfix
    chrony's home directory is /var/lib/chrony
    mysql's home directory is /var/lib/mysql
    dockerroot's home directory is /var/lib/docker
    ljy's home directory is /home/ljy
    
  • 相关阅读:
    MYSQL利用merge存储引擎来实现分表
    IoC原理及实现
    prometheus + grafana安装部署(centos6.8)
    PHP Laravel定时任务Schedule
    排序算法杂谈(三) —— 归并排序的非递归实现
    排序算法杂谈(二) —— 冒泡排序的递归实现
    排序算法杂谈(一) —— 量化数组的有序程度
    排序算法(七) —— 快速排序
    排序算法(六) —— 归并排序
    排序算法(五) —— 堆排序
  • 原文地址:https://www.cnblogs.com/jinyuanliu/p/10916516.html
Copyright © 2011-2022 走看看