一、Sed介绍

Sed是流编辑器,用来处理文件的。Sed是一行一行读取文件内容(先将其保存在一个临时缓冲区中)并按照要求进行处理,把处理后的结果输出到屏幕。用来自动编辑一个或者多个文件,简化文件的反复操作,并可以进行相应的转换和过滤等。
教程:http://c.biancheng.net/view/4028.html

二、Sed使用方法

语法: sed [option] ‘处理动作’ 文件名
常用选项:

  • -e:进行多项编辑
  • -n:取消默认输出,如果不取消每一行都会输出
  • -r:使用扩展正则表达式
  • -i:原地编辑(修改源文件)
  • -f:指定sed脚本的文件名

常见处理动作(定位+动作):

  • ‘p’:打印
  • ‘i’:在指定行之前插入内容
  • ‘a’:在指定行之后插入内容
  • ‘c’:替换指定行所有内容
  • ‘d’:删除指定行
  • ‘s’:搜索
  • ‘r’:从另外文件中读取内容
  • ‘w’:内容另存为

三、sed使用Demo

  1. 1、打印
  2. sed '' a.txt #对文件什么都不做
  3. sed -n 'p' a.txt #打印每一行,并取消默认输出
  4. sed -n '1p' a.txt #打印第一行
  5. sed -n '1,5p' a.txt #打印第一到第五行
  6. sed -n '$p' a.txt #打印最后一行
  7. sed -n '2p;3p' a.txt #同时打印第二,第三行
  8. 2、编辑
  9. sed -n '2ihello' a.txt #在第二行前面添加字符hello(hello是插入在第一行和第二行之间)
  10. sed -n '3ahello' a.txt #在第三行之后添加字符hello(hello是插入在第三行和第四行之间)
  11. 3、替换
  12. sed '$chello' a.txt #替换最后一行的内容为hello,原来的内容被替换了
  13. sed -n '/^adm/croot' a.txt #把每一行以adm开头的整行内容替换成root
  14. sed '1,5chello' a.txt #把1到5行的内容(当作一行)全部变成hello
  15. 4、删除
  16. sed '4d' a.txt #删除第四行的数据
  17. sed '1,4d' a.txt #删除第一到第四行的数据
  18. sed -n '/^adm/d' a.txt #删除以adm开头的数据
  19. 5、对文件进行搜索替换操作
  20. sed 选项 's/搜索的内容/替换的内容/动作' 处理的文件名
  21. 其中:s表示search搜索,/表示分隔符,动作一般是打印p和全局替换g
  22. sed -n 's/root/ROOT/p' a.txt #替换每一行第一个匹配到的root为ROOT,并打印
  23. sed -n 's/c/hi/gp' a.txt #替换每一行第所有匹配到的root为ROOT
  24. sed -n 's/c/hi/2p' a.txt #替换每一行第第二个匹配到的root为ROOT
  25. sed -n 's/^#//gp' a.txt #替换每一行的首个#符合为空
  26. sed -n '1,5s/^/#/gp' a.txt #给第一到第五行的行首新增#符号
  27. 6、读写
  28. sed '3r /etc/hosts' b.txt #从b.txt中读取文件内容,再加上/etc/hosts 的内容合并在一起
  29. sed.exe '1,2w c.txt' b.txt #从b.txt读取1,2行的数据写入到c.txt中

四、awk介绍

awk是一种编程语言,用于对文本和数据的处理。
awk是逐行扫描文件的,默认从第一行到最后一行,寻找特定模式的行,并进行操作。
支持条件判断,支持for、while循环。

五、awk使用方式

语法:awk [选项] ‘命令部分’ 文件名
注意:引用shell变量需要使用双引号括起来
常用选项:

  • -F:定义字段分割符号,默认是空格
  • -v:定义变量并复制

命令部分说明:

  • 正则表达式,地址定位
    • ‘/root/{awk 语句}’ 相当于sed中的:’/root/p’
    • ‘NR==1,NR==5{awk 语句}’ 相当于sed中的:’1,5p’
    • ‘/^root/,/^ftp/{awk 语句}’ 相当于sed中的:’/^root/,/^ftp/p’
  • {awk 语句1;awk 语句2;….}
    • ‘{print $0,print $1}’ 相当于sed中的:’p’
    • ‘NR==5{print $0}’ 相当于sed中的:’5p’
    • 注意:awk语句中间使用分号间隔
  • BEGIN…END…
    • ‘BEGIN{awk 语句}’;{处理中};END{awk 语句}’
    • ‘BEGIN{awk 语句}’;{处理中}’
    • ‘{处理中};END{awk 语句}’

脚本模式:

  1. #!/bin/awk -f
  2. #一下是awk引号里的命令清单,不要用引号保护命令,多个命令之间使用分号间隔
  3. BEGIN{FS=":"}
  4. NR=1 NR=3{print $1"\t"$NF}
  5. ...
  6. ##执行,方法1:awk 选项 -f awk.sh的脚本文件 要处理的文件
  7. ##执行,方法2:./awk.sh fileName

awk内部变量:

  • $0:当前处理行的所有记录
  • $1,$2…$n:文件中每行以间隔符分割的不同字段值
  • NF:当前记录的字段数(列数)
  • $NF:最后一列,$(NF-1)表示倒数第二列
  • FNR/NR:行号
  • FS:定义间隔符,如’BEGIN{FS=”:”};{print $1,$3}’
  • OFS:定义输出字段分隔符,默认空格,如’BEGIN{OFS=”\t”};{print $1,$3}’
  • RS:输入记录分隔符,默认换行
  • ORS:输出记录分隔符,默认换行符

六、awk使用demo

  1. 1、打印a.txt所有内容,按照空格分割:awk -F ' ' '{print $0}' a.txt
  2. 2、打印第三行:awk -F ' ' 'NR==3{print $0}' a.txt
  3. 3、打印从第三行开始的连续两行:awk -F ' ' 'NR==3,NR==2{print $0}' a.txt
  4. 4、搜索打印以c开头的行:awk '/^c/{print $0}' a.txt
  5. 5、定义输出分隔符:awk -F ' ' 'BEGIN{OFS=","};{print $1,$NF}' a.txt
  6. 或者使用双引号连接输出内容:awk -F ' ' '{print $1","$NF}' a.txt